blob: 9df88a0c01b7daa5ee328fa60bf91cdb93eae575 [file] [log] [blame]
// Copyright 2011 Google Inc. All Rights Reserved.
#include <dirent.h>
#include <dlfcn.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "base64.h"
#include "heap.h"
#include "thread.h"
#include "stringprintf.h"
#include "class_linker.h"
#include "dex_file.h"
#include "unicode/uclean.h"
#include "unicode/uvernum.h"
#include "gtest/gtest.h"
namespace art {
//class IntMath {
//
// public static boolean mBoolean1, mBoolean2;
// public static byte mByte1, mByte2;
// public static char mChar1, mChar2;
// public static short mShort1, mShort2;
// public static int mInt1, mInt2;
// public static float mFloat1, mFloat2;
// public static long mLong1, mLong2;
// public static double mDouble1, mDouble2;
// public static volatile long mVolatileLong1, mVolatileLong2;
//
//
// private int foo_;
//
// public IntMath(int stuff) {
// foo_ = stuff;
// }
//
// public IntMath() {
// foo_ = 123;
// }
//
// static int staticFieldTest(int x) {
// mBoolean1 = true;
// mBoolean2 = false;
// mByte1 = 127;
// mByte2 = -128;
// mChar1 = 32767;
// mChar2 = 65535;
// mShort1 = 32767;
// mShort2 = -32768;
// mInt1 = 65537;
// mInt2 = -65537;
// mFloat1 = 3.1415f;
// mFloat2 = -1.0f / 0.0f; // -inf
// mLong1 = 1234605616436508552L; // 0x1122334455667788
// mLong2 = -1234605616436508552L;
// mDouble1 = 3.1415926535;
// mDouble2 = 1.0 / 0.0; // +inf
// mVolatileLong1 = mLong1 - 1;
// mVolatileLong2 = mLong2 + 1;
//
// if (!mBoolean1) { return 10; }
// if (mBoolean2) { return 11; }
// if (mByte1 != 127) { return 12; }
// if (mByte2 != -128) { return 13; }
// if (mChar1 != 32767) { return 14; }
// if (mChar2 != 65535) { return 15; }
// if (mShort1 != 32767) { return 16; }
// if (mShort2 != -32768) { return 17; }
// if (mInt1 != 65537) { return 18; }
// if (mInt2 != -65537) { return 19; }
// if (!(mFloat1 > 3.141f && mFloat1 < 3.142f)) { return 20; }
// if (mFloat2 >= mFloat1) { return 21; }
// if (mLong1 != 1234605616436508552L) { return 22; }
// if (mLong2 != -1234605616436508552L) { return 23; }
// if (!(mDouble1 > 3.141592653 && mDouble1 < 3.141592654)) { return 24; }
// if (mDouble2 <= mDouble1) { return 25; }
// if (mVolatileLong1 != 1234605616436508551L) { return 26; }
// if (mVolatileLong2 != -1234605616436508551L) { return 27; }
//
// return 1000 + x;
// }
//
// /*
// * Try to cause some unary operations.
// */
// static int unopTest(int x) {
// x = -x;
// x ^= 0xffffffff;
// return x;
// }
//
// static int shiftTest1() {
// final int[] mBytes = {
// 0x11, 0x22, 0x33, 0x44, 0x88, 0x99, 0xaa, 0xbb
// };
// long l;
// int i1, i2;
//
// if (mBytes[0] != 0x11) return 20;
// if (mBytes[1] != 0x22) return 21;
// if (mBytes[2] != 0x33) return 22;
// if (mBytes[3] != 0x44) return 23;
// if (mBytes[4] != 0x88) return 24;
// if (mBytes[5] != 0x99) return 25;
// if (mBytes[6] != 0xaa) return 26;
// if (mBytes[7] != 0xbb) return 27;
//
// i1 = mBytes[0] | mBytes[1] << 8 | mBytes[2] << 16 | mBytes[3] << 24;
// i2 = mBytes[4] | mBytes[5] << 8 | mBytes[6] << 16 | mBytes[7] << 24;
// l = i1 | ((long)i2 << 32);
//
// if (i1 != 0x44332211) { return 0x80000000 | i1; }
// if (i2 != 0xbbaa9988) { return 2; }
// if (l != 0xbbaa998844332211L) { return 3; }
//
// l = (long)mBytes[0]
// | (long)mBytes[1] << 8
// | (long)mBytes[2] << 16
// | (long)mBytes[3] << 24
// | (long)mBytes[4] << 32
// | (long)mBytes[5] << 40
// | (long)mBytes[6] << 48
// | (long)mBytes[7] << 56;
//
// if (l != 0xbbaa998844332211L) { return 4; }
// return 0;
// }
//
// static int shiftTest2() {
//
// long a = 0x11;
// long b = 0x22;
// long c = 0x33;
// long d = 0x44;
// long e = 0x55;
// long f = 0x66;
// long g = 0x77;
// long h = 0x88;
//
// long result = ((a << 56) | (b << 48) | (c << 40) | (d << 32) |
// (e << 24) | (f << 16) | (g << 8) | h);
//
// if (result != 0x1122334455667788L) { return 1; }
// return 0;
// }
//
// static int unsignedShiftTest() {
// byte b = -4;
// short s = -4;
// char c = 0xfffc;
// int i = -4;
//
// b >>>= 4;
// s >>>= 4;
// c >>>= 4;
// i >>>= 4;
//
// if ((int) b != -1) { return 1; }
// if ((int) s != -1) { return 2; }
// if ((int) c != 0x0fff) { return 3; }
// if (i != 268435455) { return 4; }
// return 0;
// }
//
// static int convTest() {
//
// float f;
// double d;
// int i;
// long l;
//
// /* int --> long */
// i = 7654;
// l = (long) i;
// if (l != 7654L) { return 1; }
//
// i = -7654;
// l = (long) i;
// if (l != -7654L) { return 2; }
//
// /* long --> int (with truncation) */
// l = 5678956789L;
// i = (int) l;
// if (i != 1383989493) { return 3; }
//
// l = -5678956789L;
// i = (int) l;
// if (i != -1383989493) { return 4; }
// return 0;
// }
//
// static int charSubTest() {
//
// char char1 = 0x00e9;
// char char2 = 0xffff;
// int i;
//
// /* chars are unsigned-expanded to ints before subtraction */
// i = char1 - char2;
// if (i != 0xffff00ea) { return 1; }
// return 0;
// }
//
// /*
// * We pass in the arguments and return the results so the compiler
// * doesn't do the math for us. (x=70000, y=-3)
// */
// static int intOperTest(int x, int y) {
// int[] results = new int[10];
//
// /* this seems to generate "op-int" instructions */
// results[0] = x + y;
// results[1] = x - y;
// results[2] = x * y;
// results[3] = x * x;
// results[4] = x / y;
// results[5] = x % -y;
// results[6] = x & y;
// results[7] = x | y;
// results[8] = x ^ y;
//
// /* this seems to generate "op-int/2addr" instructions */
// results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
//
// /* check this edge case while we're here (div-int/2addr) */
// int minInt = -2147483648;
// int negOne = -results[5];
// int plusOne = 1;
// int result = (((minInt + plusOne) - plusOne) / negOne) / negOne;
//
// if (result != minInt) { return 1;};
// if (results[0] != 69997) { return 2;};
// if (results[1] != 70003) { return 3;};
// if (results[2] != -210000) { return 4;};
// if (results[3] != 605032704) { return 5;};
// if (results[4] != -23333) { return 6;};
// if (results[5] != 1) { return 7;};
// if (results[6] != 70000) { return 8;};
// if (results[7] != -3) { return 9;};
// if (results[8] != -70003) { return 10;};
// if (results[9] != 70000) { return 11;};
//
// return 0;
// }
//
// /*
// * More operations, this time with 16-bit constants. (x=77777)
// */
// static int lit16Test(int x) {
//
// int[] results = new int[8];
//
// /* try to generate op-int/lit16" instructions */
// results[0] = x + 1000;
// results[1] = 1000 - x;
// results[2] = x * 1000;
// results[3] = x / 1000;
// results[4] = x % 1000;
// results[5] = x & 1000;
// results[6] = x | -1000;
// results[7] = x ^ -1000;
//
// if (results[0] != 78777) { return 1; }
// if (results[1] != -76777) { return 2; }
// if (results[2] != 77777000) { return 3; }
// if (results[3] != 77) { return 4; }
// if (results[4] != 777) { return 5; }
// if (results[5] != 960) { return 6; }
// if (results[6] != -39) { return 7; }
// if (results[7] != -76855) { return 8; }
// return 0;
// }
//
// /*
// * More operations, this time with 8-bit constants. (x=-55555)
// */
// static int lit8Test(int x) {
//
// int[] results = new int[8];
//
// /* try to generate op-int/lit8" instructions */
// results[0] = x + 10;
// results[1] = 10 - x;
// results[2] = x * 10;
// results[3] = x / 10;
// results[4] = x % 10;
// results[5] = x & 10;
// results[6] = x | -10;
// results[7] = x ^ -10;
// int minInt = -2147483648;
// int result = minInt / -1;
// if (result != minInt) {return 1; }
// if (results[0] != -55545) {return 2; }
// if (results[1] != 55565) {return 3; }
// if (results[2] != -555550) {return 4; }
// if (results[3] != -5555) {return 5; }
// if (results[4] != -5) {return 6; }
// if (results[5] != 8) {return 7; }
// if (results[6] != -1) {return 8; }
// if (results[7] != 55563) {return 9; }
// return 0;
// }
//
//
// /*
// * Shift some data. (value=0xff00aa01, dist=8)
// */
// static int intShiftTest(int value, int dist) {
// int results[] = new int[4];
// results[0] = value << dist;
// results[1] = value >> dist;
// results[2] = value >>> dist;
// results[3] = (((value << dist) >> dist) >>> dist) << dist;
// if (results[0] != 0x00aa0100) {return 1; }
// if (results[1] != 0xffff00aa) {return 2; }
// if (results[2] != 0x00ff00aa) {return 3; }
// if (results[3] != 0xaa00) {return 4; }
// return 0;
// }
//
// /*
// * We pass in the arguments and return the results so the compiler
// * doesn't do the math for us. (x=70000000000, y=-3)
// */
// static int longOperTest(long x, long y) {
// long[] results = new long[10];
//
// /* this seems to generate "op-long" instructions */
// results[0] = x + y;
// results[1] = x - y;
// results[2] = x * y;
// results[3] = x * x;
// results[4] = x / y;
// results[5] = x % -y;
// results[6] = x & y;
// results[7] = x | y;
// results[8] = x ^ y;
// /* this seems to generate "op-long/2addr" instructions */
// results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
// /* check this edge case while we're here (div-long/2addr) */
// long minLong = -9223372036854775808L;
// long negOne = -results[5];
// long plusOne = 1;
// long result = (((minLong + plusOne) - plusOne) / negOne) / negOne;
// if (result != minLong) { return 1; }
// if (results[0] != 69999999997L) { return 2; }
// if (results[1] != 70000000003L) { return 3; }
// if (results[2] != -210000000000L) { return 4; }
// if (results[3] != -6833923606740729856L) { return 5; } // overflow
// if (results[4] != -23333333333L) { return 6; }
// if (results[5] != 1) { return 7; }
// if (results[6] != 70000000000L) { return 8; }
// if (results[7] != -3) { return 9; }
// if (results[8] != -70000000003L) { return 10; }
// if (results[9] != 70000000000L) { return 11; }
// if (results.length != 10) { return 12; }
// return 0;
// }
//
// /*
// * Shift some data. (value=0xd5aa96deff00aa01, dist=16)
// */
// static long longShiftTest(long value, int dist) {
// long results[] = new long[4];
// results[0] = value << dist;
// results[1] = value >> dist;
// results[2] = value >>> dist;
// results[3] = (((value << dist) >> dist) >>> dist) << dist;
// if (results[0] != 0x96deff00aa010000L) { return results[0]; }
// if (results[1] != 0xffffd5aa96deff00L) { return results[1]; }
// if (results[2] != 0x0000d5aa96deff00L) { return results[2]; }
// if (results[3] != 0xffff96deff000000L) { return results[3]; }
// if (results.length != 4) { return 5; }
//
// return results[0]; // test return-long
// }
//
// static int switchTest(int a) {
// int res = 1234;
//
// switch (a) {
// case -1: res = 1; return res;
// case 0: res = 2; return res;
// case 1: /*correct*/ break;
// case 2: res = 3; return res;
// case 3: res = 4; return res;
// case 4: res = 5; return res;
// default: res = 6; return res;
// }
// switch (a) {
// case 3: res = 7; return res;
// case 4: res = 8; return res;
// default: /*correct*/ break;
// }
//
// a = 0x12345678;
//
// switch (a) {
// case 0x12345678: /*correct*/ break;
// case 0x12345679: res = 9; return res;
// default: res = 1; return res;
// }
// switch (a) {
// case 57: res = 10; return res;
// case -6: res = 11; return res;
// case 0x12345678: /*correct*/ break;
// case 22: res = 12; return res;
// case 3: res = 13; return res;
// default: res = 14; return res;
// }
// switch (a) {
// case -6: res = 15; return res;
// case 3: res = 16; return res;
// default: /*correct*/ break;
// }
//
// a = -5;
// switch (a) {
// case 12: res = 17; return res;
// case -5: /*correct*/ break;
// case 0: res = 18; return res;
// default: res = 19; return res;
// }
//
// switch (a) {
// default: /*correct*/ break;
// }
// return res;
// }
// /*
// * Test the integer comparisons in various ways.
// */
// static int testIntCompare(int minus, int plus, int plus2, int zero) {
// int res = 1111;
//
// if (minus > plus)
// return 1;
// if (minus >= plus)
// return 2;
// if (plus < minus)
// return 3;
// if (plus <= minus)
// return 4;
// if (plus == minus)
// return 5;
// if (plus != plus2)
// return 6;
//
// /* try a branch-taken */
// if (plus != minus) {
// res = res;
// } else {
// return 7;
// }
//
// if (minus > 0)
// return 8;
// if (minus >= 0)
// return 9;
// if (plus < 0)
// return 10;
// if (plus <= 0)
// return 11;
// if (plus == 0)
// return 12;
// if (zero != 0)
// return 13;
//
// if (zero == 0) {
// res = res;
// } else {
// return 14;
// }
// return res;
// }
//
// /*
// * Test cmp-long.
// *
// * minus=-5, alsoMinus=0xFFFFFFFF00000009, plus=4, alsoPlus=8
// */
// static int testLongCompare(long minus, long alsoMinus, long plus,
// long alsoPlus) {
// int res = 2222;
//
// if (minus > plus)
// return 2;
// if (plus < minus)
// return 3;
// if (plus == minus)
// return 4;
//
// if (plus >= plus+1)
// return 5;
// if (minus >= minus+1)
// return 6;
//
// /* try a branch-taken */
// if (plus != minus) {
// res = res;
// } else {
// return 7;
// }
//
// /* compare when high words are equal but low words differ */
// if (plus > alsoPlus)
// return 8;
// if (alsoPlus < plus)
// return 9;
// if (alsoPlus == plus)
// return 10;
//
// /* high words are equal, low words have apparently different signs */
// if (minus < alsoMinus) // bug!
// return 11;
// if (alsoMinus > minus)
// return 12;
// if (alsoMinus == minus)
// return 13;
//
// return res;
// }
//
// /*
// * Test cmpl-float and cmpg-float.
// */
// static int testFloatCompare(float minus, float plus, float plus2,
// float nan) {
//
// int res = 3333;
// if (minus > plus)
// res = 1;
// if (plus < minus)
// res = 2;
// if (plus == minus)
// res = 3;
// if (plus != plus2)
// res = 4;
//
// if (plus <= nan)
// res = 5;
// if (plus >= nan)
// res = 6;
// if (minus <= nan)
// res = 7;
// if (minus >= nan)
// res = 8;
// if (nan >= plus)
// res = 9;
// if (nan <= plus)
// res = 10;
//
// if (nan == nan)
// res = 1212;
//
// return res;
// }
//
// static int testDoubleCompare(double minus, double plus, double plus2,
// double nan) {
//
// int res = 4444;
//
// if (minus > plus)
// return 1;
// if (plus < minus)
// return 2;
// if (plus == minus)
// return 3;
// if (plus != plus2)
// return 4;
//
// if (plus <= nan)
// return 5;
// if (plus >= nan)
// return 6;
// if (minus <= nan)
// return 7;
// if (minus >= nan)
// return 8;
// if (nan >= plus)
// return 9;
// if (nan <= plus)
// return 10;
//
// if (nan == nan)
// return 11;
// return res;
// }
//
// static int fibonacci(int n) {
// if (n == 0) {
// return 0;
// } else if (n == 1) {
// return 1;
// } else {
// return fibonacci(n - 1) + fibonacci(n - 2);
// }
// }
//
///*
// static void throwNullPointerException() {
// throw new NullPointerException("first throw");
// }
//
// static int throwAndCatch() {
// try {
// throwNullPointerException();
// return 1;
// } catch (NullPointerException npe) {
// return 0;
// }
// }
//*/
//
// static int manyArgs(int a0, long a1, int a2, long a3, int a4, long a5,
// int a6, int a7, double a8, float a9, double a10, short a11, int a12,
// char a13, int a14, int a15, byte a16, boolean a17, int a18, int a19,
// long a20, long a21, int a22, int a23, int a24, int a25, int a26)
// {
// if (a0 != 0) return 0;
// if (a1 != 1L) return 1;
// if (a2 != 2) return 2;
// if (a3 != 3L) return 3;
// if (a4 != 4) return 4;
// if (a5 != 5L) return 5;
// if (a6 != 6) return 6;
// if (a7 != 7) return 7;
// if (a8 != 8.0) return 8;
// if (a9 != 9.0f) return 9;
// if (a10 != 10.0) return 10;
// if (a11 != (short)11) return 11;
// if (a12 != 12) return 12;
// if (a13 != (char)13) return 13;
// if (a14 != 14) return 14;
// if (a15 != 15) return 15;
// if (a16 != (byte)-16) return 16;
// if (a17 != true) return 17;
// if (a18 != 18) return 18;
// if (a19 != 19) return 19;
// if (a20 != 20L) return 20;
// if (a21 != 21L) return 21;
// if (a22 != 22) return 22;
// if (a23 != 23) return 23;
// if (a24 != 24) return 24;
// if (a25 != 25) return 25;
// if (a26 != 26) return 26;
// return -1;
// }
//
// int virtualCall(int a)
// {
// return a * 2;
// }
//
// void setFoo(int a)
// {
// foo_ = a;
// }
//
// int getFoo()
// {
// return foo_;
// }
//
// static int staticCall(int a)
// {
// IntMath foo = new IntMath();
// return foo.virtualCall(a);
// }
//
// static int testIGetPut(int a)
// {
// IntMath foo = new IntMath(99);
// IntMath foo123 = new IntMath();
// int z = foo.getFoo();
// z += a;
// z += foo123.getFoo();
// foo.setFoo(z);
// return foo.getFoo();
// }
//
// public static void main(String[] args) {
// int res = unopTest(38);
// if (res == 37) {
// System.out.printf("unopTest PASSED\n");
// } else {
// System.out.printf("unopTest FAILED: %d\n", res);
// }
// res = shiftTest1();
// if (res == 0) {
// System.out.printf("shiftTest1 PASSED\n");
// } else {
// System.out.printf("shiftTest1 FAILED: %d\n", res);
// }
// res = shiftTest2();
// if (res == 0) {
// System.out.printf("shiftTest2 PASSED\n");
// } else {
// System.out.printf("shiftTest2 FAILED: %d\n", res);
// }
// res = unsignedShiftTest();
// if (res == 0) {
// System.out.printf("unsignedShiftTest PASSED\n");
// } else {
// System.out.printf("unsignedShiftTest FAILED: %d\n", res);
// }
// res = convTest();
// if (res == 0) {
// System.out.printf("convTest PASSED\n");
// } else {
// System.out.printf("convTest FAILED: %d\n", res);
// }
// res = charSubTest();
// if (res == 0) {
// System.out.printf("charSubTest PASSED\n");
// } else {
// System.out.printf("charSubTest FAILED: %d\n", res);
// }
// res = intOperTest(70000, -3);
// if (res == 0) {
// System.out.printf("intOperTest PASSED\n");
// } else {
// System.out.printf("intOperTest FAILED: %d\n", res);
// }
// res = longOperTest(70000000000L, -3L);
// if (res == 0) {
// System.out.printf("longOperTest PASSED\n");
// } else {
// System.out.printf("longOperTest FAILED: %d\n", res);
// }
// long lres = longShiftTest(0xd5aa96deff00aa01L, 16);
// if (lres == 0x96deff00aa010000L) {
// System.out.printf("longShiftTest PASSED\n");
// } else {
// System.out.printf("longShiftTest FAILED: %d\n", res);
// }
//
// res = switchTest(1);
// if (res == 1234) {
// System.out.printf("switchTest PASSED\n");
// } else {
// System.out.printf("switchTest FAILED: %d\n", res);
// }
//
// res = testIntCompare(-5, 4, 4, 0);
// if (res == 1111) {
// System.out.printf("testIntCompare PASSED\n");
// } else {
// System.out.printf("testIntCompare FAILED: %d\n", res);
// }
//
// res = testLongCompare(-5L, -4294967287L, 4L, 8L);
// if (res == 2222) {
// System.out.printf("testLongCompare PASSED\n");
// } else {
// System.out.printf("testLongCompare FAILED: %d\n", res);
// }
//
// res = testFloatCompare(-5.0f, 4.0f, 4.0f, (1.0f/0.0f) / (1.0f/0.0f));
// if (res == 3333) {
// System.out.printf("testFloatCompare PASSED\n");
// } else {
// System.out.printf("testFloatCompare FAILED: %d\n", res);
// }
//
// res = testDoubleCompare(-5.0, 4.0, 4.0, (1.0/0.0) / (1.0/0.0));
// if (res == 4444) {
// System.out.printf("testDoubleCompare PASSED\n");
// } else {
// System.out.printf("testDoubleCompare FAILED: %d\n", res);
// }
//
// res = fibonacci(10);
// if (res == 55) {
// System.out.printf("fibonacci PASSED\n");
// } else {
// System.out.printf("fibonacci FAILED: %d\n", res);
// }
//
///*
// res = throwAndCatch();
// if (res == 0) {
// System.out.printf("throwAndCatch PASSED\n");
// } else {
// System.out.printf("throwAndCatch FAILED: %d\n", res);
// }
//*/
//
// res = manyArgs(0, 1L, 2, 3L, 4, 5L, 6, 7, 8.0, 9.0f, 10.0,
// (short)11, 12, (char)13, 14, 15, (byte)-16, true, 18,
// 19, 20L, 21L, 22, 23, 24, 25, 26);
// if (res == -1) {
// System.out.printf("manyArgs PASSED\n");
// } else {
// System.out.printf("manyArgs FAILED: %d\n", res);
// }
//
// res = staticCall(3);
// if (res == 6) {
// System.out.printf("virtualCall PASSED\n");
// } else {
// System.out.printf("virtualCall FAILED: %d\n", res);
// }
//
// res = testIGetPut(111);
// if (res == 333) {
// System.out.printf("testGetPut PASSED\n");
// } else {
// System.out.printf("testGetPut FAILED: %d\n", res);
// }
//
// res = staticFieldTest(404);
// if (res == 1404) {
// System.out.printf("staticFieldTest PASSED\n");
// } else {
// System.out.printf("staticFieldTest FAILED: %d\n", res);
// }
// }
//}
static const char kIntMathDex[] =
"ZGV4CjAzNQDNfScpnt+aCE7GCvHI7Jifma1Cw1Zt40LcLwAAcAAAAHhWNBIAAAAAAAAAADwvAAC+"
"AAAAcAAAABMAAABoAwAADwAAALQDAAAUAAAAaAQAAB8AAAAIBQAAAgAAAAAGAACcKQAAQAYAAEYh"
"AABOIQAAUSEAAFQhAABXIQAAWiEAAF0hAABkIQAAayEAAG8hAAB0IQAAeyEAAJkhAACeIQAApSEA"
"ALMhAAC2IQAAuyEAAL8hAADKIQAAzyEAAOYhAAD7IQAADyIAACMiAAA3IgAARCIAAEciAABKIgAA"
"TiIAAFIiAABVIgAAWSIAAF0iAAByIgAAhyIAAIoiAACOIgAAkiIAAJciAACcIgAAoSIAAKYiAACr"
"IgAAsCIAALUiAAC6IgAAvyIAAMQiAADIIgAAzSIAANIiAADXIgAA3CIAAOEiAADmIgAA6yIAAO8i"
"AADzIgAA9yIAAPsiAAD/IgAAAyMAAAcjAAASIwAAHCMAACIjAAAlIwAAKCMAAC8jAAA2IwAAQyMA"
"AFwjAABxIwAAeyMAAJEjAACjIwAApiMAAKwjAACvIwAAsiMAAL0jAADUIwAA5yMAAOwjAAD0IwAA"
"+iMAAP0jAAAFJAAACCQAAAskAAAPJAAAEyQAACAkAAA5JAAATiQAAFwkAABfJAAAaiQAAHQkAACC"
"JAAAnCQAALIkAADBJAAA3CQAAPMkAAD5JAAABCUAAA8lAAAXJQAAHyUAACclAAAvJQAANyUAAEEl"
"AABLJQAAVCUAAF0lAABkJQAAayUAAHMlAAB7JQAAhCUAAI0lAACdJQAArSUAALMlAAC9JQAA0yUA"
"AOUlAADtJQAA9iUAAP0lAAAAJgAABSYAAA0mAAASJgAAGCYAAB8mAAAoJgAAMCYAADUmAAA9JgAA"
"RiYAAEkmAABRJgAAXSYAAHUmAACJJgAAlSYAAK0mAADBJgAAzSYAAN4mAAD7JgAAFCcAABsnAAAn"
"JwAAPycAAFMnAABmJwAAhScAAKAnAACyJwAA0CcAAOonAAACKAAAFigAACMoAAAzKAAATygAAGco"
"AAB4KAAAlSgAAK4oAAC0KAAAvigAANQoAADmKAAA+SgAABgpAAAzKQAAOikAAEMpAABQKQAAaSkA"
"AH4pAACBKQAAhCkAAIcpAAABAAAAAgAAAAMAAAAEAAAABQAAAA8AAAASAAAAFAAAABUAAAAWAAAA"
"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"
"AQAKJRMBJQACACUAMxDEAWIBEwAaArEAEgMjMxEAbjAcACEDcQAPAAAACiU5JccBYgETABoCkwAS"
"AyMzEQBuMBwAIQNxABAAAAAKJTklygFiARMAGgKWABIDIzMRAG4wHAAhA3EAGgAAAAolOSXNAWIB"
"EwAaArQAEgMjMxEAbjAcACEDcQADAAAACiU5JdABYgETABoCSwASAyMzEQBuMBwAIQNxAAIAAAAK"
"JTkl0wFiARMAGgJIABIDIzMRAG4wHAAhAxQBcBEBABLScSAGACEACiU5JdIBYgETABoCXgASAyMz"
"EQBuMBwAIQMYAQA8U0wQAAAAFgP9/3FACgAhQwolOSXOAWIBEwAaAmUAEgMjMxEAbjAcACEDGAEB"
"qgD/3paq1RMDEABxMAsAIQMLIxgBAAABqgD/3pYxASMBOQHDAWIBEwAaAmgAEgMjMxEAbjAcACED"
"EhFxEBMAAQAKJRMB0gQCACUAMxDBAWIBEwAaAp4AEgMjMxEAbjAcACEDErESQhJDEgRxQBcAIUMK"
"JRMBVwQCACUAMxC8AWIBEwAaAqoAEgMjMxEAbjAcACEDFgH7/xgDCQAAAP////8WBQQAFgcIAHcI"
"GAABAAolEwGuCAIAJQAzELABYgETABoCrQASAyMzEQBuMBwAIQMVAaDAFQKAQBUDgEAVBMB/cUAV"
"ACFDCiUTAQUNAgAlADMQpwFiARMAGgKkABIDIzMRAG4wHAAhAxkBFMAZAxBAGQUQQBkH+H93CBQA"
"AQAKJRMBXBECACUAMxCeAWIBEwAaAqEAEgMjMxEAbjAcACEDEwEKAHEQBAABAAolEwE3AAIAJQAz"
"EJsBYgETABoCUgASAyMzEQBuMBwAIQMSARYCAQASJBYFAwASRxYIBQASahJ7GQwgQBUOEEEZDyRA"
"ExELABMSDAATEw0AExQOABMVDwATFvD/ExcBABMYEgATGRMAFhoUABYcFQATHhYAEx8XABMgGAAT"
"IRkAEyIaAHciDQABAAolEvECACUAMxBqAWIBEwAaAoAAEgMjMxEAbjAcACEDEjFxEBEAAQAKJRJh"
"AgAlADMQaQFiARMAGgK5ABIDIzMRAG4wHAAhAxMBbwBxEBYAAQAKJRMBTQECACUAMxBmAWIBEwAa"
"AqYAEgMjMxEAbjAcACEDEwGUAXEQEgABAAolEwF8BQIAJQAzEGMBYgETABoCmgASAyMzEQBuMBwA"
"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"
"oRISFBMUEACjFAoUoRISFBMUCACjFAwUoRISFKEQEg4YEoh3ZlVEMyIRMRIQEjgSBQATEgEADxIT"
"EgAAKP0AAAMAAQACAAAAJCwAAAoAAAAiAAYAcBAAAAAAbiAbACAACgEPAQoAAQAAAAAAMCwAACgB"
"AAATCH8AEweA/xMGAIAUBf///v8TBP9/EhBqAAEAEgBqAAIAawgDAGsHBABsBAUAFAD//wAAbAAG"
"AG0EDwBtBhAAFAABAAEAZwALAGcFDAAUAFYOSUBnAAkAFQCA/2cACgAYAIh3ZlVEMyIRaAANABgA"
"eIiZqrvM3e5oAA4AGABEF0FU+yEJQGgABwAZAPB/aAAIAGEADQAWAgEAvCBoABEAYQAOABYCAQC7"
"IGgAEgBjAAEAOQAFABMACgAPAGMAAgA4AAUAEwALACj5ZAADADKABQATAAwAKPJkAAQAMnAFABMA"
"DQAo62UABQAyQAUAEwAOACjkZQAGABQB//8AADIQBQATAA8AKNpmAA8AMkAFABMAEAAo02YAEAAy"
"YAUAEwARACjMYAALABQBAQABADIQBQATABIAKMJgAAwAMlAFABMAEwAou2AACQAUASUGSUAtAAAB"
"PQALAGAACQAUAYcWSUAuAAABOgAFABMAFAAopmAACgBgAQkALQAAAToABQATABUAKJthAA0AGAKI"
"d2ZVRDMiETEAAAI4AAUAEwAWACiNYQAOABgCeIiZqrvM3e4xAAACOAAGABMAFwApAH//YQAHABgC"
"OOkvVPshCUAvAAACPQANAGEABwAYAlBFUlT7IQlAMAAAAjoABgATABgAKQBl/2EACABhAgcAMAAA"
"AjwABgATABkAKQBZ/2EAEQAYAod3ZlVEMyIRMQAAAjgABgATABoAKQBK/2EAEgAYAnmImaq7zN3u"
"MQAAAjgABgATABsAKQA7/9CQ6AMpADf/AwABAAAAAABkLAAAsAAAABMA0gQrAmAAAAASYAEBDwES"
"EAEBKP0SIAEBKPoSMAEBKPcSQAEBKPQSUAEBKPErAlsAAAAUAnhWNBIrAl0AAAASEAEBKOUScAEB"
"KOITAAgAAQEo3hMACQABASjaLAJUAAAAEwAOAAEBKNMTAAoAAQEozxMACwABASjLEwAMAAEBKMcT"
"AA0AAQEowywCUwAAABKyLAJZAAAAEwATAAEBKLgTAA8AAQEotBMAEAABASiwEwARAAEBKKwTABIA"
"AQEoqAEBKKYAAQYA/////wYAAAAJAAAAFQAAAAwAAAAPAAAAEgAAAAABAgADAAAADAAAAA8AAAAA"
"AQIAeFY0EhEAAAANAAAAAAIFAPr///8DAAAAFgAAADkAAAB4VjQSCwAAABMAAAAPAAAABwAAABcA"
"AAAAAgIA+v///wMAAAALAAAADwAAAAACAwD7////AAAAAAwAAAAXAAAAEwAAAA8AAAAKAAgAAAAA"
"AHMtAABIAAAAEwBcES8BAgQ9AQQAEhAPADABBAI7AQQAEiAo+i8BBAI5AQQAEjAo9C8BBAY4AQQA"
"EkAo7jABBAg8AQQAElAo6C8BBAg6AQQAEmAo4jABAgg8AQQAEnAo3C8BAgg6AQUAEwAIACjVLwEI"
"BDoBBQATAAkAKM4wAQgEPAEFABMACgAoxy8BCAg5AcT/EwALACjABgAEAAAAAAClLQAAPgAAABMA"
"BQ0tAQIDPQEDABIQLgEDAjsBAwASIC0BAwI5AQMAEjAtAQMEOAEDABJALgEDBTwBAwASUC0BAwU6"
"AQMAEmAuAQIFPAEDABJwLQECBToBBAATAAgALQEFAzoBBAATAAkALgEFAzwBBAATAAoALQEFBTkB"
"BAATALwEDwAFAAEAAgAAAM8tAAAeAAAAIgAGABMDYwBwIAEAMAAiAQYAcBAAAAEAbhAFAAAACgKw"
"Qm4QBQABAAoDsDJuIA4AIABuEAUAAAAKAw8DBgAEAAAAAADpLQAAQwAAABMAVwQ3MgQAEhEPATQy"
"BAASISj8NSMEABIxKPg2IwQAEkEo9DMjBAASUSjwMkMEABJhKOwyIwcAPQIHABMBCAAo5RJxKOM6"
"AgUAEwEJACjeOwMFABMBCgAo2TwDBQATAQsAKNQ5AwUAEwEMACjPOAUFABMBDQAoyjkFBAABASjG"
"EwEOACjDAAANAAgAAAAAAB4uAABYAAAAFgMBABMArggxAQUJPQEEABIhDwExAQkFOwEEABIxKPox"
"AQkFOQEEABJBKPSbAQkDMQEJAToBBAASUSjsmwEFAzEBBQE6AQQAEmEo5DEBCQU4AQkAMQEJCz0B"
"BwATAQgAKNkScSjXMQELCTsBBQATAQkAKNAxAQsJOQEFABMBCgAoyTEBBQc7AQUAEwELACjCMQEH"
"BT0BBQATAQwAKLsxAQcFOQEFABMBDQAotAEBKLIBAAEAAAAAAE8uAAAEAAAAewDfAAD/DwAHAAAA"
"AAAAAFguAAAjAAAAEwb/DxL1FAT///8PEsASwxQB/P8AABLCjUCPQ45h4gICBDJQBAASFA8EMlME"
"ABIkKPwyYQQAEjQo+DJCBAASRCj0EgQo8gAAAgABAAAAAAB8LgAAAwAAAFIQAAAPAAAAAgACAAAA"
"AACCLgAAAwAAAFkBAAAOAAAAAwACAAAAAACKLgAAAwAAANoAAgIPAAAABAAAAAIAAgACAAIABAAA"
"AAMAAwADAAMAAQAAAAQAAAACAAAABAAEAAQAAAAEAAQABAAEABsAAAAEAAUABAAFAAQABQAEAAQA"
"AgADAAIADAAEAAEABAAEAAAADgAEAAQABQAFAAQABAAEAAQABAAAAAIAAAAFAAUABAAAAAUABQAF"
"AAUAAgAAAAUABAACAAAACgARAAEAAAASAAY8aW5pdD4AAUIAAUMAAUQAAUYAAUkABUlEREREAAVJ"
"RkZGRgACSUkAA0lJSQAFSUlJSUkAHElJSklKSUpJSURGRFNJQ0lJQlpJSUpKSUlJSUkAA0lKSgAF"
"SUpKSkoADEludE1hdGguamF2YQABSgADSkpJAAJMSQAJTEludE1hdGg7AANMTEwAFUxqYXZhL2lv"
"L1ByaW50U3RyZWFtOwATTGphdmEvbGFuZy9JbnRlZ2VyOwASTGphdmEvbGFuZy9PYmplY3Q7ABJM"
"amF2YS9sYW5nL1N0cmluZzsAEkxqYXZhL2xhbmcvU3lzdGVtOwALT2JqZWN0LmphdmEAAVMAAVYA"
"AlZJAAJWTAABWgACW0kAAltKABNbTGphdmEvbGFuZy9PYmplY3Q7ABNbTGphdmEvbGFuZy9TdHJp"
"bmc7AAFhAAJhMAACYTEAA2ExMAADYTExAANhMTIAA2ExMwADYTE0AANhMTUAA2ExNgADYTE3AANh"
"MTgAA2ExOQACYTIAA2EyMAADYTIxAANhMjIAA2EyMwADYTI0AANhMjUAA2EyNgACYTMAAmE0AAJh"
"NQACYTYAAmE3AAJhOAACYTkACWFsc29NaW51cwAIYWxzb1BsdXMABGFyZ3MAAWIAAWMABWNoYXIx"
"AAVjaGFyMgALY2hhclN1YlRlc3QAF2NoYXJTdWJUZXN0IEZBSUxFRDogJWQKABNjaGFyU3ViVGVz"
"dCBQQVNTRUQKAAhjb252VGVzdAAUY29udlRlc3QgRkFJTEVEOiAlZAoAEGNvbnZUZXN0IFBBU1NF"
"RAoAAWQABGRpc3QAAWUAAWYACWZpYm9uYWNjaQAVZmlib25hY2NpIEZBSUxFRDogJWQKABFmaWJv"
"bmFjY2kgUEFTU0VECgADZm9vAAZmb28xMjMABGZvb18AAWcABmdldEZvbwABaAABaQACaTEAAmky"
"AAtpbnRPcGVyVGVzdAAXaW50T3BlclRlc3QgRkFJTEVEOiAlZAoAE2ludE9wZXJUZXN0IFBBU1NF"
"RAoADGludFNoaWZ0VGVzdAABbAAJbGl0MTZUZXN0AAhsaXQ4VGVzdAAMbG9uZ09wZXJUZXN0ABhs"
"b25nT3BlclRlc3QgRkFJTEVEOiAlZAoAFGxvbmdPcGVyVGVzdCBQQVNTRUQKAA1sb25nU2hpZnRU"
"ZXN0ABlsb25nU2hpZnRUZXN0IEZBSUxFRDogJWQKABVsb25nU2hpZnRUZXN0IFBBU1NFRAoABGxy"
"ZXMACW1Cb29sZWFuMQAJbUJvb2xlYW4yAAZtQnl0ZTEABm1CeXRlMgAGbUJ5dGVzAAZtQ2hhcjEA"
"Bm1DaGFyMgAIbURvdWJsZTEACG1Eb3VibGUyAAdtRmxvYXQxAAdtRmxvYXQyAAVtSW50MQAFbUlu"
"dDIABm1Mb25nMQAGbUxvbmcyAAdtU2hvcnQxAAdtU2hvcnQyAA5tVm9sYXRpbGVMb25nMQAObVZv"
"bGF0aWxlTG9uZzIABG1haW4ACG1hbnlBcmdzABRtYW55QXJncyBGQUlMRUQ6ICVkCgAQbWFueUFy"
"Z3MgUEFTU0VECgAGbWluSW50AAdtaW5Mb25nAAVtaW51cwABbgADbmFuAAZuZWdPbmUAA291dAAE"
"cGx1cwAFcGx1czIAB3BsdXNPbmUABnByaW50ZgADcmVzAAZyZXN1bHQAB3Jlc3VsdHMAAXMABnNl"
"dEZvbwAKc2hpZnRUZXN0MQAWc2hpZnRUZXN0MSBGQUlMRUQ6ICVkCgASc2hpZnRUZXN0MSBQQVNT"
"RUQKAApzaGlmdFRlc3QyABZzaGlmdFRlc3QyIEZBSUxFRDogJWQKABJzaGlmdFRlc3QyIFBBU1NF"
"RAoACnN0YXRpY0NhbGwAD3N0YXRpY0ZpZWxkVGVzdAAbc3RhdGljRmllbGRUZXN0IEZBSUxFRDog"
"JWQKABdzdGF0aWNGaWVsZFRlc3QgUEFTU0VECgAFc3R1ZmYACnN3aXRjaFRlc3QAFnN3aXRjaFRl"
"c3QgRkFJTEVEOiAlZAoAEnN3aXRjaFRlc3QgUEFTU0VECgARdGVzdERvdWJsZUNvbXBhcmUAHXRl"
"c3REb3VibGVDb21wYXJlIEZBSUxFRDogJWQKABl0ZXN0RG91YmxlQ29tcGFyZSBQQVNTRUQKABB0"
"ZXN0RmxvYXRDb21wYXJlABx0ZXN0RmxvYXRDb21wYXJlIEZBSUxFRDogJWQKABh0ZXN0RmxvYXRD"
"b21wYXJlIFBBU1NFRAoAFnRlc3RHZXRQdXQgRkFJTEVEOiAlZAoAEnRlc3RHZXRQdXQgUEFTU0VE"
"CgALdGVzdElHZXRQdXQADnRlc3RJbnRDb21wYXJlABp0ZXN0SW50Q29tcGFyZSBGQUlMRUQ6ICVk"
"CgAWdGVzdEludENvbXBhcmUgUEFTU0VECgAPdGVzdExvbmdDb21wYXJlABt0ZXN0TG9uZ0NvbXBh"
"cmUgRkFJTEVEOiAlZAoAF3Rlc3RMb25nQ29tcGFyZSBQQVNTRUQKAAR0aGlzAAh1bm9wVGVzdAAU"
"dW5vcFRlc3QgRkFJTEVEOiAlZAoAEHVub3BUZXN0IFBBU1NFRAoAEXVuc2lnbmVkU2hpZnRUZXN0"
"AB11bnNpZ25lZFNoaWZ0VGVzdCBGQUlMRUQ6ICVkCgAZdW5zaWduZWRTaGlmdFRlc3QgUEFTU0VE"
"CgAFdmFsdWUAB3ZhbHVlT2YAC3ZpcnR1YWxDYWxsABd2aXJ0dWFsQ2FsbCBGQUlMRUQ6ICVkCgAT"
"dmlydHVhbENhbGwgUEFTU0VECgABeAABeQABegAEemVybwADAAcOABQABw48SwAQAZwBBw48LQCx"
"AQAHDi0DAEUCPwMBRgItAwJaBWkAnAEABw4tAwBaBR4DAWEGAg53AnQdLR6JWh55Wh54AL8EAYUB"
"Bx0tIRovAMABArsBvAEHWU0DBI8BEEtLS0taWlpaa+MtAwCCAQU8AwGHAQUeAwKLAQVbAwOOAQUC"
"DCwCdR2WlpaWlmm0lsPTAKQCArYBTgdZLQMAjwEQS0tLeHsalpalAOoBAbsBB1lNAwCPARBLS0tL"
"S1paW38CeR2WloeHlpbDAIYCAbsBB1lNAwKPARBLS0tLS1paWi0DAIIBBS0DAY4BBTUCeB2WlpaH"
"eJaWwwC1AgK7AbwBBw5NAwiPARFaWlpaWmlaWmriLQMAgwEGSwMChwEGLQMEiwEGaQMGjgEGAgxZ"
"AnUd4eHh4eG08MP/AREPlgDbAgK2AU4HWS0DAI8BEUtLS3jXAnsd4eHhagCbBQFCBw5pAyWNAQVp"
"qEstqEstqEstqEstqEstqIctqLQtqLQDI2oGlqlaaamHaanwaanDaanDaalpaQIOpAE1EVqpWlqp"
"aWmpaWmoAv1+HQUjARMUARMUARMUARMUARMUARMUARMUARMUBiMBExUBExUBExUBExUBExUBExUC"
"EgETDgETFQETFQETFQDcBBslJjE5Ojs8PT4/JygpKissLS4vMDIzNDU2NzgHDgIbOwJmHYdah1qH"
"WlqWlpaWlpaWlpaWpaWlpaWlpaWlAEwAB1l9AwRvEAIbhgJmHZaWlpalpaYBEg8DAFsFARUPAwFc"
"BXkDAmEGllrEATgX0gJfLAByAAcOLQMAJAYtAwJDBi0DBEQGLQMGTQYtAwhPBi0DClAGLQMMVwYu"
"Aw5ZBgEqEQMQjgEGtACLBQEkBw5aAwBUBwAZAbsBB7M8PC0tLVotLVotWkt4eHhLeHkCE2gCbh14"
"eHh4pXh4pXgBFQ+04fABGg/D8PEA6gIBJAcOLgMAjQEFQgIoLAUAAwGNAQUCUh0FAQYAAQIFAAYB"
"HgUBBgABAgUABgEfBQEGAAECBQAGAR4FAQYAAQIFAAYBHgUBBgABAgUABgEgBQEGAEE9PgECBQAG"
"AQJ2HQUBBgABAgUABgEeBQEGAAEDBQAGASUFAQYAAQMFAAYBIAUBBgBBAQMFAAYBAnsdBQEGAAED"
"BQAGAR4FAQYAAQMFAAYBHwUBBgABAwUABgEeBQEGAAEDBQAGASAFAQYAQR4/AQMFAAYBAnYdBQEG"
"AAEDBQAGAR4FAQYAAQMFAAYBIwUBBgABAwUABgEfBQEGAAEDBQAGAQEBBQEGACQFAAYBAlEdARAX"
"josBFharAKEEBIQBiQGKAYYBBw4uAwCNAQVLAhcdBQACah0GAEstSy1LLkstSy1LLUs8SzxLPUsA"
"gQQEhAGJAYoBhgEHDi0DAI0BBUseSx5LHksfSx5LHkseSy1LLUsuSy4AkQUBJAcOeAMAVAdaAwFV"
"B0sDAr0BBR5aPAChAwSEAYkBigG+AQcOLgMAjQEFLQIlHQJcHS0tLS0tLS0tLS8yLTcxLTwtPC08"
"LTwtPUAbANMDBIQBQIkBQQcsLgMAjQEFSwIiHQJfHUstSy5pLWkvUUsCezsySzxLPks8SzxLTABG"
"AbsBBw4eLQCDAQAHaB4DAEMBHgMDkAENPAMBRAIfAwJaBR4eHi4/GktLSwCGBQAHDgCBBQEkBw4t"
"APwEASQHDgAAAAEAHoGABMAMEgEZAwEJAQkBCQEJAQkBCQEJAQkBCQEJAQkBCQEJAQkBCQEJAUkB"
"SQACAIGABNQMAYGABPQMAQiQDQEIwA0BCLQOAgjwDgEI4BEBCPASAQjsFAEI9BYBCOAaAQmoHAEI"
"qCkCCIgtAQiMMQEIsDIBCNQyAQi0NwEIpDoBCMQ7AQjQPAEInD0BCLQ+AQj0PwEIjEAFAORACQD8"
"QA0AlEEAAAANAAAAAAAAAAEAAAAAAAAAAQAAAL4AAABwAAAAAgAAABMAAABoAwAAAwAAAA8AAAC0"
"AwAABAAAABQAAABoBAAABQAAAB8AAAAIBQAABgAAAAIAAAAABgAAASAAAB0AAABABgAAARAAAAsA"
"AACsIAAAAiAAAL4AAABGIQAAAyAAAB0AAACNKQAAACAAAAIAAACRLgAAABAAAAEAAAA8LwAA";
} // namespace art