15073402289471575a1bab5d43c9f3709a12148f3Jason Sams/*
25073402289471575a1bab5d43c9f3709a12148f3Jason Sams * Copyright (C) 2012 The Android Open Source Project
35073402289471575a1bab5d43c9f3709a12148f3Jason Sams *
45073402289471575a1bab5d43c9f3709a12148f3Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
55073402289471575a1bab5d43c9f3709a12148f3Jason Sams * you may not use this file except in compliance with the License.
65073402289471575a1bab5d43c9f3709a12148f3Jason Sams * You may obtain a copy of the License at
75073402289471575a1bab5d43c9f3709a12148f3Jason Sams *
85073402289471575a1bab5d43c9f3709a12148f3Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
95073402289471575a1bab5d43c9f3709a12148f3Jason Sams *
105073402289471575a1bab5d43c9f3709a12148f3Jason Sams * Unless required by applicable law or agreed to in writing, software
115073402289471575a1bab5d43c9f3709a12148f3Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
125073402289471575a1bab5d43c9f3709a12148f3Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135073402289471575a1bab5d43c9f3709a12148f3Jason Sams * See the License for the specific language governing permissions and
145073402289471575a1bab5d43c9f3709a12148f3Jason Sams * limitations under the License.
155073402289471575a1bab5d43c9f3709a12148f3Jason Sams */
165073402289471575a1bab5d43c9f3709a12148f3Jason Sams
175073402289471575a1bab5d43c9f3709a12148f3Jason Samspackage com.android.rs.imagejb;
185073402289471575a1bab5d43c9f3709a12148f3Jason Sams
195073402289471575a1bab5d43c9f3709a12148f3Jason Samsimport android.app.Activity;
205073402289471575a1bab5d43c9f3709a12148f3Jason Samsimport android.view.View;
215073402289471575a1bab5d43c9f3709a12148f3Jason Samsimport android.util.Log;
225073402289471575a1bab5d43c9f3709a12148f3Jason Sams
235073402289471575a1bab5d43c9f3709a12148f3Jason Samspublic class IPTestListJB {
245073402289471575a1bab5d43c9f3709a12148f3Jason Sams    private final String TAG = "Img";
255073402289471575a1bab5d43c9f3709a12148f3Jason Sams    public final String RESULT_FILE = "image_processing_result.csv";
265073402289471575a1bab5d43c9f3709a12148f3Jason Sams
2731f4588d26e258c61543e90e796c4c9a8c2a1482Jason Sams    public static final int FULL_FP = 0;
2831f4588d26e258c61543e90e796c4c9a8c2a1482Jason Sams    public static final int RELAXED_FP = 1;
2931f4588d26e258c61543e90e796c4c9a8c2a1482Jason Sams    public static final int INTRINSIC = 2;
3031f4588d26e258c61543e90e796c4c9a8c2a1482Jason Sams
315073402289471575a1bab5d43c9f3709a12148f3Jason Sams    /**
325073402289471575a1bab5d43c9f3709a12148f3Jason Sams     * Define enum type for test names
335073402289471575a1bab5d43c9f3709a12148f3Jason Sams     */
345073402289471575a1bab5d43c9f3709a12148f3Jason Sams    public enum TestName {
35fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        LEVELS_VEC3_RELAXED ("Levels Vec3 Relaxed", RELAXED_FP, 61.1f),
36fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        LEVELS_VEC4_RELAXED ("Levels Vec4 Relaxed", RELAXED_FP, 44.6f),
37fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        LEVELS_VEC3_FULL ("Levels Vec3 Full", FULL_FP, 61.9f),
38fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        LEVELS_VEC4_FULL ("Levels Vec4 Full", FULL_FP, 73.f),
39fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        BLUR_RADIUS_25 ("Blur radius 25", RELAXED_FP, 1103.f),
40b4a8c2d0c147e8f7929ec048adceb340da26be22Pirama Arumuga Nainar        BLUR_RADIUS_25_HALF ("Blur radius 25 Half Precision", RELAXED_FP, 1103.f),
41fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        INTRINSIC_BLUR_RADIUS_25 ("Intrinsic Blur radius 25", INTRINSIC, 176.f),
42fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        GREYSCALE ("Greyscale", RELAXED_FP, 43.7f),
43fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        GRAIN ("Grain", RELAXED_FP, 147.4f),
44fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        FISHEYE_FULL ("Fisheye Full", FULL_FP, 192.f),
45fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        FISHEYE_RELAXED ("Fisheye Relaxed", RELAXED_FP, 181.f),
46fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        FISHEYE_APPROXIMATE_FULL ("Fisheye Approximate Full", FULL_FP, 193.f),
47fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        FISHEYE_APPROXIMATE_RELAXED ("Fisheye Approximate Relaxed", RELAXED_FP, 183.f),
48fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        VIGNETTE_FULL ("Vignette Full", FULL_FP, 101.f),
49fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        VIGNETTE_RELAXED ("Vignette Relaxed", RELAXED_FP, 116.f),
50fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        VIGNETTE_APPROXIMATE_FULL ("Vignette Approximate Full", FULL_FP, 85.1f),
51fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        VIGNETTE_APPROXIMATE_RELAXED ("Vignette Approximate Relaxed", RELAXED_FP, 96.7f),
52fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        GROUP_TEST_EMULATED ("Group Test (emulated)", INTRINSIC, 51.7f),
53fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        GROUP_TEST_NATIVE ("Group Test (native)", INTRINSIC, 52.9f),
54fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        CONVOLVE_3X3 ("Convolve 3x3", RELAXED_FP, 74.2f),
55fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        INTRINSICS_CONVOLVE_3X3 ("Intrinsics Convolve 3x3", INTRINSIC, 33.3f),
56fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        COLOR_MATRIX ("ColorMatrix", RELAXED_FP, 33.8f),
57fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        INTRINSICS_COLOR_MATRIX ("Intrinsics ColorMatrix", INTRINSIC, 21.3f),
58fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        INTRINSICS_COLOR_MATRIX_GREY ("Intrinsics ColorMatrix Grey", INTRINSIC, 21.4f),
59fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        COPY ("Copy", RELAXED_FP, 21.4f),
60fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        CROSS_PROCESS_USING_LUT ("CrossProcess (using LUT)", INTRINSIC, 23.1f),
61fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        CONVOLVE_5X5 ("Convolve 5x5", RELAXED_FP, 236.f),
62fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        INTRINSICS_CONVOLVE_5X5 ("Intrinsics Convolve 5x5", INTRINSIC, 39.6f),
63fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        MANDELBROT_FLOAT ("Mandelbrot (fp32)", FULL_FP, 117.f),
64fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        MANDELBROT_DOUBLE ("Mandelbrot (fp64)", FULL_FP, 136.f),
65fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        INTRINSICS_BLEND ("Intrinsics Blend", INTRINSIC, 105.f),
66fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        INTRINSICS_BLUR_25G ("Intrinsics Blur 25 uchar", INTRINSIC, 37.8f),
67fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        VIBRANCE ("Vibrance", RELAXED_FP, 103.f),
68fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        BW_FILTER ("BW Filter", RELAXED_FP, 86.f),
69fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        SHADOWS ("Shadows", RELAXED_FP, 130.f),
70fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        CONTRAST ("Contrast", RELAXED_FP, 45.4f),
71fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        EXPOSURE ("Exposure", RELAXED_FP, 73.4f),
72fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        WHITE_BALANCE ("White Balance", RELAXED_FP, 138.2f),
73fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        COLOR_CUBE ("Color Cube", RELAXED_FP, 83.9f),
74fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        COLOR_CUBE_3D_INTRINSIC ("Color Cube (3D LUT intrinsic)", INTRINSIC, 34.7f),
75fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        ARTISTIC1 ("Artistic 1", RELAXED_FP, 140.f),
76fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        RESIZE_BI_SCRIPT ("Resize BiCubic Script", RELAXED_FP, 253.f),
77fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        RESIZE_BI_INTRINSIC ("Resize BiCubic Intrinsic", INTRINSIC, 255.f),
78fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        POSTERIZE_INVOKE ("Posterize with invoke", RELAXED_FP, 215.f),
796b9cb41efc17c2731a2762c1ac6071ba5684af63Jason Sams        POSTERIZE_SET ("Posterize with set", INTRINSIC, 221.f),
806b9cb41efc17c2731a2762c1ac6071ba5684af63Jason Sams        HISTOGRAM_SCRIPT ("Histogram script", RELAXED_FP, 20.f),
816b9cb41efc17c2731a2762c1ac6071ba5684af63Jason Sams        HISTOGRAM_INTRINSIC ("Histogram intrinsic", INTRINSIC, 18.f);
825073402289471575a1bab5d43c9f3709a12148f3Jason Sams
835073402289471575a1bab5d43c9f3709a12148f3Jason Sams
845073402289471575a1bab5d43c9f3709a12148f3Jason Sams        private final String name;
85dbad8eb5a8bb16488351c5236974812d282b7b82Jason Sams        public final int group;
86b7ead98b51e77d1f07934c8bd49ed6fc232360b3Jason Sams        public final float baseline;
875073402289471575a1bab5d43c9f3709a12148f3Jason Sams
88b7ead98b51e77d1f07934c8bd49ed6fc232360b3Jason Sams        private TestName(String s, int g, float base) {
89b7ead98b51e77d1f07934c8bd49ed6fc232360b3Jason Sams            name = s;
90b7ead98b51e77d1f07934c8bd49ed6fc232360b3Jason Sams            group = g;
91b7ead98b51e77d1f07934c8bd49ed6fc232360b3Jason Sams            baseline = base;
92b7ead98b51e77d1f07934c8bd49ed6fc232360b3Jason Sams        }
93dbad8eb5a8bb16488351c5236974812d282b7b82Jason Sams        private TestName(String s, int g) {
945073402289471575a1bab5d43c9f3709a12148f3Jason Sams            name = s;
95dbad8eb5a8bb16488351c5236974812d282b7b82Jason Sams            group = g;
96b7ead98b51e77d1f07934c8bd49ed6fc232360b3Jason Sams            baseline = 1.f;
975073402289471575a1bab5d43c9f3709a12148f3Jason Sams        }
985073402289471575a1bab5d43c9f3709a12148f3Jason Sams
995073402289471575a1bab5d43c9f3709a12148f3Jason Sams        // return quoted string as displayed test name
1005073402289471575a1bab5d43c9f3709a12148f3Jason Sams        public String toString() {
1015073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return name;
1025073402289471575a1bab5d43c9f3709a12148f3Jason Sams        }
1035073402289471575a1bab5d43c9f3709a12148f3Jason Sams    }
1045073402289471575a1bab5d43c9f3709a12148f3Jason Sams
1055073402289471575a1bab5d43c9f3709a12148f3Jason Sams    static TestBase newTest(TestName testName) {
1065073402289471575a1bab5d43c9f3709a12148f3Jason Sams        switch(testName) {
1075073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case LEVELS_VEC3_RELAXED:
1085073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new LevelsV4(false, false);
1095073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case LEVELS_VEC4_RELAXED:
1105073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new LevelsV4(false, true);
1115073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case LEVELS_VEC3_FULL:
1125073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new LevelsV4(true, false);
1135073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case LEVELS_VEC4_FULL:
1145073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new LevelsV4(true, true);
1155073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case BLUR_RADIUS_25:
116b4a8c2d0c147e8f7929ec048adceb340da26be22Pirama Arumuga Nainar            return new Blur25(false, false);
117b4a8c2d0c147e8f7929ec048adceb340da26be22Pirama Arumuga Nainar        case BLUR_RADIUS_25_HALF:
118b4a8c2d0c147e8f7929ec048adceb340da26be22Pirama Arumuga Nainar            return new Blur25(false, true);
11969138aaab26753ae55404375f22043ec4e2b59cfJason Sams        case INTRINSIC_BLUR_RADIUS_25:
120b4a8c2d0c147e8f7929ec048adceb340da26be22Pirama Arumuga Nainar            return new Blur25(true, false);
1215073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case GREYSCALE:
1225073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Greyscale();
1235073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case GRAIN:
1245073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Grain();
1255073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case FISHEYE_FULL:
1265073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Fisheye(false, false);
1275073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case FISHEYE_RELAXED:
1285073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Fisheye(false, true);
1295073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case FISHEYE_APPROXIMATE_FULL:
1305073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Fisheye(true, false);
1315073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case FISHEYE_APPROXIMATE_RELAXED:
1325073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Fisheye(true, true);
1335073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case VIGNETTE_FULL:
1345073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Vignette(false, false);
1355073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case VIGNETTE_RELAXED:
1365073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Vignette(false, true);
1375073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case VIGNETTE_APPROXIMATE_FULL:
1385073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Vignette(true, false);
1395073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case VIGNETTE_APPROXIMATE_RELAXED:
1405073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Vignette(true, true);
1415073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case GROUP_TEST_EMULATED:
1425073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new GroupTest(false);
1435073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case GROUP_TEST_NATIVE:
1445073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new GroupTest(true);
1455073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case CONVOLVE_3X3:
1465073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Convolve3x3(false);
1475073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case INTRINSICS_CONVOLVE_3X3:
1485073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Convolve3x3(true);
1495073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case COLOR_MATRIX:
1505073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new ColorMatrix(false, false);
1515073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case INTRINSICS_COLOR_MATRIX:
1525073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new ColorMatrix(true, false);
1535073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case INTRINSICS_COLOR_MATRIX_GREY:
1545073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new ColorMatrix(true, true);
1555073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case COPY:
1565073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Copy();
1575073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case CROSS_PROCESS_USING_LUT:
1585073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new CrossProcess();
1595073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case CONVOLVE_5X5:
1605073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Convolve5x5(false);
1615073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case INTRINSICS_CONVOLVE_5X5:
1625073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Convolve5x5(true);
163859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams        case MANDELBROT_FLOAT:
164859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams            return new Mandelbrot(false);
165859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams        case MANDELBROT_DOUBLE:
166859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams            return new Mandelbrot(true);
1675073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case INTRINSICS_BLEND:
1685073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Blend();
16969138aaab26753ae55404375f22043ec4e2b59cfJason Sams        case INTRINSICS_BLUR_25G:
17069138aaab26753ae55404375f22043ec4e2b59cfJason Sams            return new Blur25G();
1715073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case VIBRANCE:
1725073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Vibrance();
1735073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case BW_FILTER:
1745073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new BWFilter();
1755073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case SHADOWS:
1765073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Shadows();
1775073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case CONTRAST:
1785073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Contrast();
1795073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case EXPOSURE:
1805073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new Exposure();
1815073402289471575a1bab5d43c9f3709a12148f3Jason Sams        case WHITE_BALANCE:
1825073402289471575a1bab5d43c9f3709a12148f3Jason Sams            return new WhiteBalance();
18369138aaab26753ae55404375f22043ec4e2b59cfJason Sams        case COLOR_CUBE:
18469138aaab26753ae55404375f22043ec4e2b59cfJason Sams            return new ColorCube(false);
18569138aaab26753ae55404375f22043ec4e2b59cfJason Sams        case COLOR_CUBE_3D_INTRINSIC:
18669138aaab26753ae55404375f22043ec4e2b59cfJason Sams            return new ColorCube(true);
187859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams        case ARTISTIC1:
188859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams            return new Artistic1();
1890ef64c5373a119eb73cbf7b1f7cf7d1da12d97d3Jason Sams        case RESIZE_BI_SCRIPT:
1900ef64c5373a119eb73cbf7b1f7cf7d1da12d97d3Jason Sams            return new Resize(false);
1910ef64c5373a119eb73cbf7b1f7cf7d1da12d97d3Jason Sams        case RESIZE_BI_INTRINSIC:
1920ef64c5373a119eb73cbf7b1f7cf7d1da12d97d3Jason Sams            return new Resize(true);
193fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        case POSTERIZE_INVOKE:
194fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams            return new Posterize(true);
195fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams        case POSTERIZE_SET:
196fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams            return new Posterize(false);
1976b9cb41efc17c2731a2762c1ac6071ba5684af63Jason Sams        case HISTOGRAM_SCRIPT:
1986b9cb41efc17c2731a2762c1ac6071ba5684af63Jason Sams            return new Histogram(false);
1996b9cb41efc17c2731a2762c1ac6071ba5684af63Jason Sams        case HISTOGRAM_INTRINSIC:
2006b9cb41efc17c2731a2762c1ac6071ba5684af63Jason Sams            return new Histogram(true);
2015073402289471575a1bab5d43c9f3709a12148f3Jason Sams        }
2025073402289471575a1bab5d43c9f3709a12148f3Jason Sams        return null;
2035073402289471575a1bab5d43c9f3709a12148f3Jason Sams    }
2045073402289471575a1bab5d43c9f3709a12148f3Jason Sams}
2055073402289471575a1bab5d43c9f3709a12148f3Jason Sams
206