summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-mochitest
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /dom/canvas/test/webgl-mochitest
parentInitial commit. (diff)
downloadfirefox-esr-upstream.tar.xz
firefox-esr-upstream.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--dom/canvas/test/webgl-mochitest/blank_15000x10000.pngbin0 -> 456146 bytes
-rw-r--r--dom/canvas/test/webgl-mochitest/driver-info.js139
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/ensure-ext.js42
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_ANGLE_instanced_arrays.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_blend_minmax.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_color_buffer_half_float.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_disjoint_timer_query.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_float_blend.html18
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_frag_depth.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_sRGB.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_shader_texture_lod.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_bptc.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_rgtc.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_filter_anisotropic.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_norm16.html23
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_draw_buffers_indexed.html18
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_fbo_render_mipmap.html18
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_standard_derivatives.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_OVR_multiview2.html18
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_color_buffer_float.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_astc.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc1.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_pvrtc.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_s3tc.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_depth_texture.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_draw_buffers.html17
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_provoking_vertex.html18
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_common.html128
-rw-r--r--dom/canvas/test/webgl-mochitest/ensure-exts/test_implicit.html129
-rw-r--r--dom/canvas/test/webgl-mochitest/es3-data.js3221
-rw-r--r--dom/canvas/test/webgl-mochitest/mochi-to-testcase.py119
-rw-r--r--dom/canvas/test/webgl-mochitest/mochitest.ini131
-rw-r--r--dom/canvas/test/webgl-mochitest/red-green.mp4bin0 -> 92225 bytes
-rw-r--r--dom/canvas/test/webgl-mochitest/red-green.theora.ogvbin0 -> 10292 bytes
-rw-r--r--dom/canvas/test/webgl-mochitest/red-green.webmvp8.webmbin0 -> 10979 bytes
-rw-r--r--dom/canvas/test/webgl-mochitest/red-green.webmvp9.webmbin0 -> 4309 bytes
-rw-r--r--dom/canvas/test/webgl-mochitest/regress/test_bug_1268096.html140
-rw-r--r--dom/canvas/test/webgl-mochitest/test_backbuffer_channels.html111
-rw-r--r--dom/canvas/test/webgl-mochitest/test_backends.html169
-rw-r--r--dom/canvas/test/webgl-mochitest/test_canvas_size.html54
-rw-r--r--dom/canvas/test/webgl-mochitest/test_capture.html213
-rw-r--r--dom/canvas/test/webgl-mochitest/test_cubemap_must_be_square.html35
-rw-r--r--dom/canvas/test/webgl-mochitest/test_depth_readpixels.html60
-rw-r--r--dom/canvas/test/webgl-mochitest/test_depth_tex_lazy_clear.html73
-rw-r--r--dom/canvas/test/webgl-mochitest/test_draw.html125
-rw-r--r--dom/canvas/test/webgl-mochitest/test_draw_fakevert_large_offset.html71
-rw-r--r--dom/canvas/test/webgl-mochitest/test_fb_param.html47
-rw-r--r--dom/canvas/test/webgl-mochitest/test_fb_param_crash.html41
-rw-r--r--dom/canvas/test/webgl-mochitest/test_fuzzing_bugs.html195
-rw-r--r--dom/canvas/test/webgl-mochitest/test_has_rbab.html40
-rw-r--r--dom/canvas/test/webgl-mochitest/test_hidden_alpha.html156
-rw-r--r--dom/canvas/test/webgl-mochitest/test_hidden_depth_stencil.html159
-rw-r--r--dom/canvas/test/webgl-mochitest/test_highp_fs.html55
-rw-r--r--dom/canvas/test/webgl-mochitest/test_imagedata_transfered_arraybuffer.html24
-rw-r--r--dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html199
-rw-r--r--dom/canvas/test/webgl-mochitest/test_no_arr_points.html156
-rw-r--r--dom/canvas/test/webgl-mochitest/test_noprog_draw.html74
-rw-r--r--dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html288
-rw-r--r--dom/canvas/test/webgl-mochitest/test_privileged_exts.html31
-rw-r--r--dom/canvas/test/webgl-mochitest/test_read_pixels_no_format.html27
-rw-r--r--dom/canvas/test/webgl-mochitest/test_renderer_strings.html248
-rw-r--r--dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html190
-rw-r--r--dom/canvas/test/webgl-mochitest/test_tex_large_uploads.html94
-rw-r--r--dom/canvas/test/webgl-mochitest/test_tex_pbo.html100
-rw-r--r--dom/canvas/test/webgl-mochitest/test_tex_unit_different_sampler_types.html54
-rw-r--r--dom/canvas/test/webgl-mochitest/test_texsubimage_float.html56
-rw-r--r--dom/canvas/test/webgl-mochitest/test_uninit_data.html84
-rw-r--r--dom/canvas/test/webgl-mochitest/test_vertexattrib4f_update.html62
-rw-r--r--dom/canvas/test/webgl-mochitest/test_video_fastpath.js34
-rw-r--r--dom/canvas/test/webgl-mochitest/test_video_fastpath_mp4.html21
-rw-r--r--dom/canvas/test/webgl-mochitest/test_video_fastpath_theora.html21
-rw-r--r--dom/canvas/test/webgl-mochitest/test_video_fastpath_vp8.html21
-rw-r--r--dom/canvas/test/webgl-mochitest/test_video_fastpath_vp9.html21
-rw-r--r--dom/canvas/test/webgl-mochitest/test_webgl2_alpha_luminance.html114
-rw-r--r--dom/canvas/test/webgl-mochitest/test_webgl2_invalidate_framebuffer.html27
-rw-r--r--dom/canvas/test/webgl-mochitest/test_webgl2_not_exposed.html37
-rw-r--r--dom/canvas/test/webgl-mochitest/test_webgl2_uniform_block.html86
-rw-r--r--dom/canvas/test/webgl-mochitest/test_webgl_available.html19
-rw-r--r--dom/canvas/test/webgl-mochitest/test_webgl_compressed_texture_es3.html751
-rw-r--r--dom/canvas/test/webgl-mochitest/test_webgl_fingerprinting_resistance.html47
-rw-r--r--dom/canvas/test/webgl-mochitest/test_webgl_force_enable.html49
-rw-r--r--dom/canvas/test/webgl-mochitest/test_webgl_request_context.html36
-rw-r--r--dom/canvas/test/webgl-mochitest/test_webgl_request_mismatch.html90
-rw-r--r--dom/canvas/test/webgl-mochitest/test_webglcontextcreationerror.html66
-rw-r--r--dom/canvas/test/webgl-mochitest/test_without_index_validation.html86
-rw-r--r--dom/canvas/test/webgl-mochitest/webgl-util.js137
87 files changed, 9439 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-mochitest/blank_15000x10000.png b/dom/canvas/test/webgl-mochitest/blank_15000x10000.png
new file mode 100644
index 0000000000..2b72ff9180
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/blank_15000x10000.png
Binary files differ
diff --git a/dom/canvas/test/webgl-mochitest/driver-info.js b/dom/canvas/test/webgl-mochitest/driver-info.js
new file mode 100644
index 0000000000..5e68ce50ba
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/driver-info.js
@@ -0,0 +1,139 @@
+DriverInfo = (function () {
+ // ---------------------------------------------------------------------------
+ // Debug info handling
+
+ function info(str) {
+ window.console.log("Info: " + str);
+ }
+
+ // ---------------------------------------------------------------------------
+ // OS and driver identification
+ // Stolen from dom/canvas/test/webgl/test_webgl_conformance_test_suite.html
+ function detectDriverInfo() {
+ var canvas = document.createElement("canvas");
+ canvas.width = 1;
+ canvas.height = 1;
+
+ var type = "";
+ var gl = null;
+ try {
+ gl = canvas.getContext("experimental-webgl");
+ } catch (e) {}
+
+ if (!gl) {
+ info("Failed to create WebGL context for querying driver info.");
+ throw "WebGL failed";
+ }
+
+ var ext = gl.getExtension("WEBGL_debug_renderer_info");
+ if (!ext) {
+ throw "WEBGL_debug_renderer_info not available";
+ }
+
+ var webglRenderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
+ return webglRenderer;
+ }
+
+ function detectOSInfo() {
+ var os = null;
+ var version = null;
+ if (navigator.platform.indexOf("Win") == 0) {
+ os = OS.WINDOWS;
+
+ var versionMatch = /Windows NT (\d+.\d+)/.exec(navigator.userAgent);
+ version = versionMatch ? parseFloat(versionMatch[1]) : null;
+ // Version 6.0 is Vista, 6.1 is 7.
+ } else if (navigator.platform.indexOf("Mac") == 0) {
+ os = OS.MAC;
+
+ var versionMatch = /Mac OS X (\d+.\d+)/.exec(navigator.userAgent);
+ version = versionMatch ? parseFloat(versionMatch[1]) : null;
+ } else if (navigator.appVersion.includes("Android")) {
+ os = OS.ANDROID;
+
+ try {
+ // From layout/tools/reftest/reftest.js:
+ version = SpecialPowers.Services.sysinfo.getProperty("version");
+ } catch (e) {
+ info("No SpecialPowers: can't query android version");
+ }
+ } else if (navigator.platform.indexOf("Linux") == 0) {
+ // Must be checked after android, as android also has a 'Linux' platform string.
+ os = OS.LINUX;
+ }
+
+ return [os, version];
+ }
+
+ var OS = {
+ WINDOWS: "windows",
+ MAC: "mac",
+ LINUX: "linux",
+ ANDROID: "android",
+ };
+
+ var DRIVER = {
+ INTEL: "intel",
+ MESA: "mesa",
+ NVIDIA: "nvidia",
+ ANDROID_X86_EMULATOR: "android x86 emulator",
+ ANGLE: "angle",
+ };
+
+ var kOS = null;
+ var kOSVersion = null;
+ var kRawDriver = null;
+ var kDriver = null;
+
+ try {
+ [kOS, kOSVersion] = detectOSInfo();
+ } catch (e) {
+ // Generally just fails when we don't have SpecialPowers.
+ }
+
+ try {
+ kRawDriver = detectDriverInfo();
+
+ if (kRawDriver.includes("llvmpipe")) {
+ kDriver = DRIVER.MESA;
+ } else if (kRawDriver.includes("Android Emulator")) {
+ kDriver = DRIVER.ANDROID_X86_EMULATOR;
+ } else if (kRawDriver.includes("ANGLE")) {
+ kDriver = DRIVER.ANGLE;
+ } else if (kRawDriver.includes("NVIDIA")) {
+ kDriver = DRIVER.NVIDIA;
+ } else if (kRawDriver.includes("Intel")) {
+ kDriver = DRIVER.INTEL;
+ }
+ } catch (e) {
+ // detectDriverInfo is fallible where WebGL fails.
+ }
+
+ function dump(line_out_func) {
+ let lines = [
+ "[DriverInfo] userAgent: " + navigator.userAgent,
+ "[DriverInfo] kRawDriver: " + kRawDriver,
+ "[DriverInfo] kDriver: " + kDriver,
+ "[DriverInfo] kOS: " + kOS,
+ "[DriverInfo] kOSVersion: " + kOSVersion,
+ ];
+ lines.forEach(line_out_func);
+ }
+
+ dump(x => console.log(x));
+
+ return {
+ DRIVER,
+ OS,
+ dump,
+ getDriver() {
+ return kDriver;
+ },
+ getOS() {
+ return kOS;
+ },
+ getOSVersion() {
+ return kOSVersion;
+ },
+ };
+})();
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/ensure-ext.js b/dom/canvas/test/webgl-mochitest/ensure-exts/ensure-ext.js
new file mode 100644
index 0000000000..850a27caaf
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/ensure-ext.js
@@ -0,0 +1,42 @@
+"use strict";
+
+function EnsureExt(extName, shouldHave = true) {
+ EnsureExtFor("webgl", extName, shouldHave);
+ EnsureExtFor("webgl2", extName, shouldHave);
+}
+
+function EnsureExtFor(contextType, extName, shouldHave = true) {
+ var c = document.createElement("canvas");
+ var gl = c.getContext(contextType);
+
+ if (!gl) {
+ todo(false, "Failed to create context: " + contextType);
+ return;
+ }
+
+ var ext = gl.getExtension(extName);
+ var haveText = " have " + contextType + " extension " + extName + ".";
+ if (shouldHave) {
+ ok(ext, "Should" + haveText);
+ } else {
+ ok(!ext, "Should not" + haveText);
+ }
+}
+
+function Lastly_WithDraftExtsEnabled(func) {
+ SimpleTest.waitForExplicitFinish();
+
+ var fnEnsure = function () {
+ func();
+ SimpleTest.finish();
+ };
+
+ if ("SpecialPowers" in window) {
+ var prefStateList = [["webgl.enable-draft-extensions", true]];
+ var prefEnv = { set: prefStateList };
+ SpecialPowers.pushPrefEnv(prefEnv, fnEnsure);
+ } else {
+ console.log("Couldn't use SpecialPowers to enable draft extensions.");
+ fnEnsure();
+ }
+}
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_ANGLE_instanced_arrays.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_ANGLE_instanced_arrays.html
new file mode 100644
index 0000000000..5905539a49
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_ANGLE_instanced_arrays.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'ANGLE_instanced_arrays');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_blend_minmax.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_blend_minmax.html
new file mode 100644
index 0000000000..46b135b799
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_blend_minmax.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'EXT_blend_minmax');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_color_buffer_half_float.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_color_buffer_half_float.html
new file mode 100644
index 0000000000..443c7ab70a
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_color_buffer_half_float.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'EXT_color_buffer_half_float');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_disjoint_timer_query.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_disjoint_timer_query.html
new file mode 100644
index 0000000000..af94cbc658
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_disjoint_timer_query.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExt('EXT_disjoint_timer_query');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_float_blend.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_float_blend.html
new file mode 100644
index 0000000000..9da0d761ab
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_float_blend.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+
+EnsureExt('EXT_float_blend');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_frag_depth.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_frag_depth.html
new file mode 100644
index 0000000000..9dbac9881b
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_frag_depth.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'EXT_frag_depth');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_sRGB.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_sRGB.html
new file mode 100644
index 0000000000..cbdde000ac
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_sRGB.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'EXT_sRGB');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_shader_texture_lod.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_shader_texture_lod.html
new file mode 100644
index 0000000000..c3a51c0c9d
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_shader_texture_lod.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'EXT_shader_texture_lod');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_bptc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_bptc.html
new file mode 100644
index 0000000000..2323da591d
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_bptc.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExt('EXT_texture_compression_bptc');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_rgtc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_rgtc.html
new file mode 100644
index 0000000000..dbba5382ce
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_rgtc.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExt('EXT_texture_compression_rgtc');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_filter_anisotropic.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_filter_anisotropic.html
new file mode 100644
index 0000000000..877c4440bf
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_filter_anisotropic.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExt('EXT_texture_filter_anisotropic');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_norm16.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_norm16.html
new file mode 100644
index 0000000000..0a636dc674
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_norm16.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'EXT_texture_norm16', false);
+EnsureExtFor('webgl2', 'EXT_texture_norm16', false);
+
+Lastly_WithDraftExtsEnabled(() => {
+ EnsureExtFor('webgl', 'EXT_texture_norm16', false);
+ EnsureExtFor('webgl2', 'EXT_texture_norm16', true);
+});
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_draw_buffers_indexed.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_draw_buffers_indexed.html
new file mode 100644
index 0000000000..1d5b8b7341
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_draw_buffers_indexed.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'OES_draw_buffers_indexed', false);
+EnsureExtFor('webgl2', 'OES_draw_buffers_indexed', true);
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_fbo_render_mipmap.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_fbo_render_mipmap.html
new file mode 100644
index 0000000000..e0439d3fa8
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_fbo_render_mipmap.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+
+EnsureExtFor('webgl', 'OES_fbo_render_mipmap');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_standard_derivatives.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_standard_derivatives.html
new file mode 100644
index 0000000000..359726256a
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_standard_derivatives.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'OES_standard_derivatives');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_OVR_multiview2.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OVR_multiview2.html
new file mode 100644
index 0000000000..4a44a20611
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OVR_multiview2.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+
+EnsureExtFor('webgl2', 'OVR_multiview2');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_color_buffer_float.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_color_buffer_float.html
new file mode 100644
index 0000000000..9a88b27712
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_color_buffer_float.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'WEBGL_color_buffer_float');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_astc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_astc.html
new file mode 100644
index 0000000000..6a9d720024
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_astc.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExt('WEBGL_compressed_texture_astc');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc.html
new file mode 100644
index 0000000000..7adaafbc82
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExt('WEBGL_compressed_texture_etc');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc1.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc1.html
new file mode 100644
index 0000000000..327625c018
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc1.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExt('WEBGL_compressed_texture_etc1');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_pvrtc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_pvrtc.html
new file mode 100644
index 0000000000..c954813984
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_pvrtc.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExt('WEBGL_compressed_texture_pvrtc');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_s3tc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_s3tc.html
new file mode 100644
index 0000000000..6ad8001106
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_s3tc.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExt('WEBGL_compressed_texture_s3tc');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_depth_texture.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_depth_texture.html
new file mode 100644
index 0000000000..6d8a864c00
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_depth_texture.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'WEBGL_depth_texture');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_draw_buffers.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_draw_buffers.html
new file mode 100644
index 0000000000..0683516350
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_draw_buffers.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'WEBGL_draw_buffers');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_provoking_vertex.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_provoking_vertex.html
new file mode 100644
index 0000000000..76af23b87f
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_provoking_vertex.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+EnsureExtFor('webgl', 'WEBGL_provoking_vertex');
+EnsureExtFor('webgl2', 'WEBGL_provoking_vertex');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_common.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_common.html
new file mode 100644
index 0000000000..8620a66f83
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_common.html
@@ -0,0 +1,128 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script>
+
+'use strict';
+
+var ENSURE = 'ENSURE'; // Works on all test machines.
+var FORBID = 'FORBID'; // Should not work on any test machine.
+var MACHINE_SPECIFIC = 'MACHINE_SPECIFIC';
+
+var defaultExts = [
+ // Ratified
+ ['ANGLE_instanced_arrays' , [MACHINE_SPECIFIC, FORBID ]],
+ ['EXT_blend_minmax' , [MACHINE_SPECIFIC, FORBID ]],
+ ['EXT_frag_depth' , [MACHINE_SPECIFIC, FORBID ]],
+ ['EXT_shader_texture_lod' , [MACHINE_SPECIFIC, FORBID ]],
+ ['EXT_texture_filter_anisotropic', [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['OES_element_index_uint' , [ENSURE , FORBID ]],
+ ['OES_fbo_render_mipmap' , [MACHINE_SPECIFIC, FORBID ]],
+ ['OES_standard_derivatives' , [MACHINE_SPECIFIC, FORBID ]],
+ ['OES_texture_float' , [ENSURE , FORBID ]],
+ ['OES_texture_float_linear' , [ENSURE , ENSURE ]],
+ ['OES_texture_half_float' , [ENSURE , FORBID ]],
+ ['OES_texture_half_float_linear' , [ENSURE , FORBID ]],
+ ['OES_vertex_array_object' , [ENSURE , FORBID ]],
+ ['WEBGL_compressed_texture_s3tc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['WEBGL_debug_renderer_info' , [ENSURE , ENSURE ]],
+ ['WEBGL_debug_shaders' , [ENSURE , ENSURE ]],
+ ['WEBGL_depth_texture' , [MACHINE_SPECIFIC, FORBID ]],
+ ['WEBGL_draw_buffers' , [MACHINE_SPECIFIC, FORBID ]],
+ ['WEBGL_lose_context' , [ENSURE , ENSURE ]],
+
+ // Community Approved
+ ['EXT_color_buffer_float' , [FORBID , ENSURE ]],
+ ['EXT_color_buffer_half_float' , [MACHINE_SPECIFIC, FORBID ]],
+ ['EXT_disjoint_timer_query' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['EXT_float_blend' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['EXT_sRGB' , [MACHINE_SPECIFIC, FORBID ]],
+ ['EXT_texture_compression_bptc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['EXT_texture_compression_rgtc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['OES_draw_buffers_indexed' , [FORBID , MACHINE_SPECIFIC]],
+ ['OVR_multiview2' , [FORBID , MACHINE_SPECIFIC]],
+ ['WEBGL_color_buffer_float' , [MACHINE_SPECIFIC, FORBID ]],
+ ['WEBGL_compressed_texture_astc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['WEBGL_compressed_texture_atc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['WEBGL_compressed_texture_etc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['WEBGL_compressed_texture_etc1' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['WEBGL_compressed_texture_pvrtc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['WEBGL_compressed_texture_s3tc_srgb', [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+ ['WEBGL_provoking_vertex' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]],
+];
+
+var draftExts = [
+ ['EXT_texture_norm16' , [FORBID , MACHINE_SPECIFIC]],
+ ['WEBGL_explicit_present' , [ENSURE , ENSURE ]],
+];
+
+////////////////////
+// Ensure that we never see any extensions that we haven't listed above!
+
+(function() {
+ const expectedExts = (defaultExts.concat(draftExts)).map(x => x[0]);
+
+ ['webgl', 'webgl2'].forEach( contextType => {
+ const c = document.createElement('canvas');
+ const gl = c.getContext(contextType);
+ if (!gl) return;
+
+ const actualExts = gl.getSupportedExtensions();
+ actualExts.forEach(actualExt => {
+ ok(expectedExts.includes(actualExt), 'Unexpected ext: ' + actualExt);
+ });
+ });
+})();
+
+////////////////////
+
+function TestExtFor(contextType, extName, status) {
+ switch (status) {
+ case ENSURE:
+ EnsureExtFor(contextType, extName);
+ break;
+
+ case FORBID:
+ EnsureExtFor(contextType, extName, false);
+ break;
+
+ case MACHINE_SPECIFIC:
+ break;
+ }
+}
+
+function TestExt(extName, statusArr) {
+ TestExtFor('webgl', extName, statusArr[0]);
+ TestExtFor('webgl2', extName, statusArr[1]);
+}
+
+////////////////////
+
+defaultExts.forEach(function(x) {
+ var extName = x[0];
+ var statusArr = x[1];
+ TestExt(extName, statusArr);
+});
+
+draftExts.forEach(function(x) {
+ var extName = x[0];
+ EnsureExt(extName, false);
+});
+
+Lastly_WithDraftExtsEnabled(function() {
+ draftExts.forEach(function(x) {
+ var extName = x[0];
+ var statusArr = x[1];
+ TestExt(extName, statusArr);
+ });
+});
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_implicit.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_implicit.html
new file mode 100644
index 0000000000..e3ce1ad130
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_implicit.html
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='ensure-ext.js'></script>
+ </head>
+ <body>
+ <script id='g_vs' type='text/plain'>
+
+void main() {
+ gl_PointSize = 1.0;
+}
+
+ </script>
+ <script id='g_fs' type='text/plain'>
+
+void main() {
+ gl_FragColor = vec4(0);
+}
+
+ </script>
+ <script>
+
+'use strict';
+
+let gl = null;
+
+function CheckTexFloatRenderable(rgbaInternal, type) {
+ const tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ gl.texImage2D(gl.TEXTURE_2D, 0, rgbaInternal, 1, 1, 0, gl.RGBA, type, null);
+
+ const fb = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
+ return gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE;
+}
+
+function CheckRbFloatRenderable(format) {
+ const rb = gl.createRenderbuffer();
+ gl.bindRenderbuffer(gl.RENDERBUFFER, rb);
+ gl.renderbufferStorage(gl.RENDERBUFFER, format, 1, 1);
+
+ const fb = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rb);
+ return gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE;
+}
+
+function CheckBlending() {
+ function CompileShader(type, elem) {
+ const text = elem.innerHTML.trim();
+ const s = gl.createShader(type);
+ gl.shaderSource(s, text);
+ gl.compileShader(s);
+ return s;
+ }
+
+ const vs = CompileShader(gl.VERTEX_SHADER, g_vs);
+ const fs = CompileShader(gl.FRAGMENT_SHADER, g_fs);
+ const p = gl.createProgram();
+ gl.attachShader(p, vs);
+ gl.attachShader(p, fs);
+ gl.linkProgram(p);
+ gl.useProgram(p);
+
+ gl.drawArrays(gl.POINTS, 0, 1);
+ if (gl.getError()) throw new Error('Unexpected GL error,');
+
+ gl.enable(gl.BLEND);
+ gl.drawArrays(gl.POINTS, 0, 1);
+ return gl.getError() == 0;
+}
+
+function ResetGl(type) {
+ if (gl) {
+ const ext = gl.getExtension('WEBGL_lose_context');
+ ext.loseContext();
+ gl = null;
+ }
+ const c = document.createElement('canvas');
+ gl = c.getContext(type);
+ return !!gl;
+}
+
+function HasExt(name) {
+ return gl.getSupportedExtensions().indexOf(name) != -1;
+}
+
+ResetGl('webgl');
+if (HasExt('EXT_color_buffer_half_float')) {
+ const ext = gl.getExtension('OES_texture_half_float');
+ const implicitEnabled = CheckTexFloatRenderable(gl.RGBA, ext.HALF_FLOAT_OES);
+ ok(implicitEnabled, 'OES_texture_half_float should implicitly enable EXT_color_buffer_half_float.');
+}
+
+ResetGl('webgl');
+if (HasExt('WEBGL_color_buffer_float')) {
+ const ext = gl.getExtension('OES_texture_float');
+ const implicitEnabled = CheckTexFloatRenderable(gl.RGBA, gl.FLOAT);
+ ok(implicitEnabled, 'OES_texture_float should implicitly enable WEBGL_color_buffer_float.');
+
+ if (HasExt('EXT_float_blend')) {
+ ok(CheckBlending(), 'OES_texture_float should implicitly enable EXT_float_blend.');
+ }
+}
+
+ResetGl('webgl');
+if (HasExt('EXT_float_blend')) {
+ const ext = gl.getExtension('WEBGL_color_buffer_float');
+ CheckRbFloatRenderable(ext.RGBA32F_EXT);
+ const implicitEnabled = CheckBlending();
+ ok(implicitEnabled, 'WEBGL_color_buffer_float should implicitly enable EXT_float_blend.');
+}
+
+if (ResetGl('webgl2')) {
+ if (HasExt('EXT_float_blend')) {
+ const ext = gl.getExtension('EXT_color_buffer_float');
+ CheckTexFloatRenderable(gl.RGBA32F, gl.FLOAT);
+ const implicitEnabled = CheckBlending();
+ ok(implicitEnabled, 'EXT_color_buffer_float should implicitly enable EXT_float_blend.');
+ }
+}
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/es3-data.js b/dom/canvas/test/webgl-mochitest/es3-data.js
new file mode 100644
index 0000000000..a2c11c3ae8
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/es3-data.js
@@ -0,0 +1,3221 @@
+// The compressed data are created by Mali GPU Texture Compression Tool
+// (http://malideveloper.arm.com/resources/tools/mali-gpu-texture-compression-tool/).
+// Simply convert image to ktx format then strip the ktx header to
+// get compressed data.
+//
+// The decompressed data are create by Khronos KTX library and tools
+// (https://github.com/KhronosGroup/KTX)
+// Calling _ktxUnpackETC with previous generated compressed data to
+// get decompressed data.
+
+var img_4x4_r11_eac = {
+ compressed: new Uint8Array([0x0f, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff]),
+ decompressed: new Uint8Array([
+ 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff,
+ 0x4b, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff,
+ ]),
+};
+
+var img_4x4_signed_r11_eac = {
+ compressed: new Uint8Array([0x90, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff]),
+ decompressed: new Uint8Array([
+ 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff,
+ 0x4c, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff,
+ ]),
+};
+
+var img_4x4_rg11_eac = {
+ compressed: new Uint8Array([
+ 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0x2e, 0xf0, 0x3c, 0xff,
+ 0xcf, 0x24, 0xff, 0xff,
+ ]),
+ decompressed: new Uint8Array([
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff,
+ ]),
+};
+
+var img_4x4_signed_rg11_eac = {
+ compressed: new Uint8Array([
+ 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0xae, 0xf0, 0x3c, 0xff,
+ 0xcf, 0x24, 0xff, 0xff,
+ ]),
+ decompressed: new Uint8Array([
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff,
+ ]),
+};
+
+var img_4x4_rgb_etc2 = {
+ compressed: new Uint8Array([0x04, 0xf0, 0xf0, 0x02, 0x07, 0x45, 0x00, 0x00]),
+ decompressed: new Uint8Array([
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff,
+ ]),
+};
+
+var img_4x4_rgb_punchthrough_etc2 = {
+ compressed: new Uint8Array([0x04, 0xf0, 0xf0, 0x00, 0xbf, 0x5f, 0x02, 0x05]),
+ decompressed: new Uint8Array([
+ 0xfc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
+ 0xfc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ ]),
+};
+
+var img_4x4_rgba_etc2 = {
+ compressed: new Uint8Array([
+ 0x44, 0x89, 0x69, 0x24, 0x41, 0x43, 0x04, 0x41, 0x04, 0xf0, 0xf0, 0x02,
+ 0x07, 0x45, 0x00, 0x00,
+ ]),
+ decompressed: new Uint8Array([
+ 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x04, 0xff, 0x00, 0x00, 0x04,
+ 0x00, 0xff, 0x00, 0x04, 0x00, 0xff, 0x00, 0x04, 0x00, 0xff, 0x00, 0x1c,
+ 0xff, 0x00, 0x00, 0x34, 0x00, 0xff, 0x00, 0x1c, 0xff, 0x00, 0x00, 0x04,
+ 0xff, 0x00, 0x00, 0x34, 0xff, 0x00, 0x00, 0x7c, 0x00, 0xff, 0x00, 0x34,
+ 0x00, 0xff, 0x00, 0x04, 0x00, 0xff, 0x00, 0x1c, 0x00, 0xff, 0x00, 0x34,
+ 0x00, 0xff, 0x00, 0x1c,
+ ]),
+};
+
+var img_8x8_r11_eac = {
+ compressed: new Uint8Array([
+ 0x0f, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff, 0x5e, 0xb3, 0xeb, 0xa4,
+ 0xba, 0xff, 0xa4, 0x92, 0x00, 0xf6, 0xfb, 0xed, 0xbe, 0xff, 0xed, 0xb6,
+ 0x2c, 0xfd, 0x1c, 0x7f, 0xc7, 0x00, 0x7f, 0xff,
+ ]),
+ decompressed: new Uint8Array([
+ 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff,
+ 0xe2, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff,
+ 0x1c, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff,
+ 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff,
+ 0xe2, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff,
+ 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x69, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0xb3, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff,
+ 0xb3, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x69, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff,
+ 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff,
+ 0xb3, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff,
+ 0xb3, 0x00, 0x00, 0xff,
+ ]),
+};
+
+var img_8x8_signed_r11_eac = {
+ compressed: new Uint8Array([
+ 0x90, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff, 0xdf, 0xb3, 0xeb, 0xa4,
+ 0xba, 0xff, 0xa4, 0x92, 0xfb, 0x20, 0xeb, 0xa4, 0xba, 0xff, 0xa4, 0x92,
+ 0xac, 0xfd, 0x1c, 0x7f, 0xc7, 0x00, 0x7f, 0xff,
+ ]),
+ decompressed: new Uint8Array([
+ 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0xe2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff,
+ 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff,
+ 0xe2, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x69, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0xb2, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff,
+ 0xb2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff,
+ 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff,
+ 0x69, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff,
+ 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff,
+ 0xb2, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff,
+ 0xb2, 0x00, 0x00, 0xff,
+ ]),
+};
+
+var img_8x8_rg11_eac = {
+ compressed: new Uint8Array([
+ 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0x2e, 0xf0, 0x3c, 0xff,
+ 0xcf, 0x24, 0xff, 0xff, 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49,
+ 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0x2e, 0xf0, 0x3c, 0xff,
+ 0xcf, 0x24, 0xff, 0xff, 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49,
+ 0x00, 0x00, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x2e, 0xf0, 0x3c, 0xff,
+ 0xcf, 0x24, 0xff, 0xff,
+ ]),
+ decompressed: new Uint8Array([
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff,
+ 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff,
+ ]),
+};
+
+var img_8x8_signed_rg11_eac = {
+ compressed: new Uint8Array([
+ 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0xae, 0xf0, 0x3c, 0xff,
+ 0xcf, 0x24, 0xff, 0xff, 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49,
+ 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0xae, 0xf0, 0x3c, 0xff,
+ 0xcf, 0x24, 0xff, 0xff, 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49,
+ 0x80, 0x00, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0xae, 0xf0, 0x3c, 0xff,
+ 0xcf, 0x24, 0xff, 0xff,
+ ]),
+ decompressed: new Uint8Array([
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff,
+ 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff,
+ ]),
+};
+
+var img_8x8_rgb_etc2 = {
+ compressed: new Uint8Array([
+ 0x04, 0xf0, 0xf0, 0x02, 0x07, 0x45, 0x00, 0x00, 0x04, 0x0f, 0xff, 0x02,
+ 0x07, 0x45, 0x00, 0x00, 0x04, 0xf0, 0xf0, 0xf2, 0xf8, 0xba, 0x00, 0x00,
+ 0x04, 0x0f, 0x0f, 0xf2, 0xf8, 0xba, 0x00, 0x00,
+ ]),
+ decompressed: new Uint8Array([
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff,
+ 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff,
+ 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff,
+ 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff,
+ 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff,
+ 0x00, 0xff, 0xff, 0xff,
+ ]),
+};
+
+var img_8x8_rgb_punchthrough_etc2 = {
+ compressed: new Uint8Array([
+ 0x04, 0xf0, 0xf0, 0x00, 0x5f, 0xef, 0x01, 0x44, 0xfb, 0xf0, 0x00, 0xf0,
+ 0xfd, 0xfa, 0x10, 0x80, 0xfb, 0x0f, 0x0f, 0x00, 0x7f, 0x6f, 0x02, 0x40,
+ 0x04, 0xff, 0x00, 0xf0, 0xf7, 0x6d, 0x05, 0x04,
+ ]),
+ decompressed: new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xfc, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfc, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00,
+ ]),
+};
+
+var img_8x8_rgba_etc2 = {
+ compressed: new Uint8Array([
+ 0x35, 0x83, 0x6d, 0x26, 0x88, 0x46, 0x64, 0x37, 0x04, 0xf0, 0xf0, 0x02,
+ 0x07, 0x45, 0x00, 0x00, 0x69, 0xa8, 0x66, 0x76, 0x45, 0x68, 0x86, 0xd1,
+ 0x04, 0x0f, 0xff, 0x02, 0x07, 0x45, 0x00, 0x00, 0x69, 0xa8, 0x6d, 0xb2,
+ 0x53, 0x80, 0xaf, 0x41, 0x04, 0xf0, 0xf0, 0xf2, 0xf8, 0xba, 0x00, 0x00,
+ 0x8c, 0xca, 0xf4, 0x2b, 0x0a, 0x05, 0x34, 0x9b, 0x04, 0x0f, 0x0f, 0xf2,
+ 0xf8, 0xba, 0x00, 0x00,
+ ]),
+ decompressed: new Uint8Array([
+ 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x05,
+ 0x00, 0xff, 0x00, 0x05, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0xff, 0x05,
+ 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x05, 0xff, 0x00, 0x00, 0x15, 0x00, 0xff, 0x00, 0x25,
+ 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, 0x2d, 0xff, 0xff, 0x00, 0x19,
+ 0x00, 0x00, 0xff, 0x05, 0xff, 0x00, 0x00, 0x05, 0xff, 0x00, 0x00, 0x15,
+ 0xff, 0x00, 0x00, 0x3d, 0x00, 0xff, 0x00, 0x5d, 0xff, 0xff, 0x00, 0x73,
+ 0xff, 0xff, 0x00, 0x55, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0xff, 0x19,
+ 0x00, 0xff, 0x00, 0x05, 0x00, 0xff, 0x00, 0x25, 0x00, 0xff, 0x00, 0x5d,
+ 0x00, 0xff, 0x00, 0x95, 0x00, 0x00, 0xff, 0xc3, 0x00, 0x00, 0xff, 0x9b,
+ 0x00, 0x00, 0xff, 0x55, 0x00, 0x00, 0xff, 0x2d, 0x00, 0xff, 0x00, 0x05,
+ 0xff, 0x00, 0xff, 0x2d, 0x00, 0xff, 0x00, 0x73, 0xff, 0x00, 0xff, 0xc3,
+ 0x00, 0x00, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xb0, 0x00, 0x00, 0xff, 0x74,
+ 0x00, 0xff, 0xff, 0x2c, 0xff, 0x00, 0xff, 0x05, 0xff, 0x00, 0xff, 0x2d,
+ 0x00, 0xff, 0x00, 0x55, 0xff, 0x00, 0xff, 0x9b, 0x00, 0xff, 0xff, 0xb0,
+ 0x00, 0xff, 0xff, 0x98, 0x00, 0x00, 0xff, 0x5c, 0x00, 0xff, 0xff, 0x2c,
+ 0x00, 0xff, 0x00, 0x05, 0x00, 0xff, 0x00, 0x19, 0x00, 0xff, 0x00, 0x2d,
+ 0xff, 0x00, 0xff, 0x55, 0x00, 0x00, 0xff, 0x74, 0x00, 0x00, 0xff, 0x5c,
+ 0x00, 0x00, 0xff, 0x2c, 0x00, 0xff, 0xff, 0x14, 0xff, 0x00, 0xff, 0x05,
+ 0xff, 0x00, 0xff, 0x05, 0xff, 0x00, 0xff, 0x19, 0xff, 0x00, 0xff, 0x2d,
+ 0x00, 0xff, 0xff, 0x2c, 0x00, 0xff, 0xff, 0x2c, 0x00, 0xff, 0xff, 0x14,
+ 0x00, 0xff, 0xff, 0x14,
+ ]),
+};
+
+/* This image exercises every ETC2 block type */
+var img_32x32_r11_eac = {
+ compressed: new Uint8Array([
+ 0x6e, 0x61, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, 0x21, 0x32, 0xf2, 0x8d,
+ 0x01, 0xf0, 0x9f, 0x02, 0x2b, 0x4b, 0xd0, 0x9d, 0x41, 0xf0, 0x29, 0x12,
+ 0x1f, 0x30, 0xc0, 0x2e, 0x0a, 0xf0, 0xad, 0x02, 0x20, 0x34, 0xf0, 0x1b,
+ 0x42, 0xb6, 0x1a, 0x02, 0x1e, 0x34, 0xb0, 0x8d, 0x0a, 0xb0, 0x3f, 0x0a,
+ 0x2a, 0x21, 0xf1, 0xbf, 0x1a, 0xf1, 0x3e, 0x0b, 0x47, 0x32, 0x29, 0xb0,
+ 0x52, 0xb0, 0x1f, 0xac, 0x31, 0x4f, 0x9f, 0xc0, 0x49, 0x49, 0xb0, 0xdb,
+ 0x0a, 0x23, 0xda, 0x1c, 0x08, 0x18, 0x90, 0x21, 0x08, 0x2d, 0x08, 0x0c,
+ 0x92, 0x91, 0x22, 0x4a, 0x04, 0x00, 0x40, 0x70, 0x87, 0x40, 0x30, 0x9f,
+ 0x0c, 0x1c, 0x61, 0x30, 0xd2, 0x61, 0x3a, 0x83, 0x12, 0x14, 0x81, 0x9c,
+ 0x8b, 0x50, 0xb4, 0x39, 0x1a, 0x28, 0x66, 0x00, 0x64, 0xa0, 0x51, 0x45,
+ 0x2e, 0x33, 0x42, 0x02, 0x64, 0xb6, 0xdf, 0xff, 0x34, 0x31, 0x82, 0x62,
+ 0x08, 0x48, 0xb6, 0x9b, 0x07, 0x2d, 0xa3, 0x45, 0x60, 0x2b, 0x10, 0x44,
+ 0x08, 0x18, 0x67, 0x12, 0x86, 0x24, 0x92, 0x5b, 0x02, 0x00, 0xe0, 0x3e,
+ 0x10, 0xe9, 0x74, 0xd5, 0x08, 0x1c, 0x09, 0x44, 0x88, 0x84, 0xe9, 0xa4,
+ 0x16, 0x19, 0x4a, 0xdf, 0x6d, 0xbe, 0xd7, 0x6d, 0x20, 0x11, 0x4f, 0xe6,
+ 0xb6, 0xef, 0x6f, 0xf6, 0x2f, 0x44, 0xb2, 0xc9, 0x24, 0xbb, 0x6f, 0xff,
+ 0x2c, 0x41, 0xdb, 0xf9, 0x65, 0x12, 0x44, 0x8c, 0x07, 0x13, 0x09, 0x54,
+ 0xdb, 0x29, 0xb4, 0x9a, 0x01, 0x02, 0x6c, 0xf2, 0xd9, 0xb5, 0xbb, 0x6d,
+ 0x0e, 0x15, 0x64, 0x96, 0x40, 0x28, 0x41, 0x24, 0x14, 0x13, 0x6a, 0x48,
+ 0xe7, 0x5e, 0x7f, 0xbe, 0x1e, 0x19, 0x92, 0x69, 0xa6, 0x87, 0x4f, 0xff,
+ 0x36, 0x14, 0x6d, 0x14, 0x40, 0x12, 0x5b, 0xb7, 0x54, 0x2b, 0x6d, 0xa4,
+ 0x91, 0x00, 0x0b, 0x6d, 0x19, 0x43, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x09,
+ 0x10, 0x21, 0xf0, 0x10, 0x00, 0x44, 0x04, 0x91, 0x01, 0x23, 0x92, 0x49,
+ 0x34, 0x9b, 0x69, 0x37, 0x11, 0x18, 0x6c, 0x00, 0x07, 0xe2, 0xdf, 0xed,
+ 0x21, 0x23, 0x40, 0x28, 0x84, 0xd0, 0x49, 0xb0, 0x13, 0x36, 0x9b, 0x6d,
+ 0x36, 0xdf, 0xff, 0xff, 0x38, 0x17, 0x26, 0x49, 0xb6, 0xda, 0xdf, 0xfe,
+ 0x60, 0x44, 0x49, 0x22, 0x49, 0x00, 0x09, 0x24, 0x2c, 0x53, 0x9b, 0x62,
+ 0x44, 0x29, 0x14, 0x89, 0x0b, 0x1c, 0x93, 0xf0, 0x3f, 0x82, 0xd9, 0xfd,
+ 0x0f, 0x13, 0x3f, 0xf5, 0xbf, 0x3b, 0x6f, 0xf6, 0x1e, 0x10, 0xb7, 0x27,
+ 0x74, 0xa4, 0x43, 0x62, 0x21, 0x1a, 0x00, 0x50, 0x07, 0x17, 0xfb, 0x6f,
+ 0x36, 0x11, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, 0x3f, 0x1d, 0x80, 0xab,
+ 0x01, 0xd6, 0x0d, 0xac, 0x4c, 0x23, 0x49, 0x20, 0x00, 0xb6, 0xdf, 0xff,
+ 0x35, 0x20, 0xdb, 0xfd, 0xed, 0x36, 0xd6, 0x49, 0x1e, 0x19, 0x22, 0xf4,
+ 0x2f, 0x66, 0x66, 0x66, 0x19, 0x13, 0x3b, 0x69, 0xb7, 0x9f, 0xfd, 0xbf,
+ 0x2b, 0x16, 0x4e, 0x76, 0x25, 0x02, 0x72, 0xaf, 0x35, 0x10, 0x68, 0x54,
+ 0x85, 0x03, 0x61, 0x26, 0x39, 0x1d, 0x44, 0x42, 0x25, 0x12, 0xeb, 0x76,
+ 0x3d, 0x1d, 0x29, 0x20, 0x09, 0xb2, 0x4d, 0xb6, 0x65, 0x37, 0x6d, 0xb4,
+ 0x91, 0x20, 0x49, 0x77, 0x68, 0x42, 0x17, 0xf4, 0x2f, 0x68, 0x56, 0xd5,
+ 0x49, 0x54, 0x02, 0x60, 0x26, 0x22, 0x62, 0x26, 0x5a, 0x4c, 0x68, 0x56,
+ 0x84, 0x68, 0x46, 0x84, 0x4a, 0x27, 0x66, 0x74, 0x67, 0x46, 0x74, 0x2f,
+ 0x53, 0x2b, 0x68, 0x66, 0x85, 0x68, 0x56, 0x85, 0x51, 0x2b, 0x68, 0x66,
+ 0x86, 0x68, 0x66, 0x86, 0x52, 0x25, 0x68, 0x46, 0x45, 0x66, 0x64, 0x27,
+ 0x77, 0x32, 0x6d, 0x16, 0x8c, 0x46, 0x61, 0x37,
+ ]),
+ decompressed: new Uint8Array([
+ 0x7a, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff,
+ 0x44, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x36, 0x00, 0x00, 0xff,
+ 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff,
+ 0x43, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff,
+ 0x37, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff,
+ 0x37, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff,
+ 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff,
+ 0x33, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff,
+ 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff,
+ 0x42, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff,
+ 0x53, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff,
+ 0x5c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff,
+ 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff,
+ 0x24, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff,
+ 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x26, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff,
+ 0x17, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff,
+ 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff,
+ 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff,
+ 0x2f, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff,
+ 0x5c, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff,
+ 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff,
+ 0x1b, 0x00, 0x00, 0xff, 0x12, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff,
+ 0x17, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff,
+ 0x0d, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff,
+ 0x17, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff,
+ 0x0c, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff,
+ 0x0c, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x2f, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff,
+ 0x5c, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff,
+ 0x20, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x12, 0x00, 0x00, 0xff,
+ 0x12, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff,
+ 0x17, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff,
+ 0x0e, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff,
+ 0x06, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x10, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff,
+ 0x10, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff,
+ 0x38, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x06, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff,
+ 0x08, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff,
+ 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x1c, 0x00, 0x00, 0xff, 0x22, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff,
+ 0x52, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0x15, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff,
+ 0x06, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff,
+ 0x22, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff,
+ 0x51, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff,
+ 0x0d, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x0c, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff,
+ 0x37, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x1c, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff,
+ 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff,
+ 0x52, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff,
+ 0x0e, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff,
+ 0x0c, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff,
+ 0x2c, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff,
+ 0x37, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff,
+ 0x2b, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff,
+ 0x13, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff,
+ 0x2c, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff,
+ 0x4b, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff,
+ 0x0b, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff,
+ 0x0a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff,
+ 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff,
+ 0x43, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff,
+ 0x5b, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff,
+ 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff,
+ 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff,
+ 0x37, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff,
+ 0x50, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x0b, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff,
+ 0x0e, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff,
+ 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff,
+ 0x2a, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff,
+ 0x3b, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff,
+ 0x50, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff,
+ 0x44, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x07, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff,
+ 0x0e, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x19, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x19, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff,
+ 0x30, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff,
+ 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff,
+ 0x5c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff,
+ 0x34, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff,
+ 0x0b, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff,
+ 0x15, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x27, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff,
+ 0x38, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x46, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff,
+ 0x5c, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff,
+ 0x34, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff,
+ 0x10, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x20, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff,
+ 0x30, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff,
+ 0x41, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff,
+ 0x50, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff,
+ 0x49, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff,
+ 0x28, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff,
+ 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff,
+ 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff,
+ 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, 0x54, 0x00, 0x00, 0xff,
+ 0x68, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff,
+ 0x2d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff,
+ 0x0a, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff,
+ 0x28, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff,
+ 0x31, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff,
+ 0x3f, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x48, 0x00, 0x00, 0xff, 0x54, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff,
+ 0x09, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff,
+ 0x0a, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff,
+ 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff,
+ 0x42, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff,
+ 0x54, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x0b, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff,
+ 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3f, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff,
+ 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, 0x54, 0x00, 0x00, 0xff,
+ 0x68, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff,
+ 0x18, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff,
+ 0x08, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff,
+ 0x0b, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff,
+ 0x1b, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff,
+ 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff,
+ 0x29, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff,
+ 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x41, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x48, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff,
+ 0x45, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x0e, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff,
+ 0x08, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff,
+ 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff,
+ 0x33, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff,
+ 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x41, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff,
+ 0x52, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff,
+ 0x22, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff,
+ 0x26, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff,
+ 0x24, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff,
+ 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff,
+ 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff,
+ 0x64, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff,
+ 0x18, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x20, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff,
+ 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff,
+ 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff,
+ 0x38, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff,
+ 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x48, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff,
+ 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff,
+ 0x17, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff,
+ 0x24, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff,
+ 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x36, 0x00, 0x00, 0xff,
+ 0x37, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3b, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff,
+ 0x3f, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff,
+ 0x56, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff,
+ 0x51, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff,
+ 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff,
+ 0x19, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x27, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff,
+ 0x2c, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff,
+ 0x37, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff,
+ 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3c, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff,
+ 0x44, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff,
+ 0x71, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff,
+ 0x3f, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, 0x22, 0x00, 0x00, 0xff,
+ 0x22, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff,
+ 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff,
+ 0x2e, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff,
+ 0x32, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff,
+ 0x38, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3b, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff,
+ 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff,
+ 0x4d, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff,
+ 0x51, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff,
+ 0x29, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x35, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff,
+ 0x35, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff,
+ 0x3f, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x56, 0x00, 0x00, 0xff,
+ 0x6b, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff,
+ 0x48, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff,
+ 0x2b, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff,
+ 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff,
+ 0x3f, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff,
+ 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff,
+ 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff,
+ 0x71, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff,
+ 0x48, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff,
+ 0x3e, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x40, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff,
+ 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff,
+ 0x43, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff,
+ 0x43, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff,
+ 0x44, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff,
+ 0x5f, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff,
+ 0x98, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff,
+ 0x48, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff,
+ 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff,
+ 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff,
+ 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff,
+ 0x52, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff,
+ 0x4f, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff,
+ 0x4d, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff,
+ 0x4c, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x56, 0x00, 0x00, 0xff,
+ 0x56, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff,
+ 0x7a, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x00, 0xff, 0x98, 0x00, 0x00, 0xff,
+ 0x98, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff,
+ 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff,
+ 0x6c, 0x00, 0x00, 0xff, 0x66, 0x00, 0x00, 0xff, 0x62, 0x00, 0x00, 0xff,
+ 0x62, 0x00, 0x00, 0xff, 0x62, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff,
+ 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff,
+ 0x5f, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff,
+ 0x5b, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff,
+ 0x5d, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x56, 0x00, 0x00, 0xff,
+ 0x5e, 0x00, 0x00, 0xff, 0x62, 0x00, 0x00, 0xff, 0x66, 0x00, 0x00, 0xff,
+ 0x68, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x00, 0xff,
+ 0x9b, 0x00, 0x00, 0xff,
+ ]),
+};
+
+var img_32x32_signed_r11_eac = {
+ compressed: new Uint8Array([
+ 0xef, 0x61, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, 0xa2, 0x32, 0xf2, 0x8d,
+ 0x01, 0xf0, 0x9f, 0x02, 0xab, 0x4b, 0xd0, 0x9d, 0x41, 0xf0, 0x29, 0x12,
+ 0xa0, 0x30, 0xc0, 0x2e, 0x0a, 0xf0, 0xad, 0x02, 0xa1, 0x34, 0xf0, 0x1b,
+ 0x42, 0xb6, 0x1a, 0x02, 0x9f, 0x34, 0xb0, 0x8d, 0x0a, 0xb0, 0x3f, 0x0a,
+ 0xaa, 0x21, 0xf1, 0xbf, 0x1a, 0xf1, 0x3e, 0x0b, 0xc8, 0x32, 0x29, 0xb0,
+ 0x52, 0xb0, 0x1f, 0xac, 0xb2, 0x4f, 0x9f, 0xc0, 0x49, 0x49, 0xb0, 0xdb,
+ 0x8a, 0x16, 0xfe, 0x1e, 0x08, 0x1d, 0x20, 0x22, 0x88, 0x2d, 0x08, 0x0c,
+ 0x92, 0x91, 0x10, 0x02, 0x85, 0x1d, 0x20, 0x60, 0x46, 0x20, 0x20, 0x56,
+ 0x8c, 0x1c, 0x61, 0x30, 0xd2, 0x61, 0x3a, 0x83, 0x93, 0x11, 0x81, 0x9c,
+ 0x8b, 0x50, 0xb4, 0x39, 0x94, 0x2f, 0x42, 0xc8, 0x2d, 0xf2, 0x79, 0xe7,
+ 0xaf, 0x33, 0x42, 0x02, 0x64, 0xb6, 0xdf, 0xff, 0xb5, 0x31, 0x82, 0x62,
+ 0x08, 0x48, 0xb6, 0x9b, 0x84, 0x1a, 0xd7, 0x51, 0xac, 0x83, 0x0b, 0x25,
+ 0x8a, 0x16, 0x66, 0xa4, 0x85, 0x49, 0x22, 0x5b, 0x83, 0x1d, 0xa0, 0x2a,
+ 0x08, 0xc4, 0xe2, 0x8c, 0x8d, 0x15, 0x2d, 0x86, 0xd1, 0x09, 0x41, 0x00,
+ 0x96, 0x19, 0x4a, 0xdf, 0x6d, 0xbe, 0xd7, 0x6d, 0xa1, 0x11, 0x4f, 0xe6,
+ 0xb6, 0xef, 0x6f, 0xf6, 0xb0, 0x44, 0xb2, 0xc9, 0x24, 0xbb, 0x6f, 0xff,
+ 0xad, 0x41, 0xdb, 0xf9, 0x65, 0x12, 0x44, 0x8c, 0x82, 0x1d, 0xd2, 0x78,
+ 0x49, 0xa0, 0x90, 0x08, 0x82, 0x00, 0x6c, 0xe2, 0xd9, 0x91, 0xb9, 0x24,
+ 0x8e, 0x15, 0x64, 0x96, 0x40, 0x28, 0x41, 0x24, 0x95, 0x13, 0x6a, 0x48,
+ 0xe7, 0x5c, 0x7f, 0xbe, 0xa1, 0x18, 0x00, 0x51, 0x45, 0x0a, 0x8d, 0xb6,
+ 0xb7, 0x14, 0x6d, 0x14, 0x40, 0x12, 0x5b, 0xb7, 0xcf, 0x10, 0x6d, 0xa4,
+ 0x89, 0x92, 0x4f, 0xff, 0x99, 0x43, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x09,
+ 0x90, 0x21, 0xf0, 0x10, 0x00, 0x44, 0x02, 0x89, 0x89, 0x2d, 0x49, 0x24,
+ 0xaa, 0x56, 0xd4, 0xaf, 0x91, 0x18, 0x6c, 0x00, 0x07, 0xe2, 0xdf, 0xed,
+ 0xa1, 0x23, 0x40, 0x28, 0x84, 0xd0, 0x49, 0xb0, 0x93, 0x36, 0x9b, 0x6d,
+ 0x36, 0xdf, 0xff, 0xff, 0xbc, 0x12, 0x48, 0x01, 0x6d, 0xb6, 0x4d, 0xb5,
+ 0xe1, 0x44, 0x49, 0x22, 0x49, 0x00, 0x09, 0x24, 0xad, 0x53, 0x9b, 0x62,
+ 0x44, 0x29, 0x14, 0x89, 0x8b, 0x1c, 0x93, 0xf0, 0x3f, 0x82, 0xd9, 0xfd,
+ 0x91, 0x16, 0x1f, 0xf3, 0x3f, 0x12, 0x4f, 0xe4, 0x9e, 0x10, 0xb7, 0x27,
+ 0x74, 0xa4, 0x43, 0x62, 0xa1, 0x1a, 0x00, 0x50, 0x07, 0x17, 0xfb, 0x6f,
+ 0xb6, 0x11, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, 0xc0, 0x1d, 0x05, 0x28,
+ 0x0a, 0xb0, 0x1d, 0x60, 0xcd, 0x23, 0x49, 0x20, 0x00, 0xb6, 0xdf, 0xff,
+ 0xb6, 0x20, 0xdb, 0xfd, 0xed, 0x36, 0xd6, 0x49, 0x9f, 0x19, 0x22, 0xf4,
+ 0x67, 0x66, 0x66, 0x66, 0x99, 0x13, 0x3b, 0x6b, 0xb7, 0xbf, 0xfd, 0xbf,
+ 0xab, 0x17, 0x4e, 0xf6, 0x2e, 0x02, 0xf2, 0xb7, 0xb1, 0x11, 0x42, 0x60,
+ 0x26, 0x93, 0xf9, 0x6f, 0xba, 0x1d, 0x48, 0x84, 0x44, 0x22, 0x59, 0x2e,
+ 0xbd, 0x1d, 0x29, 0x20, 0x09, 0xb2, 0x4d, 0xb6, 0xe6, 0x37, 0x6d, 0xb4,
+ 0x91, 0x20, 0x49, 0x77, 0xe8, 0x42, 0x17, 0xf4, 0x2f, 0x68, 0x56, 0xd5,
+ 0xc9, 0x54, 0x02, 0x60, 0x26, 0x22, 0x62, 0x26, 0xcc, 0x21, 0x66, 0x76,
+ 0x67, 0x66, 0x76, 0x67, 0xcb, 0x27, 0x66, 0x74, 0x67, 0x46, 0x74, 0x2f,
+ 0xd4, 0x2b, 0x68, 0x66, 0x85, 0x68, 0x56, 0x85, 0xd2, 0x2b, 0x68, 0x66,
+ 0x86, 0x68, 0x66, 0x86, 0xd3, 0x25, 0x68, 0x46, 0x45, 0x66, 0x64, 0x27,
+ 0xf8, 0x32, 0x6d, 0x16, 0x8c, 0x46, 0x61, 0x37,
+ ]),
+ decompressed: new Uint8Array([
+ 0x7b, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff,
+ 0x45, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff,
+ 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff,
+ 0x43, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff,
+ 0x38, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff,
+ 0x38, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff,
+ 0x30, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff,
+ 0x34, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff,
+ 0x42, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff,
+ 0x54, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff,
+ 0x5d, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff,
+ 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff,
+ 0x17, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff,
+ 0x27, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff,
+ 0x18, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff,
+ 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff,
+ 0x30, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff,
+ 0x5d, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff,
+ 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff,
+ 0x1c, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff,
+ 0x17, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x0e, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff,
+ 0x18, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff,
+ 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x0d, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff,
+ 0x30, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x54, 0x00, 0x00, 0xff,
+ 0x5d, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff,
+ 0x21, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff,
+ 0x13, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff,
+ 0x17, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x07, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x10, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff,
+ 0x10, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff,
+ 0x39, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x26, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x06, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff,
+ 0x08, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff,
+ 0x09, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x18, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff,
+ 0x53, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff,
+ 0x06, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff,
+ 0x06, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff,
+ 0x10, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff,
+ 0x10, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x18, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff,
+ 0x52, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x0e, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x0c, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff,
+ 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff,
+ 0x18, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff,
+ 0x38, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x1e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x07, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff,
+ 0x1c, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff,
+ 0x29, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff,
+ 0x53, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x17, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff,
+ 0x0e, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff,
+ 0x0c, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff,
+ 0x2d, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff,
+ 0x38, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff,
+ 0x2c, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff,
+ 0x17, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x04, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff,
+ 0x2d, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff,
+ 0x4c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff,
+ 0x20, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x0b, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff,
+ 0x0a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff,
+ 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff,
+ 0x44, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff,
+ 0x5c, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff,
+ 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff,
+ 0x06, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff,
+ 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff,
+ 0x38, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff,
+ 0x51, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x0b, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff,
+ 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff,
+ 0x2b, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff,
+ 0x3c, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff,
+ 0x51, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff,
+ 0x45, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x07, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff,
+ 0x19, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff,
+ 0x31, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff,
+ 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff,
+ 0x5d, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff,
+ 0x35, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff,
+ 0x0b, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff,
+ 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff,
+ 0x28, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff,
+ 0x39, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x49, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff,
+ 0x5d, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff,
+ 0x35, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff,
+ 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff,
+ 0x10, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff,
+ 0x21, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff,
+ 0x26, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff,
+ 0x31, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff,
+ 0x42, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff,
+ 0x51, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff,
+ 0x49, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff,
+ 0x28, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff,
+ 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff,
+ 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff,
+ 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x55, 0x00, 0x00, 0xff,
+ 0x69, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff,
+ 0x2d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff,
+ 0x0a, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff,
+ 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff,
+ 0x28, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff,
+ 0x31, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x40, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff,
+ 0x49, 0x00, 0x00, 0xff, 0x55, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff,
+ 0x09, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff,
+ 0x0a, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x16, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff,
+ 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff,
+ 0x43, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff,
+ 0x55, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff,
+ 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+ 0x0b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff,
+ 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff,
+ 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x40, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x55, 0x00, 0x00, 0xff,
+ 0x69, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff,
+ 0x19, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff,
+ 0x08, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff,
+ 0x0d, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff,
+ 0x1b, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff,
+ 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff,
+ 0x29, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff,
+ 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x41, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff,
+ 0x49, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0xff,
+ 0x46, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff,
+ 0x08, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff,
+ 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff,
+ 0x33, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff,
+ 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x41, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff,
+ 0x53, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff,
+ 0x26, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff,
+ 0x24, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff,
+ 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff,
+ 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff,
+ 0x65, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff,
+ 0x19, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff,
+ 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff,
+ 0x14, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x20, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff,
+ 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff,
+ 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff,
+ 0x38, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff,
+ 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff,
+ 0x49, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0xff,
+ 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff,
+ 0x18, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff,
+ 0x15, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff,
+ 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff,
+ 0x23, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff,
+ 0x26, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff,
+ 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff,
+ 0x37, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3b, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff,
+ 0x3f, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff,
+ 0x57, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff,
+ 0x52, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff,
+ 0x1d, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff,
+ 0x1a, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff,
+ 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff,
+ 0x37, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff,
+ 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3c, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff,
+ 0x45, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff,
+ 0x72, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x40, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff,
+ 0x20, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff,
+ 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff,
+ 0x2f, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff,
+ 0x33, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff,
+ 0x38, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3b, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff,
+ 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff,
+ 0x4e, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff,
+ 0x52, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x2a, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff,
+ 0x26, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff,
+ 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff,
+ 0x35, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff,
+ 0x35, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff,
+ 0x3f, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x57, 0x00, 0x00, 0xff,
+ 0x6c, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff,
+ 0x48, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff,
+ 0x2b, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff,
+ 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff,
+ 0x3b, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff,
+ 0x40, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff,
+ 0x40, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff,
+ 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff,
+ 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff,
+ 0x51, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff,
+ 0x72, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff,
+ 0x48, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff,
+ 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff,
+ 0x3e, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff,
+ 0x41, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff,
+ 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff,
+ 0x44, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff,
+ 0x44, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff,
+ 0x45, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff,
+ 0x60, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff,
+ 0x97, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff,
+ 0x48, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff,
+ 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff,
+ 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff,
+ 0x4f, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff,
+ 0x53, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff,
+ 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff,
+ 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff,
+ 0x4d, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, 0x57, 0x00, 0x00, 0xff,
+ 0x57, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff,
+ 0x7b, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x00, 0xff, 0x97, 0x00, 0x00, 0xff,
+ 0x97, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff,
+ 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff,
+ 0x6c, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff,
+ 0x64, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff,
+ 0x5f, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff,
+ 0x60, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff,
+ 0x5c, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff,
+ 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, 0x57, 0x00, 0x00, 0xff,
+ 0x5f, 0x00, 0x00, 0xff, 0x63, 0x00, 0x00, 0xff, 0x67, 0x00, 0x00, 0xff,
+ 0x69, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x00, 0xff,
+ 0x9b, 0x00, 0x00, 0xff,
+ ]),
+};
+
+var img_32x32_rg11_eac = {
+ compressed: new Uint8Array([
+ 0xa3, 0x8b, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, 0x88, 0x72, 0xdb, 0x5d,
+ 0x68, 0xb4, 0x49, 0x01, 0x54, 0x30, 0xf2, 0x8d, 0x02, 0xf1, 0x2f, 0x03,
+ 0x64, 0x30, 0xf2, 0x8d, 0x02, 0xf1, 0x2f, 0x03, 0x5f, 0x47, 0xd1, 0x1d,
+ 0x42, 0xf0, 0x39, 0x1b, 0x70, 0x47, 0xd1, 0x1d, 0x42, 0xf0, 0x39, 0x1b,
+ 0x57, 0x62, 0xa0, 0x2c, 0x0a, 0xd0, 0xab, 0x02, 0x69, 0x67, 0xa0, 0xbc,
+ 0x13, 0xd1, 0x3b, 0x0b, 0x54, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43,
+ 0x64, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43, 0x4a, 0x7b, 0xd4, 0x4d,
+ 0x41, 0xd6, 0x2f, 0x41, 0x4a, 0x7b, 0xd4, 0x4d, 0x41, 0xd6, 0x2f, 0x41,
+ 0x71, 0xbd, 0xd1, 0x2d, 0x11, 0xd0, 0xac, 0x02, 0x5e, 0x44, 0xf5, 0x2f,
+ 0x51, 0xf4, 0xaf, 0x02, 0x9f, 0x49, 0x48, 0x92, 0x04, 0x92, 0xdb, 0xb7,
+ 0x85, 0x6b, 0x05, 0x38, 0x0a, 0xb0, 0x1d, 0x60, 0x69, 0x69, 0xbb, 0x58,
+ 0x00, 0x25, 0x20, 0x9a, 0x69, 0x69, 0xbb, 0x58, 0x00, 0x25, 0x20, 0x9a,
+ 0x1c, 0x32, 0xfe, 0xae, 0x10, 0x9c, 0x99, 0x31, 0x33, 0x44, 0xda, 0x2c,
+ 0x10, 0x19, 0x20, 0x22, 0x17, 0x22, 0x8a, 0x4e, 0x92, 0xb5, 0x90, 0x03,
+ 0x24, 0x20, 0x86, 0x4e, 0x49, 0x91, 0xa0, 0x03, 0x13, 0x3d, 0x18, 0xea,
+ 0x0e, 0x14, 0xbc, 0x1e, 0x0c, 0x20, 0x9b, 0x7b, 0x37, 0x97, 0x0d, 0x07,
+ 0x01, 0x8f, 0x96, 0x4b, 0x24, 0x96, 0x4d, 0x2c, 0x29, 0x3a, 0x54, 0x2a,
+ 0x80, 0x54, 0x2e, 0x2a, 0x5c, 0x47, 0x29, 0x00, 0xc2, 0x64, 0x26, 0xb0,
+ 0x41, 0x34, 0xb1, 0x9c, 0x0b, 0x14, 0xb1, 0x31, 0x6a, 0x44, 0x6a, 0xc0,
+ 0xad, 0x82, 0x61, 0x26, 0x45, 0x20, 0x66, 0x0a, 0x64, 0xf4, 0x6b, 0xc6,
+ 0xb4, 0x4b, 0x64, 0x14, 0x80, 0x92, 0x4f, 0xff, 0x64, 0x47, 0x64, 0x14,
+ 0x80, 0x00, 0x0b, 0x6d, 0x5d, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52,
+ 0x6d, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52, 0x17, 0x2a, 0xf7, 0xd5,
+ 0xe8, 0x0b, 0xaa, 0x05, 0x20, 0x2a, 0xf7, 0xd5, 0xe8, 0x0b, 0xaa, 0x05,
+ 0x0e, 0x3d, 0x77, 0xb4, 0xe7, 0x49, 0xbb, 0x5b, 0x1f, 0x30, 0x63, 0x82,
+ 0xaf, 0x24, 0x00, 0x1b, 0x0d, 0x42, 0x80, 0x18, 0x08, 0xd2, 0x68, 0x25,
+ 0x0f, 0x2a, 0xf6, 0xaf, 0x45, 0xe0, 0x70, 0x85, 0x3f, 0x42, 0x09, 0x44,
+ 0x88, 0xa0, 0x6b, 0xad, 0x17, 0x2a, 0xa9, 0x74, 0x85, 0xa9, 0x7b, 0xed,
+ 0x6f, 0x23, 0x6f, 0xfb, 0xff, 0xf7, 0xf3, 0xff, 0x06, 0xb2, 0xb6, 0xdd,
+ 0x6d, 0xba, 0xd9, 0x6d, 0xa3, 0x37, 0x2e, 0xf6, 0x7f, 0xaf, 0xfb, 0x7f,
+ 0x1c, 0x5d, 0x73, 0x88, 0xc0, 0xf0, 0x0f, 0xc0, 0x7a, 0xb5, 0xdb, 0x6d,
+ 0xb6, 0xdf, 0xff, 0xff, 0x5a, 0xbd, 0x8a, 0x24, 0x92, 0x80, 0x0d, 0xb6,
+ 0x63, 0x50, 0xb7, 0x69, 0x24, 0x12, 0x46, 0xd4, 0x71, 0x67, 0xdb, 0xfb,
+ 0xae, 0x12, 0x46, 0xd4, 0x1a, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb,
+ 0x1a, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb, 0x01, 0x2f, 0x02, 0x78,
+ 0x04, 0xb4, 0x0b, 0x6d, 0x01, 0x20, 0x02, 0x68, 0x04, 0xd8, 0x0d, 0xb6,
+ 0x2e, 0x42, 0x40, 0x04, 0x24, 0x82, 0xeb, 0xb6, 0x28, 0x2a, 0x56, 0xd5,
+ 0x7f, 0x0a, 0xfb, 0xff, 0x64, 0x47, 0x42, 0x48, 0xa6, 0x9e, 0xff, 0xbe,
+ 0x31, 0x20, 0x66, 0xda, 0xef, 0x58, 0x6d, 0x34, 0xab, 0x20, 0x49, 0x04,
+ 0x10, 0x4c, 0x2d, 0xb6, 0x2e, 0x20, 0x92, 0x69, 0xa6, 0x83, 0x46, 0xdb,
+ 0xd9, 0x2b, 0x6d, 0x12, 0x44, 0x12, 0xeb, 0xbf, 0x0a, 0x19, 0x25, 0x28,
+ 0x01, 0xb6, 0x4f, 0xb5, 0xe5, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77,
+ 0x4c, 0x4c, 0x6d, 0xb0, 0x49, 0xb6, 0xcf, 0xff, 0x55, 0x47, 0xff, 0x6f,
+ 0x24, 0x90, 0x08, 0x52, 0x4d, 0x62, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x49,
+ 0x2f, 0x5a, 0xf4, 0x20, 0x00, 0x66, 0xd4, 0xd1, 0x32, 0x52, 0xfa, 0x19,
+ 0x24, 0x68, 0x06, 0xda, 0x03, 0x85, 0x92, 0xd9, 0x2d, 0x96, 0xdb, 0x2f,
+ 0x03, 0x85, 0x90, 0x09, 0x28, 0x96, 0xd1, 0x2f, 0x5b, 0x20, 0x6c, 0x00,
+ 0x06, 0xc3, 0xfd, 0xbf, 0x39, 0x20, 0x6c, 0x00, 0x06, 0xc0, 0x0d, 0x80,
+ 0x89, 0x42, 0x46, 0x00, 0xa5, 0x82, 0x51, 0x34, 0x47, 0x42, 0x10, 0xaa,
+ 0x08, 0xd4, 0x8b, 0xa1, 0xc1, 0x36, 0x60, 0x00, 0xc0, 0x16, 0xdb, 0x6d,
+ 0x15, 0x22, 0x9f, 0xff, 0x3f, 0xe9, 0x24, 0x92, 0xe4, 0x11, 0x6c, 0x01,
+ 0xb6, 0xb6, 0x4f, 0xfd, 0x07, 0x1a, 0x49, 0x24, 0x00, 0xb4, 0x0f, 0xfd,
+ 0xee, 0x2d, 0x48, 0x92, 0x04, 0x92, 0xdb, 0xb6, 0x33, 0xb2, 0x00, 0x09,
+ 0x24, 0xb6, 0xdd, 0xb6, 0x75, 0x31, 0x9b, 0x64, 0x84, 0x2d, 0x96, 0xc9,
+ 0x58, 0x72, 0xbb, 0x60, 0x25, 0x04, 0x82, 0x40, 0x4b, 0x3a, 0x02, 0xd4,
+ 0xad, 0x0b, 0xf1, 0x6f, 0x1b, 0x45, 0xb7, 0xf9, 0x3f, 0xb0, 0x0b, 0xf8,
+ 0x46, 0x8f, 0x9b, 0x6b, 0xf6, 0x9f, 0xfd, 0xbf, 0x1f, 0x32, 0x9f, 0xf6,
+ 0x7f, 0x84, 0x9f, 0xc9, 0x85, 0x47, 0x93, 0xc5, 0x3e, 0x82, 0xe1, 0x34,
+ 0x2e, 0x4a, 0xda, 0x21, 0xa0, 0xd4, 0x8b, 0x82, 0xa5, 0x20, 0x00, 0x60,
+ 0x07, 0x1b, 0xfd, 0xb7, 0x1a, 0x10, 0xff, 0xbf, 0xf8, 0xec, 0x06, 0xd8,
+ 0xdb, 0x24, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, 0x02, 0xfd, 0x00, 0x0a,
+ 0x00, 0x00, 0x08, 0x00, 0xeb, 0x2d, 0x80, 0xab, 0x01, 0xb0, 0x1d, 0x60,
+ 0x09, 0x1a, 0x69, 0x22, 0x48, 0x92, 0x5d, 0xb6, 0xed, 0x03, 0x6d, 0xb4,
+ 0x92, 0xb6, 0xdf, 0xff, 0x4d, 0x5c, 0x6d, 0xb0, 0x49, 0xb6, 0xdf, 0xff,
+ 0x9a, 0x33, 0x92, 0xd9, 0x40, 0x3b, 0x66, 0x49, 0x65, 0x5f, 0xdb, 0xfd,
+ 0xed, 0x12, 0x46, 0x00, 0x94, 0x37, 0x66, 0x66, 0x66, 0x42, 0xf4, 0x2f,
+ 0x30, 0x29, 0xdb, 0xf9, 0x2d, 0x24, 0x06, 0xd2, 0x94, 0x20, 0x5b, 0x61,
+ 0xb7, 0x1f, 0xfd, 0xbf, 0x00, 0x46, 0xdb, 0x6f, 0xb7, 0xff, 0xfd, 0xbf,
+ 0xc3, 0x27, 0x4e, 0xf6, 0x2e, 0x02, 0xf2, 0xb7, 0x06, 0x2b, 0xb2, 0xf9,
+ 0xee, 0xfe, 0xfd, 0x77, 0xd3, 0x2b, 0x66, 0x62, 0x66, 0x93, 0xf9, 0x6f,
+ 0x0b, 0x10, 0x6a, 0x74, 0xa7, 0x6e, 0xd6, 0x4d, 0xe1, 0x2d, 0x44, 0x82,
+ 0x04, 0x12, 0x59, 0x6e, 0x07, 0x19, 0x42, 0x64, 0x2e, 0x32, 0xf3, 0x2f,
+ 0xe6, 0x2d, 0x04, 0xa8, 0x01, 0xb2, 0x0d, 0x6c, 0x11, 0x10, 0x6d, 0x14,
+ 0x44, 0x12, 0xeb, 0xbf, 0xed, 0x2d, 0x05, 0x28, 0x0a, 0xb0, 0x1d, 0x60,
+ 0x64, 0x51, 0x68, 0x92, 0x04, 0x92, 0xdb, 0xbf, 0xdc, 0x37, 0x17, 0xf4,
+ 0x2f, 0x66, 0x66, 0xce, 0x87, 0x62, 0x97, 0x61, 0x2e, 0x44, 0x44, 0x8c,
+ 0xc7, 0x72, 0x92, 0xe9, 0x2e, 0x12, 0xe1, 0x2e, 0x55, 0x47, 0x02, 0xf0,
+ 0x2f, 0x42, 0xf4, 0x2f, 0xd8, 0xdd, 0x12, 0xe1, 0x2e, 0x12, 0xe1, 0x2e,
+ 0x51, 0x4c, 0x62, 0xf6, 0x2f, 0x66, 0x76, 0x67, 0xe5, 0x12, 0x68, 0x56,
+ 0x66, 0x42, 0xf3, 0x37, 0x03, 0xef, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77,
+ 0xe5, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, 0x4a, 0x47, 0x62, 0xf6,
+ 0x67, 0x66, 0x76, 0x66, 0xdf, 0x2f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77,
+ 0x02, 0xdf, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, 0xe9, 0x1b, 0x64, 0x46,
+ 0x45, 0x46, 0x54, 0x26, 0x4d, 0x41, 0x66, 0x54, 0x26, 0x42, 0xf3, 0x2f,
+ 0xea, 0x2d, 0x46, 0x54, 0x26, 0x22, 0xe3, 0x2e, 0x8c, 0x40, 0x68, 0x84,
+ 0x44, 0x12, 0xe9, 0x77,
+ ]),
+ decompressed: new Uint8Array([
+ 0xab, 0xb9, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff,
+ 0x7b, 0x8f, 0x00, 0xff, 0x7e, 0x8e, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff,
+ 0x7e, 0x8e, 0x00, 0xff, 0x7e, 0x8e, 0x00, 0xff, 0x7b, 0x8c, 0x00, 0xff,
+ 0x7b, 0x8c, 0x00, 0xff, 0x87, 0x98, 0x00, 0xff, 0x67, 0x78, 0x00, 0xff,
+ 0x6f, 0x81, 0x00, 0xff, 0x81, 0x93, 0x00, 0xff, 0x81, 0x93, 0x00, 0xff,
+ 0x6f, 0x81, 0x00, 0xff, 0x7e, 0x8e, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff,
+ 0x6c, 0x7c, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, 0x74, 0x74, 0x00, 0xff,
+ 0x74, 0x74, 0x00, 0xff, 0x74, 0x74, 0x00, 0xff, 0x89, 0x89, 0x00, 0xff,
+ 0x87, 0x8a, 0x00, 0xff, 0x87, 0x8a, 0x00, 0xff, 0x87, 0x8a, 0x00, 0xff,
+ 0x87, 0x8a, 0x00, 0xff, 0x7f, 0x79, 0x00, 0xff, 0x8b, 0x8b, 0x00, 0xff,
+ 0xa3, 0x9d, 0x00, 0xff, 0xaf, 0xa9, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff,
+ 0x93, 0xa4, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, 0x7b, 0x8f, 0x00, 0xff,
+ 0x5a, 0x6a, 0x00, 0xff, 0x5a, 0x6a, 0x00, 0xff, 0x5a, 0x6a, 0x00, 0xff,
+ 0x5a, 0x6a, 0x00, 0xff, 0x67, 0x78, 0x00, 0xff, 0x6f, 0x80, 0x00, 0xff,
+ 0x67, 0x78, 0x00, 0xff, 0x67, 0x78, 0x00, 0xff, 0x4b, 0x57, 0x00, 0xff,
+ 0x4b, 0x57, 0x00, 0xff, 0x5d, 0x75, 0x00, 0xff, 0x5d, 0x75, 0x00, 0xff,
+ 0x5a, 0x6a, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff,
+ 0x42, 0x52, 0x00, 0xff, 0x66, 0x66, 0x00, 0xff, 0x66, 0x66, 0x00, 0xff,
+ 0x66, 0x66, 0x00, 0xff, 0x66, 0x66, 0x00, 0xff, 0x71, 0x72, 0x00, 0xff,
+ 0x71, 0x72, 0x00, 0xff, 0x71, 0x72, 0x00, 0xff, 0x66, 0x66, 0x00, 0xff,
+ 0x7f, 0x67, 0x00, 0xff, 0x97, 0x79, 0x00, 0xff, 0xa3, 0x8b, 0x00, 0xff,
+ 0xbb, 0x9d, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff,
+ 0x6b, 0x7a, 0x00, 0xff, 0x6b, 0x7a, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff,
+ 0x4b, 0x5b, 0x00, 0xff, 0x39, 0x49, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff,
+ 0x3f, 0x50, 0x00, 0xff, 0x53, 0x64, 0x00, 0xff, 0x53, 0x64, 0x00, 0xff,
+ 0x33, 0x44, 0x00, 0xff, 0x4b, 0x4b, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff,
+ 0x39, 0x39, 0x00, 0xff, 0x4b, 0x4b, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff,
+ 0x4b, 0x5b, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff,
+ 0x3c, 0x3c, 0x00, 0xff, 0x3c, 0x3c, 0x00, 0xff, 0x51, 0x51, 0x00, 0xff,
+ 0x3c, 0x3c, 0x00, 0xff, 0x50, 0x3e, 0x00, 0xff, 0x50, 0x3e, 0x00, 0xff,
+ 0x5b, 0x46, 0x00, 0xff, 0x66, 0x52, 0x00, 0xff, 0x8b, 0x5b, 0x00, 0xff,
+ 0x97, 0x67, 0x00, 0xff, 0xaf, 0x79, 0x00, 0xff, 0xbb, 0x8b, 0x00, 0xff,
+ 0x93, 0xa4, 0x00, 0xff, 0x6b, 0x7a, 0x00, 0xff, 0x7b, 0x8f, 0x00, 0xff,
+ 0x53, 0x65, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, 0x39, 0x49, 0x00, 0xff,
+ 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, 0x4b, 0x5c, 0x00, 0xff,
+ 0x3f, 0x50, 0x00, 0xff, 0x33, 0x44, 0x00, 0xff, 0x33, 0x44, 0x00, 0xff,
+ 0x27, 0x27, 0x00, 0xff, 0x27, 0x27, 0x00, 0xff, 0x27, 0x27, 0x00, 0xff,
+ 0x27, 0x27, 0x00, 0xff, 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff,
+ 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, 0x51, 0x51, 0x00, 0xff,
+ 0x27, 0x27, 0x00, 0xff, 0x19, 0x19, 0x00, 0xff, 0x27, 0x27, 0x00, 0xff,
+ 0x50, 0x3e, 0x00, 0xff, 0x5b, 0x46, 0x00, 0xff, 0x50, 0x3e, 0x00, 0xff,
+ 0x50, 0x3e, 0x00, 0xff, 0x8b, 0x49, 0x00, 0xff, 0xa3, 0x5b, 0x00, 0xff,
+ 0xaf, 0x67, 0x00, 0xff, 0xc3, 0x79, 0x00, 0xff, 0x81, 0x81, 0x00, 0xff,
+ 0x6f, 0x6f, 0x00, 0xff, 0x4b, 0x4b, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff,
+ 0x40, 0x4f, 0x00, 0xff, 0x40, 0x4f, 0x00, 0xff, 0x1f, 0x27, 0x00, 0xff,
+ 0x1f, 0x27, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff, 0x2f, 0x40, 0x00, 0xff,
+ 0x1f, 0x28, 0x00, 0xff, 0x13, 0x1e, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff,
+ 0x16, 0x16, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, 0x19, 0x1c, 0x00, 0xff,
+ 0x11, 0x11, 0x00, 0xff, 0x21, 0x32, 0x00, 0xff, 0x11, 0x11, 0x00, 0xff,
+ 0x31, 0x44, 0x00, 0xff, 0x48, 0x50, 0x00, 0xff, 0x50, 0x56, 0x00, 0xff,
+ 0x30, 0x38, 0x00, 0xff, 0x30, 0x38, 0x00, 0xff, 0x3a, 0x27, 0x00, 0xff,
+ 0x5e, 0x4f, 0x00, 0xff, 0x72, 0x61, 0x00, 0xff, 0x5e, 0x4f, 0x00, 0xff,
+ 0x8c, 0x38, 0x00, 0xff, 0x98, 0x44, 0x00, 0xff, 0xb8, 0x58, 0x00, 0xff,
+ 0xd8, 0x74, 0x00, 0xff, 0x93, 0x93, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff,
+ 0x4b, 0x4b, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, 0x40, 0x4f, 0x00, 0xff,
+ 0x16, 0x27, 0x00, 0xff, 0x40, 0x4f, 0x00, 0xff, 0x1f, 0x27, 0x00, 0xff,
+ 0x07, 0x18, 0x00, 0xff, 0x07, 0x18, 0x00, 0xff, 0x1f, 0x28, 0x00, 0xff,
+ 0x13, 0x1e, 0x00, 0xff, 0x19, 0x1c, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff,
+ 0x16, 0x16, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, 0x21, 0x32, 0x00, 0xff,
+ 0x11, 0x11, 0x00, 0xff, 0x21, 0x32, 0x00, 0xff, 0x11, 0x23, 0x00, 0xff,
+ 0x3c, 0x47, 0x00, 0xff, 0x30, 0x38, 0x00, 0xff, 0x48, 0x50, 0x00, 0xff,
+ 0x3c, 0x47, 0x00, 0xff, 0x4a, 0x39, 0x00, 0xff, 0x4a, 0x39, 0x00, 0xff,
+ 0x5e, 0x4f, 0x00, 0xff, 0x72, 0x61, 0x00, 0xff, 0xa0, 0x50, 0x00, 0xff,
+ 0x98, 0x44, 0x00, 0xff, 0xb8, 0x58, 0x00, 0xff, 0xd8, 0x74, 0x00, 0xff,
+ 0x93, 0x93, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff,
+ 0x2d, 0x2d, 0x00, 0xff, 0x28, 0x3b, 0x00, 0xff, 0x04, 0x13, 0x00, 0xff,
+ 0x0d, 0x13, 0x00, 0xff, 0x31, 0x3b, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff,
+ 0x07, 0x18, 0x00, 0xff, 0x00, 0x06, 0x00, 0xff, 0x13, 0x1e, 0x00, 0xff,
+ 0x0d, 0x1c, 0x00, 0xff, 0x0d, 0x1c, 0x00, 0xff, 0x0d, 0x1c, 0x00, 0xff,
+ 0x00, 0x06, 0x00, 0xff, 0x11, 0x23, 0x00, 0xff, 0x11, 0x23, 0x00, 0xff,
+ 0x11, 0x23, 0x00, 0xff, 0x21, 0x32, 0x00, 0xff, 0x3c, 0x1d, 0x00, 0xff,
+ 0x50, 0x2f, 0x00, 0xff, 0x50, 0x2f, 0x00, 0xff, 0x78, 0x56, 0x00, 0xff,
+ 0x7e, 0x49, 0x00, 0xff, 0x7e, 0x49, 0x00, 0xff, 0x72, 0x3f, 0x00, 0xff,
+ 0x72, 0x3f, 0x00, 0xff, 0xac, 0x58, 0x00, 0xff, 0xac, 0x58, 0x00, 0xff,
+ 0xb8, 0x58, 0x00, 0xff, 0xd8, 0x74, 0x00, 0xff, 0x81, 0x81, 0x00, 0xff,
+ 0x5d, 0x5d, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff,
+ 0x04, 0x13, 0x00, 0xff, 0x16, 0x27, 0x00, 0xff, 0x0d, 0x13, 0x00, 0xff,
+ 0x0d, 0x13, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff, 0x07, 0x18, 0x00, 0xff,
+ 0x0d, 0x12, 0x00, 0xff, 0x00, 0x06, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff,
+ 0x19, 0x28, 0x00, 0xff, 0x00, 0x06, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff,
+ 0x11, 0x11, 0x00, 0xff, 0x11, 0x23, 0x00, 0xff, 0x11, 0x11, 0x00, 0xff,
+ 0x11, 0x11, 0x00, 0xff, 0x50, 0x2f, 0x00, 0xff, 0x3c, 0x1d, 0x00, 0xff,
+ 0x3c, 0x1d, 0x00, 0xff, 0x50, 0x2f, 0x00, 0xff, 0x72, 0x3f, 0x00, 0xff,
+ 0x7e, 0x49, 0x00, 0xff, 0x86, 0x55, 0x00, 0xff, 0x86, 0x55, 0x00, 0xff,
+ 0xa0, 0x50, 0x00, 0xff, 0xac, 0x58, 0x00, 0xff, 0xb8, 0x58, 0x00, 0xff,
+ 0xd8, 0x74, 0x00, 0xff, 0x75, 0x85, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff,
+ 0x3f, 0x4f, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff,
+ 0x07, 0x10, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x05, 0x0d, 0x00, 0xff, 0x05, 0x0d, 0x00, 0xff,
+ 0x11, 0x16, 0x00, 0xff, 0x11, 0x21, 0x00, 0xff, 0x11, 0x21, 0x00, 0xff,
+ 0x29, 0x21, 0x00, 0xff, 0x11, 0x0b, 0x00, 0xff, 0x37, 0x1d, 0x00, 0xff,
+ 0x1f, 0x07, 0x00, 0xff, 0x4f, 0x1d, 0x00, 0xff, 0x4f, 0x1d, 0x00, 0xff,
+ 0x55, 0x32, 0x00, 0xff, 0x75, 0x53, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff,
+ 0x67, 0x11, 0x00, 0xff, 0x94, 0x00, 0x00, 0xff, 0x82, 0x1c, 0x00, 0xff,
+ 0xaf, 0x49, 0x00, 0xff, 0xaf, 0x49, 0x00, 0xff, 0xd2, 0x5a, 0x00, 0xff,
+ 0xd2, 0x39, 0x00, 0xff, 0xd2, 0x5a, 0x00, 0xff, 0xe8, 0x70, 0x00, 0xff,
+ 0x63, 0x73, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, 0x3f, 0x4f, 0x00, 0xff,
+ 0x3f, 0x4f, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff,
+ 0x07, 0x10, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, 0x11, 0x16, 0x00, 0xff,
+ 0x00, 0x04, 0x00, 0xff, 0x05, 0x0d, 0x00, 0xff, 0x11, 0x16, 0x00, 0xff,
+ 0x05, 0x15, 0x00, 0xff, 0x05, 0x15, 0x00, 0xff, 0x11, 0x0b, 0x00, 0xff,
+ 0x05, 0x00, 0x00, 0xff, 0x1f, 0x07, 0x00, 0xff, 0x1f, 0x07, 0x00, 0xff,
+ 0x37, 0x07, 0x00, 0xff, 0x5b, 0x29, 0x00, 0xff, 0x55, 0x32, 0x00, 0xff,
+ 0x87, 0x32, 0x00, 0xff, 0x75, 0x53, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff,
+ 0x82, 0x1c, 0x00, 0xff, 0x94, 0x00, 0x00, 0xff, 0x82, 0x1c, 0x00, 0xff,
+ 0xaf, 0x49, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff,
+ 0xe8, 0x4f, 0x00, 0xff, 0xe8, 0x70, 0x00, 0xff, 0x75, 0x85, 0x00, 0xff,
+ 0x51, 0x61, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff,
+ 0x29, 0x32, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff,
+ 0x13, 0x1c, 0x00, 0xff, 0x29, 0x49, 0x00, 0xff, 0x0e, 0x2e, 0x00, 0xff,
+ 0x00, 0x16, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x05, 0x15, 0x00, 0xff,
+ 0x00, 0x0b, 0x00, 0xff, 0x11, 0x0b, 0x00, 0xff, 0x11, 0x0b, 0x00, 0xff,
+ 0x1f, 0x07, 0x00, 0xff, 0x2b, 0x13, 0x00, 0xff, 0x37, 0x07, 0x00, 0xff,
+ 0x4f, 0x1d, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff,
+ 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, 0xaf, 0x49, 0x00, 0xff,
+ 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff,
+ 0xd2, 0x5a, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff, 0xe8, 0x4f, 0x00, 0xff,
+ 0xe8, 0x70, 0x00, 0xff, 0x87, 0x97, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff,
+ 0x2d, 0x3d, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff,
+ 0x13, 0x1c, 0x00, 0xff, 0x07, 0x10, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff,
+ 0x00, 0x16, 0x00, 0xff, 0x29, 0x49, 0x00, 0xff, 0x00, 0x16, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x05, 0x15, 0x00, 0xff,
+ 0x29, 0x21, 0x00, 0xff, 0x1d, 0x15, 0x00, 0xff, 0x43, 0x29, 0x00, 0xff,
+ 0x37, 0x1d, 0x00, 0xff, 0x5b, 0x29, 0x00, 0xff, 0x4f, 0x1d, 0x00, 0xff,
+ 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff,
+ 0x87, 0x32, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff,
+ 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff,
+ 0xd2, 0x39, 0x00, 0xff, 0xe8, 0x4f, 0x00, 0xff, 0xe8, 0x70, 0x00, 0xff,
+ 0x7c, 0x9b, 0x00, 0xff, 0x6d, 0x89, 0x00, 0xff, 0x54, 0x5f, 0x00, 0xff,
+ 0x18, 0x2f, 0x00, 0xff, 0x20, 0x20, 0x00, 0xff, 0x0e, 0x0e, 0x00, 0xff,
+ 0x0e, 0x0e, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x05, 0x05, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff,
+ 0x0e, 0x18, 0x00, 0xff, 0x0e, 0x18, 0x00, 0xff, 0x32, 0x24, 0x00, 0xff,
+ 0x3e, 0x2e, 0x00, 0xff, 0x44, 0x13, 0x00, 0xff, 0x6c, 0x3b, 0x00, 0xff,
+ 0x6c, 0x1f, 0x00, 0xff, 0x8c, 0x41, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff,
+ 0x99, 0x32, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff, 0xbb, 0x10, 0x00, 0xff,
+ 0xc5, 0x05, 0x00, 0xff, 0xcf, 0x0b, 0x00, 0xff, 0xd5, 0x0e, 0x00, 0xff,
+ 0xe1, 0x13, 0x00, 0xff, 0xe7, 0x24, 0x00, 0xff, 0xe7, 0x40, 0x00, 0xff,
+ 0xe7, 0x58, 0x00, 0xff, 0xe7, 0x70, 0x00, 0xff, 0x7c, 0x9b, 0x00, 0xff,
+ 0x6d, 0x9b, 0x00, 0xff, 0x6d, 0x7d, 0x00, 0xff, 0x18, 0x2f, 0x00, 0xff,
+ 0x0e, 0x0e, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, 0x26, 0x2e, 0x00, 0xff,
+ 0x26, 0x2e, 0x00, 0xff, 0x26, 0x18, 0x00, 0xff, 0x4a, 0x3a, 0x00, 0xff,
+ 0x58, 0x25, 0x00, 0xff, 0x44, 0x13, 0x00, 0xff, 0x8c, 0x41, 0x00, 0xff,
+ 0x80, 0x35, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff, 0xa5, 0x3e, 0x00, 0xff,
+ 0x8d, 0x28, 0x00, 0xff, 0xbb, 0x10, 0x00, 0xff, 0xc5, 0x05, 0x00, 0xff,
+ 0xcf, 0x08, 0x00, 0xff, 0xdb, 0x0e, 0x00, 0xff, 0xe5, 0x11, 0x00, 0xff,
+ 0xe9, 0x24, 0x00, 0xff, 0xe9, 0x3c, 0x00, 0xff, 0xe9, 0x58, 0x00, 0xff,
+ 0xe9, 0x70, 0x00, 0xff, 0x8b, 0xad, 0x00, 0xff, 0x6d, 0x89, 0x00, 0xff,
+ 0x6d, 0x7d, 0x00, 0xff, 0x36, 0x41, 0x00, 0xff, 0x0e, 0x0e, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x05, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x09, 0x11, 0x00, 0xff, 0x26, 0x2e, 0x00, 0xff, 0x32, 0x3a, 0x00, 0xff,
+ 0x3e, 0x2e, 0x00, 0xff, 0x4a, 0x3a, 0x00, 0xff, 0x6c, 0x3b, 0x00, 0xff,
+ 0x6c, 0x3b, 0x00, 0xff, 0x74, 0x2b, 0x00, 0xff, 0x8c, 0x41, 0x00, 0xff,
+ 0x99, 0x32, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff, 0xa5, 0x3e, 0x00, 0xff,
+ 0xbb, 0x10, 0x00, 0xff, 0xcb, 0x02, 0x00, 0xff, 0xd5, 0x08, 0x00, 0xff,
+ 0xe1, 0x0b, 0x00, 0xff, 0xeb, 0x11, 0x00, 0xff, 0xeb, 0x24, 0x00, 0xff,
+ 0xeb, 0x3c, 0x00, 0xff, 0xeb, 0x58, 0x00, 0xff, 0xeb, 0x70, 0x00, 0xff,
+ 0x8b, 0xad, 0x00, 0xff, 0x6d, 0x9b, 0x00, 0xff, 0x6d, 0x7d, 0x00, 0xff,
+ 0x6d, 0x7d, 0x00, 0xff, 0x35, 0x35, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x11, 0x11, 0x00, 0xff,
+ 0x05, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff,
+ 0x26, 0x2e, 0x00, 0xff, 0x32, 0x3a, 0x00, 0xff, 0x4a, 0x3a, 0x00, 0xff,
+ 0x4a, 0x3a, 0x00, 0xff, 0x6c, 0x3b, 0x00, 0xff, 0x80, 0x4d, 0x00, 0xff,
+ 0x8c, 0x41, 0x00, 0xff, 0x80, 0x35, 0x00, 0xff, 0xa5, 0x3e, 0x00, 0xff,
+ 0xa5, 0x3e, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff, 0xbb, 0x10, 0x00, 0xff,
+ 0xcf, 0x02, 0x00, 0xff, 0xdb, 0x05, 0x00, 0xff, 0xe5, 0x0b, 0x00, 0xff,
+ 0xeb, 0x0e, 0x00, 0xff, 0xed, 0x24, 0x00, 0xff, 0xed, 0x3c, 0x00, 0xff,
+ 0xed, 0x54, 0x00, 0xff, 0xed, 0x70, 0x00, 0xff, 0x7d, 0x95, 0x00, 0xff,
+ 0x7d, 0x95, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff,
+ 0x5c, 0x6e, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x07, 0x00, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff,
+ 0x13, 0x13, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x3d, 0x1b, 0x00, 0xff,
+ 0x55, 0x33, 0x00, 0xff, 0x6b, 0x49, 0x00, 0xff, 0x6b, 0x49, 0x00, 0xff,
+ 0x69, 0x3f, 0x00, 0xff, 0x81, 0x57, 0x00, 0xff, 0x8d, 0x63, 0x00, 0xff,
+ 0x81, 0x57, 0x00, 0xff, 0xa0, 0x17, 0x00, 0xff, 0xb5, 0x2d, 0x00, 0xff,
+ 0xb5, 0x2d, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, 0xd7, 0x00, 0x00, 0xff,
+ 0xe1, 0x00, 0x00, 0xff, 0xea, 0x0a, 0x00, 0xff, 0xf0, 0x10, 0x00, 0xff,
+ 0xe8, 0x1d, 0x00, 0xff, 0xea, 0x3e, 0x00, 0xff, 0xee, 0x5f, 0x00, 0xff,
+ 0xf0, 0x80, 0x00, 0xff, 0x7d, 0x95, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff,
+ 0x5d, 0x77, 0x00, 0xff, 0x41, 0x65, 0x00, 0xff, 0x3e, 0x55, 0x00, 0xff,
+ 0x25, 0x37, 0x00, 0xff, 0x1b, 0x0a, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff,
+ 0x13, 0x13, 0x00, 0xff, 0x3d, 0x1b, 0x00, 0xff, 0x55, 0x33, 0x00, 0xff,
+ 0x55, 0x33, 0x00, 0xff, 0x6b, 0x49, 0x00, 0xff, 0x75, 0x4b, 0x00, 0xff,
+ 0x69, 0x3f, 0x00, 0xff, 0x81, 0x57, 0x00, 0xff, 0x8d, 0x63, 0x00, 0xff,
+ 0xb5, 0x2d, 0x00, 0xff, 0xa0, 0x17, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff,
+ 0xd3, 0x05, 0x00, 0xff, 0xd7, 0x00, 0x00, 0xff, 0xed, 0x05, 0x00, 0xff,
+ 0xea, 0x0a, 0x00, 0xff, 0xf0, 0x10, 0x00, 0xff, 0xe8, 0x1d, 0x00, 0xff,
+ 0xec, 0x3e, 0x00, 0xff, 0xee, 0x5f, 0x00, 0xff, 0xf2, 0x80, 0x00, 0xff,
+ 0x71, 0x65, 0x00, 0xff, 0x5d, 0x53, 0x00, 0xff, 0x49, 0x41, 0x00, 0xff,
+ 0x35, 0x2f, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff,
+ 0x3e, 0x28, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff,
+ 0x33, 0x33, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff,
+ 0x55, 0x33, 0x00, 0xff, 0x55, 0x33, 0x00, 0xff, 0x77, 0x33, 0x00, 0xff,
+ 0x77, 0x33, 0x00, 0xff, 0x8d, 0x33, 0x00, 0xff, 0x8d, 0x33, 0x00, 0xff,
+ 0x8d, 0x33, 0x00, 0xff, 0xa5, 0x4b, 0x00, 0xff, 0xb5, 0x2d, 0x00, 0xff,
+ 0xb5, 0x2d, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff,
+ 0xe1, 0x00, 0x00, 0xff, 0xed, 0x05, 0x00, 0xff, 0xe6, 0x05, 0x00, 0xff,
+ 0xf0, 0x10, 0x00, 0xff, 0xea, 0x1d, 0x00, 0xff, 0xec, 0x3e, 0x00, 0xff,
+ 0xf0, 0x5f, 0x00, 0xff, 0xf2, 0x80, 0x00, 0xff, 0x71, 0x65, 0x00, 0xff,
+ 0x5d, 0x53, 0x00, 0xff, 0x49, 0x41, 0x00, 0xff, 0x35, 0x2f, 0x00, 0xff,
+ 0x07, 0x19, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff, 0x3e, 0x28, 0x00, 0xff,
+ 0x1b, 0x0a, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff,
+ 0x33, 0x33, 0x00, 0xff, 0x53, 0x53, 0x00, 0xff, 0x55, 0x33, 0x00, 0xff,
+ 0x6b, 0x49, 0x00, 0xff, 0x77, 0x33, 0x00, 0xff, 0x77, 0x33, 0x00, 0xff,
+ 0x81, 0x27, 0x00, 0xff, 0x99, 0x3f, 0x00, 0xff, 0x99, 0x3f, 0x00, 0xff,
+ 0x8d, 0x33, 0x00, 0xff, 0xb5, 0x2d, 0x00, 0xff, 0xb5, 0x2d, 0x00, 0xff,
+ 0xd3, 0x05, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, 0xe1, 0x00, 0x00, 0xff,
+ 0xed, 0x05, 0x00, 0xff, 0xe6, 0x05, 0x00, 0xff, 0xea, 0x0a, 0x00, 0xff,
+ 0xea, 0x1d, 0x00, 0xff, 0xee, 0x3e, 0x00, 0xff, 0xf0, 0x5f, 0x00, 0xff,
+ 0xf2, 0x80, 0x00, 0xff, 0x7b, 0x74, 0x00, 0xff, 0x57, 0x4a, 0x00, 0xff,
+ 0x60, 0x4a, 0x00, 0xff, 0x4e, 0x35, 0x00, 0xff, 0x45, 0x33, 0x00, 0xff,
+ 0x33, 0x23, 0x00, 0xff, 0x45, 0x33, 0x00, 0xff, 0x45, 0x33, 0x00, 0xff,
+ 0x56, 0x22, 0x00, 0xff, 0x66, 0x00, 0x00, 0xff, 0x56, 0x22, 0x00, 0xff,
+ 0x76, 0x43, 0x00, 0xff, 0x8d, 0x4a, 0x00, 0xff, 0x65, 0x26, 0x00, 0xff,
+ 0x8d, 0x4a, 0x00, 0xff, 0x79, 0x3a, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff,
+ 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff,
+ 0xc3, 0x00, 0x00, 0xff, 0xe9, 0x11, 0x00, 0xff, 0xdf, 0x00, 0x00, 0xff,
+ 0xe9, 0x02, 0x00, 0xff, 0xeb, 0x00, 0x00, 0xff, 0xed, 0x05, 0x00, 0xff,
+ 0xed, 0x0a, 0x00, 0xff, 0xef, 0x10, 0x00, 0xff, 0xeb, 0x1b, 0x00, 0xff,
+ 0xec, 0x3e, 0x00, 0xff, 0xed, 0x5c, 0x00, 0xff, 0xef, 0x7a, 0x00, 0xff,
+ 0x90, 0x89, 0x00, 0xff, 0x57, 0x4a, 0x00, 0xff, 0x4e, 0x35, 0x00, 0xff,
+ 0x4e, 0x35, 0x00, 0xff, 0x45, 0x33, 0x00, 0xff, 0x33, 0x23, 0x00, 0xff,
+ 0x33, 0x23, 0x00, 0xff, 0x54, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff,
+ 0x86, 0x10, 0x00, 0xff, 0x86, 0x10, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff,
+ 0x8d, 0x4a, 0x00, 0xff, 0x8d, 0x4a, 0x00, 0xff, 0x79, 0x3a, 0x00, 0xff,
+ 0x8d, 0x4a, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff,
+ 0xb5, 0x0b, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, 0xc3, 0x00, 0x00, 0xff,
+ 0xd5, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x00, 0xff,
+ 0xe9, 0x01, 0x00, 0xff, 0xeb, 0x05, 0x00, 0xff, 0xeb, 0x0a, 0x00, 0xff,
+ 0xed, 0x10, 0x00, 0xff, 0xeb, 0x1b, 0x00, 0xff, 0xec, 0x39, 0x00, 0xff,
+ 0xed, 0x5c, 0x00, 0xff, 0xef, 0x7a, 0x00, 0xff, 0x90, 0x89, 0x00, 0xff,
+ 0x6c, 0x5f, 0x00, 0xff, 0x4e, 0x35, 0x00, 0xff, 0x60, 0x4a, 0x00, 0xff,
+ 0x54, 0x43, 0x00, 0xff, 0x54, 0x43, 0x00, 0xff, 0x66, 0x0f, 0x00, 0xff,
+ 0x54, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff,
+ 0x86, 0x10, 0x00, 0xff, 0x86, 0x10, 0x00, 0xff, 0xad, 0x32, 0x00, 0xff,
+ 0xad, 0x32, 0x00, 0xff, 0x95, 0x1e, 0x00, 0xff, 0xa1, 0x26, 0x00, 0xff,
+ 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff,
+ 0xb5, 0x0b, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff,
+ 0xe5, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x00, 0xff, 0xe7, 0x01, 0x00, 0xff,
+ 0xe9, 0x05, 0x00, 0xff, 0xe9, 0x0a, 0x00, 0xff, 0xeb, 0x10, 0x00, 0xff,
+ 0xeb, 0x1b, 0x00, 0xff, 0xec, 0x39, 0x00, 0xff, 0xed, 0x5c, 0x00, 0xff,
+ 0xef, 0x7a, 0x00, 0xff, 0x90, 0x89, 0x00, 0xff, 0x7b, 0x74, 0x00, 0xff,
+ 0x60, 0x4a, 0x00, 0xff, 0x60, 0x4a, 0x00, 0xff, 0x54, 0x43, 0x00, 0xff,
+ 0x54, 0x43, 0x00, 0xff, 0x66, 0x0f, 0x00, 0xff, 0x66, 0x0f, 0x00, 0xff,
+ 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, 0x86, 0x10, 0x00, 0xff,
+ 0x86, 0x10, 0x00, 0xff, 0x8d, 0x0e, 0x00, 0xff, 0xa1, 0x26, 0x00, 0xff,
+ 0xa1, 0x26, 0x00, 0xff, 0x8d, 0x0e, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff,
+ 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff,
+ 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xdf, 0x00, 0x00, 0xff,
+ 0xdf, 0x00, 0x00, 0xff, 0xe5, 0x01, 0x00, 0xff, 0xe7, 0x07, 0x00, 0xff,
+ 0xe7, 0x0c, 0x00, 0xff, 0xe9, 0x10, 0x00, 0xff, 0xeb, 0x1b, 0x00, 0xff,
+ 0xec, 0x39, 0x00, 0xff, 0xed, 0x5c, 0x00, 0xff, 0xef, 0x7a, 0x00, 0xff,
+ 0x9d, 0x83, 0x00, 0xff, 0x9d, 0x83, 0x00, 0xff, 0x8e, 0x56, 0x00, 0xff,
+ 0x73, 0x38, 0x00, 0xff, 0x73, 0x3e, 0x00, 0xff, 0x73, 0x32, 0x00, 0xff,
+ 0x7c, 0x26, 0x00, 0xff, 0x7c, 0x1c, 0x00, 0xff, 0x82, 0x1c, 0x00, 0xff,
+ 0x8e, 0x28, 0x00, 0xff, 0x8e, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff,
+ 0xb3, 0x0e, 0x00, 0xff, 0xad, 0x08, 0x00, 0xff, 0xbd, 0x18, 0x00, 0xff,
+ 0xb9, 0x12, 0x00, 0xff, 0xbf, 0x00, 0x00, 0xff, 0xc9, 0x02, 0x00, 0xff,
+ 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x00, 0xff,
+ 0xdd, 0x00, 0x00, 0xff, 0xdf, 0x02, 0x00, 0xff, 0xe1, 0x02, 0x00, 0xff,
+ 0xe4, 0x02, 0x00, 0xff, 0xe6, 0x08, 0x00, 0xff, 0xe8, 0x0e, 0x00, 0xff,
+ 0xea, 0x16, 0x00, 0xff, 0xeb, 0x23, 0x00, 0xff, 0xed, 0x41, 0x00, 0xff,
+ 0xef, 0x6e, 0x00, 0xff, 0xf1, 0x82, 0x00, 0xff, 0x9d, 0x83, 0x00, 0xff,
+ 0xa3, 0x8d, 0x00, 0xff, 0xa9, 0x6f, 0x00, 0xff, 0x8e, 0x56, 0x00, 0xff,
+ 0x85, 0x3e, 0x00, 0xff, 0x85, 0x32, 0x00, 0xff, 0x8b, 0x26, 0x00, 0xff,
+ 0x8b, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff,
+ 0xb0, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xad, 0x08, 0x00, 0xff,
+ 0xbd, 0x18, 0x00, 0xff, 0xbd, 0x18, 0x00, 0xff, 0xb3, 0x0e, 0x00, 0xff,
+ 0xc9, 0x02, 0x00, 0xff, 0xc9, 0x02, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff,
+ 0xdb, 0x05, 0x00, 0xff, 0xdd, 0x05, 0x00, 0xff, 0xdf, 0x05, 0x00, 0xff,
+ 0xe1, 0x08, 0x00, 0xff, 0xe3, 0x08, 0x00, 0xff, 0xe2, 0x02, 0x00, 0xff,
+ 0xe4, 0x0b, 0x00, 0xff, 0xe6, 0x13, 0x00, 0xff, 0xe8, 0x19, 0x00, 0xff,
+ 0xe9, 0x32, 0x00, 0xff, 0xeb, 0x55, 0x00, 0xff, 0xed, 0x6e, 0x00, 0xff,
+ 0xef, 0x91, 0x00, 0xff, 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x79, 0x00, 0xff,
+ 0xa9, 0x6f, 0x00, 0xff, 0x8e, 0x56, 0x00, 0xff, 0x9a, 0x42, 0x00, 0xff,
+ 0x9a, 0x38, 0x00, 0xff, 0xa0, 0x2c, 0x00, 0xff, 0xa0, 0x20, 0x00, 0xff,
+ 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff,
+ 0xb0, 0x28, 0x00, 0xff, 0xcb, 0x0e, 0x00, 0xff, 0xcb, 0x0e, 0x00, 0xff,
+ 0xcb, 0x0e, 0x00, 0xff, 0xd1, 0x12, 0x00, 0xff, 0xd5, 0x0d, 0x00, 0xff,
+ 0xd5, 0x0d, 0x00, 0xff, 0xe5, 0x10, 0x00, 0xff, 0xdb, 0x05, 0x00, 0xff,
+ 0xdd, 0x08, 0x00, 0xff, 0xdf, 0x0b, 0x00, 0xff, 0xe1, 0x0b, 0x00, 0xff,
+ 0xe3, 0x0b, 0x00, 0xff, 0xe2, 0x08, 0x00, 0xff, 0xe4, 0x0e, 0x00, 0xff,
+ 0xe6, 0x16, 0x00, 0xff, 0xe8, 0x1f, 0x00, 0xff, 0xe7, 0x41, 0x00, 0xff,
+ 0xe9, 0x55, 0x00, 0xff, 0xeb, 0x82, 0x00, 0xff, 0xed, 0xa0, 0x00, 0xff,
+ 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x79, 0x00, 0xff, 0xa9, 0x6f, 0x00, 0xff,
+ 0x8e, 0x56, 0x00, 0xff, 0xa9, 0x42, 0x00, 0xff, 0xa9, 0x38, 0x00, 0xff,
+ 0xb2, 0x2c, 0x00, 0xff, 0xb2, 0x20, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff,
+ 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff,
+ 0xd7, 0x18, 0x00, 0xff, 0xd1, 0x12, 0x00, 0xff, 0xd7, 0x18, 0x00, 0xff,
+ 0xd7, 0x18, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff,
+ 0xe5, 0x10, 0x00, 0xff, 0xe5, 0x10, 0x00, 0xff, 0xdf, 0x0e, 0x00, 0xff,
+ 0xe1, 0x0e, 0x00, 0xff, 0xe3, 0x10, 0x00, 0xff, 0xe5, 0x10, 0x00, 0xff,
+ 0xe0, 0x0b, 0x00, 0xff, 0xe2, 0x13, 0x00, 0xff, 0xe4, 0x19, 0x00, 0xff,
+ 0xe6, 0x1f, 0x00, 0xff, 0xe7, 0x41, 0x00, 0xff, 0xe7, 0x6e, 0x00, 0xff,
+ 0xe9, 0x82, 0x00, 0xff, 0xeb, 0xa0, 0x00, 0xff, 0xd3, 0x8d, 0x00, 0xff,
+ 0xc4, 0x7b, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff,
+ 0xce, 0x49, 0x00, 0xff, 0xce, 0x49, 0x00, 0xff, 0xb9, 0x35, 0x00, 0xff,
+ 0xb9, 0x35, 0x00, 0xff, 0xcb, 0x29, 0x00, 0xff, 0xcb, 0x29, 0x00, 0xff,
+ 0xcb, 0x29, 0x00, 0xff, 0xcb, 0x29, 0x00, 0xff, 0xd8, 0x1f, 0x00, 0xff,
+ 0xd8, 0x1f, 0x00, 0xff, 0xdd, 0x1f, 0x00, 0xff, 0xe0, 0x1f, 0x00, 0xff,
+ 0xe7, 0x1e, 0x00, 0xff, 0xe7, 0x1e, 0x00, 0xff, 0xe7, 0x1e, 0x00, 0xff,
+ 0xe7, 0x1e, 0x00, 0xff, 0xe3, 0x1c, 0x00, 0xff, 0xe3, 0x1c, 0x00, 0xff,
+ 0xe3, 0x1c, 0x00, 0xff, 0xe3, 0x1c, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff,
+ 0xdf, 0x25, 0x00, 0xff, 0xe2, 0x25, 0x00, 0xff, 0xe2, 0x31, 0x00, 0xff,
+ 0xe4, 0x50, 0x00, 0xff, 0xe4, 0x68, 0x00, 0xff, 0xe6, 0x80, 0x00, 0xff,
+ 0xe6, 0x94, 0x00, 0xff, 0xe8, 0x9f, 0x00, 0xff, 0xd3, 0x8d, 0x00, 0xff,
+ 0xcd, 0x69, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, 0xce, 0x49, 0x00, 0xff,
+ 0xce, 0x49, 0x00, 0xff, 0xce, 0x49, 0x00, 0xff, 0xce, 0x49, 0x00, 0xff,
+ 0xd8, 0x45, 0x00, 0xff, 0xd8, 0x45, 0x00, 0xff, 0xd8, 0x41, 0x00, 0xff,
+ 0xd8, 0x41, 0x00, 0xff, 0xdd, 0x3b, 0x00, 0xff, 0xe0, 0x3b, 0x00, 0xff,
+ 0xe3, 0x3b, 0x00, 0xff, 0xe6, 0x3b, 0x00, 0xff, 0xe9, 0x3e, 0x00, 0xff,
+ 0xe9, 0x36, 0x00, 0xff, 0xe9, 0x36, 0x00, 0xff, 0xe9, 0x36, 0x00, 0xff,
+ 0xe7, 0x36, 0x00, 0xff, 0xe7, 0x36, 0x00, 0xff, 0xe7, 0x36, 0x00, 0xff,
+ 0xe7, 0x36, 0x00, 0xff, 0xe4, 0x31, 0x00, 0xff, 0xe4, 0x41, 0x00, 0xff,
+ 0xe4, 0x41, 0x00, 0xff, 0xe7, 0x55, 0x00, 0xff, 0xe6, 0x68, 0x00, 0xff,
+ 0xe8, 0x74, 0x00, 0xff, 0xe8, 0x94, 0x00, 0xff, 0xea, 0xa0, 0x00, 0xff,
+ 0xfa, 0xb1, 0x00, 0xff, 0xe8, 0x9f, 0x00, 0xff, 0xe2, 0x7b, 0x00, 0xff,
+ 0xcd, 0x69, 0x00, 0xff, 0xe3, 0x65, 0x00, 0xff, 0xe3, 0x65, 0x00, 0xff,
+ 0xe3, 0x65, 0x00, 0xff, 0xe3, 0x65, 0x00, 0xff, 0xe5, 0x5d, 0x00, 0xff,
+ 0xe5, 0x5d, 0x00, 0xff, 0xe5, 0x59, 0x00, 0xff, 0xe5, 0x59, 0x00, 0xff,
+ 0xe3, 0x57, 0x00, 0xff, 0xe6, 0x57, 0x00, 0xff, 0xe9, 0x57, 0x00, 0xff,
+ 0xec, 0x57, 0x00, 0xff, 0xeb, 0x5a, 0x00, 0xff, 0xeb, 0x52, 0x00, 0xff,
+ 0xeb, 0x52, 0x00, 0xff, 0xeb, 0x52, 0x00, 0xff, 0xeb, 0x50, 0x00, 0xff,
+ 0xeb, 0x50, 0x00, 0xff, 0xeb, 0x50, 0x00, 0xff, 0xeb, 0x50, 0x00, 0xff,
+ 0xe7, 0x55, 0x00, 0xff, 0xe7, 0x55, 0x00, 0xff, 0xea, 0x65, 0x00, 0xff,
+ 0xea, 0x65, 0x00, 0xff, 0xea, 0x74, 0x00, 0xff, 0xea, 0x80, 0x00, 0xff,
+ 0xec, 0xa0, 0x00, 0xff, 0xec, 0xac, 0x00, 0xff, 0xfa, 0xb1, 0x00, 0xff,
+ 0xfa, 0xb1, 0x00, 0xff, 0xf1, 0x8d, 0x00, 0xff, 0xf1, 0x8d, 0x00, 0xff,
+ 0xf8, 0x7d, 0x00, 0xff, 0xf8, 0x7d, 0x00, 0xff, 0xf8, 0x7d, 0x00, 0xff,
+ 0xf8, 0x7d, 0x00, 0xff, 0xf2, 0x75, 0x00, 0xff, 0xf2, 0x75, 0x00, 0xff,
+ 0xf2, 0x75, 0x00, 0xff, 0xf2, 0x75, 0x00, 0xff, 0xe9, 0x73, 0x00, 0xff,
+ 0xec, 0x73, 0x00, 0xff, 0xf1, 0x73, 0x00, 0xff, 0xf1, 0x73, 0x00, 0xff,
+ 0xed, 0x72, 0x00, 0xff, 0xed, 0x72, 0x00, 0xff, 0xed, 0x72, 0x00, 0xff,
+ 0xed, 0x66, 0x00, 0xff, 0xef, 0x6a, 0x00, 0xff, 0xef, 0x6a, 0x00, 0xff,
+ 0xef, 0x6a, 0x00, 0xff, 0xef, 0x6a, 0x00, 0xff, 0xea, 0x65, 0x00, 0xff,
+ 0xed, 0x71, 0x00, 0xff, 0xed, 0x7d, 0x00, 0xff, 0xef, 0x7d, 0x00, 0xff,
+ 0xec, 0x80, 0x00, 0xff, 0xee, 0x94, 0x00, 0xff, 0xee, 0xac, 0x00, 0xff,
+ 0xee, 0xc4, 0x00, 0xff,
+ ]),
+};
+
+var img_32x32_signed_rg11_eac = {
+ compressed: new Uint8Array([
+ 0x24, 0x8b, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, 0x09, 0x72, 0xdb, 0x5d,
+ 0x68, 0xb4, 0x49, 0x01, 0xd6, 0x62, 0xd2, 0x0b, 0x01, 0xd0, 0x9d, 0x02,
+ 0xe6, 0x62, 0xd2, 0x0b, 0x01, 0xd0, 0x9d, 0x02, 0xe0, 0x47, 0xd1, 0x1d,
+ 0x42, 0xf0, 0x39, 0x1b, 0xf1, 0x47, 0xd1, 0x1d, 0x42, 0xf0, 0x39, 0x1b,
+ 0xd8, 0x62, 0xa0, 0x2c, 0x0a, 0xd0, 0xab, 0x02, 0xd8, 0x69, 0xd0, 0x2f,
+ 0x0a, 0xf4, 0xad, 0x42, 0xd4, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43,
+ 0xe4, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43, 0xcb, 0x7b, 0xd4, 0x4d,
+ 0x41, 0xd6, 0x2f, 0x41, 0xcb, 0x7b, 0xd4, 0x4d, 0x41, 0xd6, 0x2f, 0x41,
+ 0xf2, 0xbd, 0xd1, 0x2d, 0x11, 0xd0, 0xac, 0x02, 0xe0, 0x47, 0xf5, 0x2f,
+ 0x51, 0xf4, 0xaf, 0x02, 0x1f, 0x49, 0x48, 0x92, 0x04, 0x92, 0xdb, 0xb7,
+ 0xf5, 0x6b, 0x80, 0xab, 0x01, 0xd6, 0x0f, 0xac, 0xe9, 0x69, 0xbb, 0x58,
+ 0x00, 0x25, 0x20, 0x9a, 0xe9, 0x69, 0xbb, 0x58, 0x00, 0x25, 0x20, 0x9a,
+ 0x9d, 0x32, 0xfe, 0xae, 0x10, 0x9c, 0x99, 0x31, 0xb2, 0x3c, 0xfe, 0xbe,
+ 0x18, 0x1d, 0xb0, 0x2b, 0x90, 0x3c, 0xa2, 0xde, 0x00, 0xd9, 0x09, 0x22,
+ 0xa5, 0x20, 0x86, 0x4e, 0x49, 0x91, 0xa0, 0x03, 0x93, 0x3d, 0x18, 0xea,
+ 0x0e, 0x14, 0xbc, 0x1e, 0x98, 0x2a, 0x32, 0xf0, 0x6f, 0x22, 0xa8, 0x57,
+ 0x82, 0x8f, 0x96, 0x4b, 0x24, 0x96, 0x4d, 0x2c, 0xa9, 0x3a, 0x54, 0x2a,
+ 0x80, 0x54, 0x2e, 0x2a, 0xdd, 0x47, 0x29, 0x00, 0xc2, 0x64, 0x26, 0xb0,
+ 0xb7, 0x4b, 0xd5, 0x0f, 0x02, 0x98, 0x29, 0x78, 0xea, 0x44, 0x6a, 0xc0,
+ 0xad, 0x82, 0x61, 0x26, 0xc5, 0x20, 0x66, 0x0a, 0x64, 0xf4, 0x6b, 0xc6,
+ 0x35, 0x4b, 0x64, 0x14, 0x80, 0x92, 0x4f, 0xff, 0xe5, 0x47, 0x64, 0x14,
+ 0x80, 0x00, 0x0b, 0x6d, 0xdd, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52,
+ 0xed, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52, 0x97, 0x2a, 0xf7, 0xd5,
+ 0xe8, 0x0b, 0xaa, 0x05, 0xa0, 0x2a, 0xf7, 0xd5, 0xe8, 0x0b, 0xaa, 0x05,
+ 0x8e, 0x3d, 0x77, 0xb4, 0xe7, 0x49, 0xbb, 0x5b, 0xa0, 0x30, 0x63, 0x82,
+ 0xaf, 0x24, 0x00, 0x1b, 0x8e, 0x42, 0x80, 0x18, 0x08, 0xd2, 0x68, 0x25,
+ 0x8f, 0x2a, 0xf6, 0xaf, 0x45, 0xe0, 0x70, 0x85, 0xc0, 0x42, 0x09, 0x44,
+ 0x88, 0xa0, 0x6b, 0xad, 0x97, 0x2a, 0xa9, 0x74, 0x85, 0xa9, 0x7b, 0xed,
+ 0xf0, 0x23, 0x6f, 0xfb, 0xff, 0xf7, 0xf3, 0xff, 0x87, 0xb2, 0xb6, 0xdd,
+ 0x6d, 0xba, 0xd9, 0x6d, 0x24, 0x37, 0x2e, 0xf6, 0x7f, 0xaf, 0xfb, 0x7f,
+ 0xa7, 0x4c, 0x63, 0x90, 0xc9, 0xe0, 0x9f, 0xc9, 0xfb, 0xb5, 0xdb, 0x6d,
+ 0xb6, 0xdf, 0xff, 0xff, 0xdb, 0xbd, 0x8a, 0x24, 0x92, 0x80, 0x0d, 0xb6,
+ 0xe3, 0x50, 0xb7, 0x69, 0x24, 0x12, 0x46, 0xd4, 0xf1, 0x67, 0xdb, 0xfb,
+ 0xae, 0x12, 0x46, 0xd4, 0x9b, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb,
+ 0x9b, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb, 0x80, 0x2f, 0x02, 0x78,
+ 0x04, 0xb4, 0x0b, 0x6d, 0x80, 0x20, 0x02, 0x68, 0x04, 0xd8, 0x0d, 0xb6,
+ 0xaf, 0x42, 0x40, 0x04, 0x24, 0x82, 0xeb, 0xb6, 0xa8, 0x2a, 0x56, 0xd5,
+ 0x7f, 0x0a, 0xfb, 0xff, 0xe5, 0x47, 0x42, 0x48, 0xa6, 0x9e, 0xff, 0xbe,
+ 0xb2, 0x20, 0x66, 0xda, 0xef, 0x58, 0x6d, 0x34, 0x20, 0x20, 0x00, 0x41,
+ 0x04, 0x0a, 0x0f, 0xff, 0xaf, 0x20, 0x92, 0x69, 0xa6, 0x83, 0x46, 0xdb,
+ 0x5a, 0x2b, 0x6d, 0x14, 0x44, 0x12, 0xdb, 0xbf, 0x8b, 0x19, 0x25, 0x28,
+ 0x01, 0xb6, 0x4f, 0xb5, 0x66, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77,
+ 0xcd, 0x4c, 0x6d, 0xb0, 0x49, 0xb6, 0xcf, 0xff, 0xd5, 0x47, 0xff, 0x6f,
+ 0x24, 0x90, 0x08, 0x12, 0xcd, 0x62, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x49,
+ 0xb0, 0x5a, 0xf4, 0x20, 0x00, 0x66, 0xd4, 0xd1, 0xb3, 0x52, 0xfa, 0x19,
+ 0x24, 0x68, 0x06, 0xda, 0x83, 0x85, 0x92, 0xd9, 0x2d, 0x96, 0xdb, 0x2f,
+ 0x83, 0x85, 0x90, 0x09, 0x28, 0x96, 0xd1, 0x2f, 0xdc, 0x20, 0x6c, 0x00,
+ 0x06, 0xc3, 0xfd, 0xbf, 0xaf, 0x20, 0x4a, 0x49, 0x27, 0xf2, 0x4f, 0xe4,
+ 0x0a, 0x42, 0x46, 0x00, 0xa5, 0x82, 0x51, 0x34, 0xc8, 0x42, 0x10, 0xaa,
+ 0x08, 0xd4, 0x8b, 0xa1, 0x41, 0x36, 0x60, 0x00, 0xc0, 0x16, 0xdb, 0x6d,
+ 0x92, 0x3c, 0x9f, 0xff, 0x3f, 0xe4, 0x92, 0x49, 0x64, 0x11, 0x6c, 0x01,
+ 0xb6, 0xb6, 0x4f, 0xfd, 0x89, 0x1a, 0x6d, 0xb6, 0x49, 0x90, 0x0d, 0xb4,
+ 0x6f, 0x2d, 0x49, 0x12, 0x40, 0x12, 0x5b, 0x76, 0xb3, 0xb2, 0x00, 0x09,
+ 0x24, 0xb6, 0xdd, 0xb6, 0xf6, 0x31, 0x9b, 0x64, 0x84, 0x2d, 0x96, 0xc9,
+ 0xd9, 0x72, 0xbb, 0x60, 0x25, 0x04, 0x82, 0x40, 0xcb, 0x3a, 0x02, 0xd4,
+ 0xad, 0x0b, 0xf1, 0x6f, 0xa9, 0x3a, 0xb7, 0xf0, 0x3f, 0xa1, 0x2b, 0xfa,
+ 0xf0, 0x23, 0x76, 0xd3, 0xed, 0x7f, 0xfb, 0x7f, 0x9f, 0x32, 0x9f, 0xf6,
+ 0x7f, 0x84, 0x9f, 0xc9, 0x06, 0x47, 0x93, 0xc5, 0x3e, 0x82, 0xe1, 0x34,
+ 0xb6, 0x32, 0xd8, 0x33, 0x81, 0xd1, 0x19, 0x8b, 0x26, 0x20, 0x00, 0x60,
+ 0x07, 0x1b, 0xfd, 0xb7, 0x9a, 0x10, 0xff, 0xbf, 0xf8, 0xec, 0x06, 0xd8,
+ 0x5b, 0x24, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, 0x82, 0xfd, 0x00, 0x0a,
+ 0x00, 0x00, 0x08, 0x00, 0x6b, 0x2d, 0x80, 0xab, 0x01, 0xb0, 0x1d, 0x60,
+ 0x89, 0x1a, 0x69, 0x22, 0x00, 0x96, 0xdd, 0xb7, 0x6d, 0x00, 0x49, 0x20,
+ 0x00, 0xdb, 0x6f, 0xff, 0xce, 0x5c, 0x6d, 0xb2, 0x49, 0xb6, 0xcf, 0xff,
+ 0x1b, 0x33, 0x92, 0xd9, 0x40, 0x3b, 0x66, 0x49, 0xe6, 0x5f, 0xdb, 0xfd,
+ 0xed, 0x12, 0x46, 0x00, 0x15, 0x37, 0x66, 0x66, 0x66, 0x42, 0xf4, 0x2f,
+ 0xb1, 0x29, 0xdb, 0xf9, 0x2d, 0x24, 0x06, 0xd2, 0x15, 0x20, 0x5b, 0x61,
+ 0xb7, 0x1f, 0xfd, 0xbf, 0x84, 0x41, 0xb6, 0xdd, 0x6e, 0xdb, 0x6b, 0x76,
+ 0x43, 0x27, 0x4e, 0xf6, 0x2e, 0x02, 0xf2, 0xb7, 0x86, 0x2b, 0xb2, 0xf9,
+ 0xee, 0xfe, 0xfd, 0x77, 0x54, 0x2b, 0x66, 0x62, 0x66, 0x93, 0xf9, 0x6f,
+ 0x8b, 0x2a, 0x46, 0x62, 0x66, 0x4a, 0xd4, 0x05, 0x61, 0x2d, 0x44, 0x82,
+ 0x04, 0x12, 0x59, 0x6e, 0x88, 0x1b, 0x62, 0x64, 0x26, 0x22, 0xf3, 0x2f,
+ 0x66, 0x2d, 0x04, 0xa8, 0x01, 0xb2, 0x0d, 0x6c, 0x91, 0x10, 0x6d, 0x14,
+ 0x44, 0x12, 0xeb, 0xbf, 0x6c, 0x2d, 0x80, 0xab, 0x01, 0xd6, 0x0d, 0xac,
+ 0xe7, 0x6b, 0x6d, 0x12, 0x44, 0x92, 0xed, 0xbf, 0x5d, 0x37, 0x17, 0xf4,
+ 0x2f, 0x66, 0x66, 0xce, 0x07, 0x62, 0x97, 0x61, 0x2e, 0x44, 0x44, 0x8c,
+ 0x47, 0x72, 0x92, 0xe9, 0x2e, 0x12, 0xe1, 0x2e, 0xd5, 0x47, 0x02, 0xf0,
+ 0x2f, 0x42, 0xf4, 0x2f, 0x59, 0xdd, 0x12, 0xe1, 0x2e, 0x12, 0xe1, 0x2e,
+ 0xd2, 0x4c, 0x62, 0xf6, 0x2f, 0x66, 0x76, 0x67, 0x66, 0x12, 0x68, 0x56,
+ 0x66, 0x42, 0xf3, 0x37, 0x83, 0xef, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77,
+ 0x66, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, 0xc7, 0x47, 0x42, 0xf6,
+ 0x2f, 0x62, 0xf6, 0x67, 0x60, 0x2f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77,
+ 0x83, 0xdf, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, 0x66, 0x1b, 0x42, 0x62,
+ 0x2e, 0x32, 0xf1, 0x2f, 0xcd, 0x5b, 0x66, 0x64, 0x26, 0x42, 0xf3, 0x37,
+ 0x6b, 0x2d, 0x44, 0x54, 0x65, 0x42, 0x62, 0x2e, 0x0d, 0x40, 0x68, 0x84,
+ 0x44, 0x12, 0xe9, 0x77,
+ ]),
+ decompressed: new Uint8Array([
+ 0xab, 0xb9, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff,
+ 0x7c, 0x8f, 0x00, 0xff, 0x80, 0x8f, 0x00, 0xff, 0x6e, 0x7e, 0x00, 0xff,
+ 0x80, 0x8f, 0x00, 0xff, 0x80, 0x8f, 0x00, 0xff, 0x7c, 0x8c, 0x00, 0xff,
+ 0x7c, 0x8c, 0x00, 0xff, 0x87, 0x98, 0x00, 0xff, 0x68, 0x79, 0x00, 0xff,
+ 0x70, 0x81, 0x00, 0xff, 0x81, 0x8d, 0x00, 0xff, 0x81, 0x8d, 0x00, 0xff,
+ 0x70, 0x81, 0x00, 0xff, 0x7e, 0x8d, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff,
+ 0x6c, 0x7c, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, 0x75, 0x75, 0x00, 0xff,
+ 0x75, 0x75, 0x00, 0xff, 0x75, 0x75, 0x00, 0xff, 0x89, 0x89, 0x00, 0xff,
+ 0x87, 0x87, 0x00, 0xff, 0x87, 0x87, 0x00, 0xff, 0x87, 0x87, 0x00, 0xff,
+ 0x87, 0x87, 0x00, 0xff, 0x7f, 0x7b, 0x00, 0xff, 0x8a, 0x8c, 0x00, 0xff,
+ 0xa2, 0x98, 0x00, 0xff, 0xae, 0xaa, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff,
+ 0x93, 0xa4, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, 0x7c, 0x8f, 0x00, 0xff,
+ 0x5c, 0x6c, 0x00, 0xff, 0x5c, 0x6c, 0x00, 0xff, 0x5c, 0x6c, 0x00, 0xff,
+ 0x5c, 0x6c, 0x00, 0xff, 0x68, 0x79, 0x00, 0xff, 0x70, 0x80, 0x00, 0xff,
+ 0x68, 0x79, 0x00, 0xff, 0x68, 0x79, 0x00, 0xff, 0x4c, 0x5e, 0x00, 0xff,
+ 0x4c, 0x5e, 0x00, 0xff, 0x5e, 0x70, 0x00, 0xff, 0x5e, 0x70, 0x00, 0xff,
+ 0x5a, 0x6a, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff,
+ 0x42, 0x52, 0x00, 0xff, 0x67, 0x67, 0x00, 0xff, 0x67, 0x67, 0x00, 0xff,
+ 0x67, 0x67, 0x00, 0xff, 0x67, 0x67, 0x00, 0xff, 0x72, 0x70, 0x00, 0xff,
+ 0x72, 0x70, 0x00, 0xff, 0x72, 0x70, 0x00, 0xff, 0x67, 0x68, 0x00, 0xff,
+ 0x7f, 0x69, 0x00, 0xff, 0x96, 0x7b, 0x00, 0xff, 0xa2, 0x8c, 0x00, 0xff,
+ 0xba, 0x98, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff,
+ 0x6c, 0x7b, 0x00, 0xff, 0x6c, 0x7b, 0x00, 0xff, 0x5c, 0x6c, 0x00, 0xff,
+ 0x4a, 0x5a, 0x00, 0xff, 0x38, 0x48, 0x00, 0xff, 0x4a, 0x5a, 0x00, 0xff,
+ 0x40, 0x51, 0x00, 0xff, 0x54, 0x65, 0x00, 0xff, 0x54, 0x65, 0x00, 0xff,
+ 0x34, 0x45, 0x00, 0xff, 0x4c, 0x4c, 0x00, 0xff, 0x3a, 0x3a, 0x00, 0xff,
+ 0x3a, 0x3a, 0x00, 0xff, 0x4c, 0x4c, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff,
+ 0x4b, 0x5b, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff,
+ 0x3d, 0x3d, 0x00, 0xff, 0x3d, 0x3d, 0x00, 0xff, 0x52, 0x52, 0x00, 0xff,
+ 0x3d, 0x3d, 0x00, 0xff, 0x51, 0x40, 0x00, 0xff, 0x51, 0x40, 0x00, 0xff,
+ 0x5c, 0x4c, 0x00, 0xff, 0x67, 0x54, 0x00, 0xff, 0x8a, 0x57, 0x00, 0xff,
+ 0x96, 0x69, 0x00, 0xff, 0xae, 0x7b, 0x00, 0xff, 0xba, 0x8c, 0x00, 0xff,
+ 0x93, 0xa4, 0x00, 0xff, 0x6c, 0x7b, 0x00, 0xff, 0x7c, 0x8f, 0x00, 0xff,
+ 0x54, 0x66, 0x00, 0xff, 0x4a, 0x5a, 0x00, 0xff, 0x38, 0x48, 0x00, 0xff,
+ 0x38, 0x48, 0x00, 0xff, 0x26, 0x36, 0x00, 0xff, 0x4c, 0x5d, 0x00, 0xff,
+ 0x40, 0x51, 0x00, 0xff, 0x34, 0x45, 0x00, 0xff, 0x34, 0x45, 0x00, 0xff,
+ 0x28, 0x28, 0x00, 0xff, 0x28, 0x28, 0x00, 0xff, 0x28, 0x28, 0x00, 0xff,
+ 0x28, 0x28, 0x00, 0xff, 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff,
+ 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, 0x52, 0x52, 0x00, 0xff,
+ 0x28, 0x28, 0x00, 0xff, 0x1a, 0x1a, 0x00, 0xff, 0x28, 0x28, 0x00, 0xff,
+ 0x51, 0x40, 0x00, 0xff, 0x5c, 0x4c, 0x00, 0xff, 0x51, 0x40, 0x00, 0xff,
+ 0x51, 0x40, 0x00, 0xff, 0x8a, 0x4b, 0x00, 0xff, 0xa2, 0x57, 0x00, 0xff,
+ 0xae, 0x69, 0x00, 0xff, 0xc2, 0x7b, 0x00, 0xff, 0x80, 0x80, 0x00, 0xff,
+ 0x6f, 0x6f, 0x00, 0xff, 0x4b, 0x4b, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff,
+ 0x41, 0x4d, 0x00, 0xff, 0x41, 0x4d, 0x00, 0xff, 0x20, 0x29, 0x00, 0xff,
+ 0x20, 0x29, 0x00, 0xff, 0x19, 0x29, 0x00, 0xff, 0x2b, 0x41, 0x00, 0xff,
+ 0x22, 0x29, 0x00, 0xff, 0x16, 0x1f, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff,
+ 0x16, 0x14, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, 0x19, 0x1a, 0x00, 0xff,
+ 0x12, 0x11, 0x00, 0xff, 0x22, 0x32, 0x00, 0xff, 0x12, 0x11, 0x00, 0xff,
+ 0x32, 0x44, 0x00, 0xff, 0x49, 0x4f, 0x00, 0xff, 0x51, 0x5b, 0x00, 0xff,
+ 0x31, 0x3b, 0x00, 0xff, 0x31, 0x3b, 0x00, 0xff, 0x3a, 0x27, 0x00, 0xff,
+ 0x5e, 0x4f, 0x00, 0xff, 0x72, 0x61, 0x00, 0xff, 0x5e, 0x4f, 0x00, 0xff,
+ 0x8c, 0x39, 0x00, 0xff, 0x98, 0x45, 0x00, 0xff, 0xb8, 0x59, 0x00, 0xff,
+ 0xd8, 0x75, 0x00, 0xff, 0x92, 0x92, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff,
+ 0x4b, 0x4b, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, 0x41, 0x4d, 0x00, 0xff,
+ 0x17, 0x29, 0x00, 0xff, 0x41, 0x4d, 0x00, 0xff, 0x20, 0x29, 0x00, 0xff,
+ 0x07, 0x19, 0x00, 0xff, 0x07, 0x19, 0x00, 0xff, 0x22, 0x29, 0x00, 0xff,
+ 0x16, 0x1f, 0x00, 0xff, 0x19, 0x1a, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff,
+ 0x16, 0x14, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, 0x22, 0x32, 0x00, 0xff,
+ 0x12, 0x11, 0x00, 0xff, 0x22, 0x32, 0x00, 0xff, 0x12, 0x23, 0x00, 0xff,
+ 0x3d, 0x47, 0x00, 0xff, 0x31, 0x3b, 0x00, 0xff, 0x49, 0x4f, 0x00, 0xff,
+ 0x3d, 0x47, 0x00, 0xff, 0x4a, 0x39, 0x00, 0xff, 0x4a, 0x39, 0x00, 0xff,
+ 0x5e, 0x4f, 0x00, 0xff, 0x72, 0x61, 0x00, 0xff, 0xa0, 0x51, 0x00, 0xff,
+ 0x98, 0x45, 0x00, 0xff, 0xb8, 0x59, 0x00, 0xff, 0xd8, 0x75, 0x00, 0xff,
+ 0x92, 0x92, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff,
+ 0x2d, 0x2d, 0x00, 0xff, 0x29, 0x3b, 0x00, 0xff, 0x05, 0x14, 0x00, 0xff,
+ 0x0e, 0x14, 0x00, 0xff, 0x32, 0x3b, 0x00, 0xff, 0x19, 0x29, 0x00, 0xff,
+ 0x07, 0x19, 0x00, 0xff, 0x00, 0x07, 0x00, 0xff, 0x16, 0x1f, 0x00, 0xff,
+ 0x0d, 0x1e, 0x00, 0xff, 0x0d, 0x1e, 0x00, 0xff, 0x0d, 0x1e, 0x00, 0xff,
+ 0x00, 0x08, 0x00, 0xff, 0x12, 0x23, 0x00, 0xff, 0x12, 0x23, 0x00, 0xff,
+ 0x12, 0x23, 0x00, 0xff, 0x22, 0x32, 0x00, 0xff, 0x3d, 0x1b, 0x00, 0xff,
+ 0x51, 0x2f, 0x00, 0xff, 0x51, 0x2f, 0x00, 0xff, 0x79, 0x5b, 0x00, 0xff,
+ 0x7e, 0x49, 0x00, 0xff, 0x7e, 0x49, 0x00, 0xff, 0x72, 0x3f, 0x00, 0xff,
+ 0x72, 0x3f, 0x00, 0xff, 0xac, 0x59, 0x00, 0xff, 0xac, 0x59, 0x00, 0xff,
+ 0xb8, 0x59, 0x00, 0xff, 0xd8, 0x75, 0x00, 0xff, 0x80, 0x80, 0x00, 0xff,
+ 0x5d, 0x5d, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff,
+ 0x05, 0x14, 0x00, 0xff, 0x17, 0x29, 0x00, 0xff, 0x0e, 0x14, 0x00, 0xff,
+ 0x0e, 0x14, 0x00, 0xff, 0x19, 0x29, 0x00, 0xff, 0x07, 0x19, 0x00, 0xff,
+ 0x07, 0x13, 0x00, 0xff, 0x00, 0x07, 0x00, 0xff, 0x19, 0x2a, 0x00, 0xff,
+ 0x19, 0x2a, 0x00, 0xff, 0x00, 0x08, 0x00, 0xff, 0x19, 0x2a, 0x00, 0xff,
+ 0x12, 0x11, 0x00, 0xff, 0x12, 0x23, 0x00, 0xff, 0x12, 0x11, 0x00, 0xff,
+ 0x12, 0x11, 0x00, 0xff, 0x51, 0x2f, 0x00, 0xff, 0x3d, 0x1b, 0x00, 0xff,
+ 0x3d, 0x1b, 0x00, 0xff, 0x51, 0x2f, 0x00, 0xff, 0x72, 0x3f, 0x00, 0xff,
+ 0x7e, 0x49, 0x00, 0xff, 0x85, 0x55, 0x00, 0xff, 0x85, 0x55, 0x00, 0xff,
+ 0xa0, 0x51, 0x00, 0xff, 0xac, 0x59, 0x00, 0xff, 0xb8, 0x59, 0x00, 0xff,
+ 0xd8, 0x75, 0x00, 0xff, 0x75, 0x84, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff,
+ 0x3f, 0x4f, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff,
+ 0x07, 0x10, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x05, 0x0e, 0x00, 0xff, 0x05, 0x0e, 0x00, 0xff,
+ 0x11, 0x17, 0x00, 0xff, 0x12, 0x21, 0x00, 0xff, 0x12, 0x21, 0x00, 0xff,
+ 0x2a, 0x21, 0x00, 0xff, 0x12, 0x0b, 0x00, 0xff, 0x38, 0x1d, 0x00, 0xff,
+ 0x20, 0x07, 0x00, 0xff, 0x50, 0x1d, 0x00, 0xff, 0x50, 0x1d, 0x00, 0xff,
+ 0x56, 0x33, 0x00, 0xff, 0x76, 0x54, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff,
+ 0x68, 0x12, 0x00, 0xff, 0x94, 0x00, 0x00, 0xff, 0x82, 0x1b, 0x00, 0xff,
+ 0xaf, 0x4b, 0x00, 0xff, 0xaf, 0x4b, 0x00, 0xff, 0xd2, 0x5b, 0x00, 0xff,
+ 0xd2, 0x3a, 0x00, 0xff, 0xd2, 0x5b, 0x00, 0xff, 0xe8, 0x71, 0x00, 0xff,
+ 0x63, 0x73, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, 0x3f, 0x4f, 0x00, 0xff,
+ 0x3f, 0x4f, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff,
+ 0x07, 0x10, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, 0x11, 0x17, 0x00, 0xff,
+ 0x00, 0x05, 0x00, 0xff, 0x05, 0x0e, 0x00, 0xff, 0x11, 0x17, 0x00, 0xff,
+ 0x06, 0x15, 0x00, 0xff, 0x06, 0x15, 0x00, 0xff, 0x12, 0x0b, 0x00, 0xff,
+ 0x06, 0x00, 0x00, 0xff, 0x20, 0x07, 0x00, 0xff, 0x20, 0x07, 0x00, 0xff,
+ 0x38, 0x07, 0x00, 0xff, 0x5c, 0x29, 0x00, 0xff, 0x56, 0x33, 0x00, 0xff,
+ 0x87, 0x33, 0x00, 0xff, 0x76, 0x54, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff,
+ 0x82, 0x1b, 0x00, 0xff, 0x94, 0x00, 0x00, 0xff, 0x82, 0x1b, 0x00, 0xff,
+ 0xaf, 0x4b, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff,
+ 0xe8, 0x50, 0x00, 0xff, 0xe8, 0x71, 0x00, 0xff, 0x75, 0x84, 0x00, 0xff,
+ 0x51, 0x61, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff,
+ 0x29, 0x32, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff,
+ 0x13, 0x1c, 0x00, 0xff, 0x29, 0x4a, 0x00, 0xff, 0x0e, 0x2f, 0x00, 0xff,
+ 0x00, 0x17, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x06, 0x15, 0x00, 0xff,
+ 0x00, 0x0b, 0x00, 0xff, 0x12, 0x0b, 0x00, 0xff, 0x12, 0x0b, 0x00, 0xff,
+ 0x20, 0x07, 0x00, 0xff, 0x2c, 0x13, 0x00, 0xff, 0x38, 0x07, 0x00, 0xff,
+ 0x50, 0x1d, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff,
+ 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, 0xaf, 0x4b, 0x00, 0xff,
+ 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff,
+ 0xd2, 0x5b, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff, 0xe8, 0x50, 0x00, 0xff,
+ 0xe8, 0x71, 0x00, 0xff, 0x86, 0x96, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff,
+ 0x2d, 0x3d, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff,
+ 0x13, 0x1c, 0x00, 0xff, 0x07, 0x10, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff,
+ 0x00, 0x17, 0x00, 0xff, 0x29, 0x4a, 0x00, 0xff, 0x00, 0x17, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x06, 0x15, 0x00, 0xff,
+ 0x2a, 0x21, 0x00, 0xff, 0x1e, 0x15, 0x00, 0xff, 0x44, 0x29, 0x00, 0xff,
+ 0x38, 0x1d, 0x00, 0xff, 0x5c, 0x29, 0x00, 0xff, 0x50, 0x1d, 0x00, 0xff,
+ 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff,
+ 0x87, 0x33, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff,
+ 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff,
+ 0xd2, 0x3a, 0x00, 0xff, 0xe8, 0x50, 0x00, 0xff, 0xe8, 0x71, 0x00, 0xff,
+ 0x7c, 0x9a, 0x00, 0xff, 0x6d, 0x88, 0x00, 0xff, 0x54, 0x5f, 0x00, 0xff,
+ 0x18, 0x2f, 0x00, 0xff, 0x21, 0x21, 0x00, 0xff, 0x0f, 0x0f, 0x00, 0xff,
+ 0x0f, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x05, 0x05, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff,
+ 0x0f, 0x18, 0x00, 0xff, 0x0f, 0x18, 0x00, 0xff, 0x33, 0x24, 0x00, 0xff,
+ 0x3f, 0x2e, 0x00, 0xff, 0x45, 0x14, 0x00, 0xff, 0x6d, 0x3c, 0x00, 0xff,
+ 0x6d, 0x20, 0x00, 0xff, 0x8c, 0x42, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff,
+ 0x99, 0x33, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff, 0xbb, 0x11, 0x00, 0xff,
+ 0xc5, 0x06, 0x00, 0xff, 0xcb, 0x0c, 0x00, 0xff, 0xd5, 0x0f, 0x00, 0xff,
+ 0xe1, 0x14, 0x00, 0xff, 0xe7, 0x25, 0x00, 0xff, 0xe7, 0x41, 0x00, 0xff,
+ 0xe7, 0x59, 0x00, 0xff, 0xe7, 0x71, 0x00, 0xff, 0x7c, 0x9a, 0x00, 0xff,
+ 0x6d, 0x9a, 0x00, 0xff, 0x6d, 0x7d, 0x00, 0xff, 0x18, 0x2f, 0x00, 0xff,
+ 0x0f, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, 0x27, 0x2e, 0x00, 0xff,
+ 0x27, 0x2e, 0x00, 0xff, 0x27, 0x18, 0x00, 0xff, 0x4b, 0x3a, 0x00, 0xff,
+ 0x59, 0x26, 0x00, 0xff, 0x45, 0x14, 0x00, 0xff, 0x8c, 0x42, 0x00, 0xff,
+ 0x80, 0x36, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff, 0xa3, 0x3f, 0x00, 0xff,
+ 0x8d, 0x29, 0x00, 0xff, 0xbb, 0x11, 0x00, 0xff, 0xc5, 0x06, 0x00, 0xff,
+ 0xcf, 0x09, 0x00, 0xff, 0xdb, 0x0f, 0x00, 0xff, 0xe5, 0x12, 0x00, 0xff,
+ 0xe9, 0x25, 0x00, 0xff, 0xe9, 0x3d, 0x00, 0xff, 0xe9, 0x59, 0x00, 0xff,
+ 0xe9, 0x71, 0x00, 0xff, 0x8a, 0xac, 0x00, 0xff, 0x6d, 0x88, 0x00, 0xff,
+ 0x6d, 0x7d, 0x00, 0xff, 0x36, 0x41, 0x00, 0xff, 0x0f, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x05, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x09, 0x11, 0x00, 0xff, 0x27, 0x2e, 0x00, 0xff, 0x33, 0x3a, 0x00, 0xff,
+ 0x3f, 0x2e, 0x00, 0xff, 0x4b, 0x3a, 0x00, 0xff, 0x6d, 0x3c, 0x00, 0xff,
+ 0x6d, 0x3c, 0x00, 0xff, 0x75, 0x2c, 0x00, 0xff, 0x8c, 0x42, 0x00, 0xff,
+ 0x99, 0x33, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff, 0xa3, 0x3f, 0x00, 0xff,
+ 0xbb, 0x11, 0x00, 0xff, 0xcb, 0x03, 0x00, 0xff, 0xd5, 0x09, 0x00, 0xff,
+ 0xe1, 0x0c, 0x00, 0xff, 0xeb, 0x12, 0x00, 0xff, 0xeb, 0x25, 0x00, 0xff,
+ 0xeb, 0x3d, 0x00, 0xff, 0xeb, 0x59, 0x00, 0xff, 0xeb, 0x71, 0x00, 0xff,
+ 0x8a, 0xac, 0x00, 0xff, 0x6d, 0x9a, 0x00, 0xff, 0x6d, 0x7d, 0x00, 0xff,
+ 0x6d, 0x7d, 0x00, 0xff, 0x36, 0x36, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x11, 0x11, 0x00, 0xff,
+ 0x05, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff,
+ 0x27, 0x2e, 0x00, 0xff, 0x33, 0x3a, 0x00, 0xff, 0x4b, 0x3a, 0x00, 0xff,
+ 0x4b, 0x3a, 0x00, 0xff, 0x6d, 0x3c, 0x00, 0xff, 0x80, 0x4e, 0x00, 0xff,
+ 0x8c, 0x42, 0x00, 0xff, 0x80, 0x36, 0x00, 0xff, 0xa3, 0x3f, 0x00, 0xff,
+ 0xa3, 0x3f, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff, 0xbb, 0x11, 0x00, 0xff,
+ 0xcf, 0x03, 0x00, 0xff, 0xdb, 0x06, 0x00, 0xff, 0xe1, 0x0c, 0x00, 0xff,
+ 0xeb, 0x0f, 0x00, 0xff, 0xed, 0x25, 0x00, 0xff, 0xed, 0x3d, 0x00, 0xff,
+ 0xed, 0x55, 0x00, 0xff, 0xed, 0x71, 0x00, 0xff, 0x7d, 0x94, 0x00, 0xff,
+ 0x7d, 0x94, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff,
+ 0x5d, 0x6f, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x08, 0x00, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff,
+ 0x13, 0x13, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x3e, 0x1d, 0x00, 0xff,
+ 0x56, 0x33, 0x00, 0xff, 0x6c, 0x4b, 0x00, 0xff, 0x6c, 0x4b, 0x00, 0xff,
+ 0x6a, 0x40, 0x00, 0xff, 0x81, 0x58, 0x00, 0xff, 0x8d, 0x64, 0x00, 0xff,
+ 0x81, 0x58, 0x00, 0xff, 0x9f, 0x18, 0x00, 0xff, 0xb4, 0x2d, 0x00, 0xff,
+ 0xb4, 0x2d, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, 0xd6, 0x00, 0x00, 0xff,
+ 0xe0, 0x00, 0x00, 0xff, 0xe9, 0x0a, 0x00, 0xff, 0xef, 0x10, 0x00, 0xff,
+ 0xe8, 0x1d, 0x00, 0xff, 0xea, 0x3e, 0x00, 0xff, 0xec, 0x5f, 0x00, 0xff,
+ 0xf0, 0x80, 0x00, 0xff, 0x7d, 0x94, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff,
+ 0x5d, 0x77, 0x00, 0xff, 0x49, 0x65, 0x00, 0xff, 0x3f, 0x56, 0x00, 0xff,
+ 0x26, 0x38, 0x00, 0xff, 0x1c, 0x0b, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff,
+ 0x13, 0x13, 0x00, 0xff, 0x3e, 0x1d, 0x00, 0xff, 0x56, 0x33, 0x00, 0xff,
+ 0x56, 0x33, 0x00, 0xff, 0x6c, 0x4b, 0x00, 0xff, 0x76, 0x4c, 0x00, 0xff,
+ 0x6a, 0x40, 0x00, 0xff, 0x81, 0x58, 0x00, 0xff, 0x8d, 0x64, 0x00, 0xff,
+ 0xb4, 0x2d, 0x00, 0xff, 0x9f, 0x18, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff,
+ 0xd2, 0x06, 0x00, 0xff, 0xd6, 0x00, 0x00, 0xff, 0xec, 0x05, 0x00, 0xff,
+ 0xe9, 0x0a, 0x00, 0xff, 0xef, 0x10, 0x00, 0xff, 0xe8, 0x1d, 0x00, 0xff,
+ 0xea, 0x3e, 0x00, 0xff, 0xee, 0x5f, 0x00, 0xff, 0xf0, 0x80, 0x00, 0xff,
+ 0x71, 0x65, 0x00, 0xff, 0x5d, 0x53, 0x00, 0xff, 0x49, 0x41, 0x00, 0xff,
+ 0x35, 0x2f, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff,
+ 0x3f, 0x29, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff,
+ 0x33, 0x33, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff,
+ 0x56, 0x33, 0x00, 0xff, 0x56, 0x33, 0x00, 0xff, 0x78, 0x33, 0x00, 0xff,
+ 0x78, 0x33, 0x00, 0xff, 0x8d, 0x34, 0x00, 0xff, 0x8d, 0x34, 0x00, 0xff,
+ 0x8d, 0x34, 0x00, 0xff, 0xa5, 0x4c, 0x00, 0xff, 0xb4, 0x2d, 0x00, 0xff,
+ 0xb4, 0x2d, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff,
+ 0xe0, 0x00, 0x00, 0xff, 0xec, 0x05, 0x00, 0xff, 0xe5, 0x07, 0x00, 0xff,
+ 0xef, 0x10, 0x00, 0xff, 0xe8, 0x1d, 0x00, 0xff, 0xec, 0x3e, 0x00, 0xff,
+ 0xee, 0x5f, 0x00, 0xff, 0xf2, 0x80, 0x00, 0xff, 0x71, 0x65, 0x00, 0xff,
+ 0x5d, 0x53, 0x00, 0xff, 0x49, 0x41, 0x00, 0xff, 0x35, 0x2f, 0x00, 0xff,
+ 0x08, 0x1a, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff, 0x3f, 0x29, 0x00, 0xff,
+ 0x1c, 0x0b, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff,
+ 0x33, 0x33, 0x00, 0xff, 0x53, 0x53, 0x00, 0xff, 0x56, 0x33, 0x00, 0xff,
+ 0x6c, 0x4b, 0x00, 0xff, 0x78, 0x33, 0x00, 0xff, 0x78, 0x33, 0x00, 0xff,
+ 0x81, 0x28, 0x00, 0xff, 0x99, 0x40, 0x00, 0xff, 0x99, 0x40, 0x00, 0xff,
+ 0x8d, 0x34, 0x00, 0xff, 0xb4, 0x2d, 0x00, 0xff, 0xb4, 0x2d, 0x00, 0xff,
+ 0xd2, 0x06, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, 0xe0, 0x00, 0x00, 0xff,
+ 0xec, 0x05, 0x00, 0xff, 0xe5, 0x07, 0x00, 0xff, 0xe9, 0x0a, 0x00, 0xff,
+ 0xea, 0x1d, 0x00, 0xff, 0xec, 0x3e, 0x00, 0xff, 0xf0, 0x5f, 0x00, 0xff,
+ 0xf2, 0x80, 0x00, 0xff, 0x7c, 0x75, 0x00, 0xff, 0x58, 0x4b, 0x00, 0xff,
+ 0x61, 0x4b, 0x00, 0xff, 0x4f, 0x36, 0x00, 0xff, 0x45, 0x32, 0x00, 0xff,
+ 0x33, 0x23, 0x00, 0xff, 0x45, 0x32, 0x00, 0xff, 0x45, 0x32, 0x00, 0xff,
+ 0x56, 0x22, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, 0x56, 0x22, 0x00, 0xff,
+ 0x76, 0x43, 0x00, 0xff, 0x8d, 0x4b, 0x00, 0xff, 0x66, 0x27, 0x00, 0xff,
+ 0x8d, 0x4b, 0x00, 0xff, 0x7a, 0x39, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff,
+ 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff,
+ 0xc2, 0x00, 0x00, 0xff, 0xe8, 0x11, 0x00, 0xff, 0xde, 0x00, 0x00, 0xff,
+ 0xe8, 0x02, 0x00, 0xff, 0xea, 0x00, 0x00, 0xff, 0xec, 0x05, 0x00, 0xff,
+ 0xec, 0x0a, 0x00, 0xff, 0xee, 0x10, 0x00, 0xff, 0xeb, 0x1c, 0x00, 0xff,
+ 0xec, 0x3a, 0x00, 0xff, 0xed, 0x5d, 0x00, 0xff, 0xee, 0x7b, 0x00, 0xff,
+ 0x90, 0x89, 0x00, 0xff, 0x58, 0x4b, 0x00, 0xff, 0x4f, 0x36, 0x00, 0xff,
+ 0x4f, 0x36, 0x00, 0xff, 0x45, 0x32, 0x00, 0xff, 0x33, 0x23, 0x00, 0xff,
+ 0x33, 0x23, 0x00, 0xff, 0x54, 0x44, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff,
+ 0x87, 0x10, 0x00, 0xff, 0x87, 0x10, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff,
+ 0x8d, 0x4b, 0x00, 0xff, 0x8d, 0x4b, 0x00, 0xff, 0x7a, 0x39, 0x00, 0xff,
+ 0x8d, 0x4b, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff,
+ 0xb5, 0x0b, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, 0xc2, 0x00, 0x00, 0xff,
+ 0xd4, 0x00, 0x00, 0xff, 0xe4, 0x00, 0x00, 0xff, 0xe4, 0x00, 0x00, 0xff,
+ 0xe8, 0x01, 0x00, 0xff, 0xea, 0x07, 0x00, 0xff, 0xea, 0x0c, 0x00, 0xff,
+ 0xec, 0x10, 0x00, 0xff, 0xeb, 0x1c, 0x00, 0xff, 0xec, 0x3a, 0x00, 0xff,
+ 0xed, 0x5d, 0x00, 0xff, 0xee, 0x7b, 0x00, 0xff, 0x90, 0x89, 0x00, 0xff,
+ 0x6d, 0x60, 0x00, 0xff, 0x4f, 0x36, 0x00, 0xff, 0x61, 0x4b, 0x00, 0xff,
+ 0x54, 0x44, 0x00, 0xff, 0x54, 0x44, 0x00, 0xff, 0x66, 0x11, 0x00, 0xff,
+ 0x54, 0x44, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff,
+ 0x87, 0x10, 0x00, 0xff, 0x87, 0x10, 0x00, 0xff, 0xad, 0x30, 0x00, 0xff,
+ 0xad, 0x30, 0x00, 0xff, 0x95, 0x1e, 0x00, 0xff, 0xa1, 0x27, 0x00, 0xff,
+ 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff,
+ 0xb5, 0x0b, 0x00, 0xff, 0xd4, 0x00, 0x00, 0xff, 0xd4, 0x00, 0x00, 0xff,
+ 0xe4, 0x00, 0x00, 0xff, 0xe4, 0x00, 0x00, 0xff, 0xe6, 0x01, 0x00, 0xff,
+ 0xe8, 0x07, 0x00, 0xff, 0xe8, 0x0c, 0x00, 0xff, 0xea, 0x10, 0x00, 0xff,
+ 0xeb, 0x1c, 0x00, 0xff, 0xec, 0x3a, 0x00, 0xff, 0xed, 0x5d, 0x00, 0xff,
+ 0xee, 0x7b, 0x00, 0xff, 0x90, 0x89, 0x00, 0xff, 0x7c, 0x75, 0x00, 0xff,
+ 0x61, 0x4b, 0x00, 0xff, 0x61, 0x4b, 0x00, 0xff, 0x54, 0x44, 0x00, 0xff,
+ 0x54, 0x44, 0x00, 0xff, 0x66, 0x11, 0x00, 0xff, 0x66, 0x11, 0x00, 0xff,
+ 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, 0x87, 0x10, 0x00, 0xff,
+ 0x87, 0x10, 0x00, 0xff, 0x8d, 0x0f, 0x00, 0xff, 0xa1, 0x27, 0x00, 0xff,
+ 0xa1, 0x27, 0x00, 0xff, 0x8d, 0x0f, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff,
+ 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff,
+ 0xd4, 0x00, 0x00, 0xff, 0xd4, 0x00, 0x00, 0xff, 0xde, 0x00, 0x00, 0xff,
+ 0xde, 0x00, 0x00, 0xff, 0xe4, 0x01, 0x00, 0xff, 0xe6, 0x07, 0x00, 0xff,
+ 0xe6, 0x0c, 0x00, 0xff, 0xe8, 0x12, 0x00, 0xff, 0xeb, 0x1c, 0x00, 0xff,
+ 0xec, 0x3a, 0x00, 0xff, 0xed, 0x58, 0x00, 0xff, 0xee, 0x7b, 0x00, 0xff,
+ 0x9d, 0x83, 0x00, 0xff, 0x9d, 0x83, 0x00, 0xff, 0x8e, 0x57, 0x00, 0xff,
+ 0x74, 0x39, 0x00, 0xff, 0x74, 0x3f, 0x00, 0xff, 0x74, 0x33, 0x00, 0xff,
+ 0x7d, 0x27, 0x00, 0xff, 0x7d, 0x1d, 0x00, 0xff, 0x82, 0x1c, 0x00, 0xff,
+ 0x8e, 0x28, 0x00, 0xff, 0x8e, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff,
+ 0xb2, 0x0e, 0x00, 0xff, 0xac, 0x08, 0x00, 0xff, 0xbc, 0x18, 0x00, 0xff,
+ 0xb8, 0x12, 0x00, 0xff, 0xbf, 0x00, 0x00, 0xff, 0xc9, 0x03, 0x00, 0xff,
+ 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xda, 0x00, 0x00, 0xff,
+ 0xdc, 0x01, 0x00, 0xff, 0xde, 0x03, 0x00, 0xff, 0xe0, 0x03, 0x00, 0xff,
+ 0xe3, 0x02, 0x00, 0xff, 0xe5, 0x08, 0x00, 0xff, 0xe7, 0x0e, 0x00, 0xff,
+ 0xe9, 0x16, 0x00, 0xff, 0xeb, 0x2b, 0x00, 0xff, 0xed, 0x49, 0x00, 0xff,
+ 0xef, 0x6d, 0x00, 0xff, 0xef, 0x8a, 0x00, 0xff, 0x9d, 0x83, 0x00, 0xff,
+ 0xa3, 0x8d, 0x00, 0xff, 0xa9, 0x70, 0x00, 0xff, 0x8e, 0x57, 0x00, 0xff,
+ 0x85, 0x3f, 0x00, 0xff, 0x85, 0x33, 0x00, 0xff, 0x8b, 0x27, 0x00, 0xff,
+ 0x8b, 0x1d, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff,
+ 0xb0, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xac, 0x08, 0x00, 0xff,
+ 0xbc, 0x18, 0x00, 0xff, 0xbc, 0x18, 0x00, 0xff, 0xb2, 0x0e, 0x00, 0xff,
+ 0xc9, 0x03, 0x00, 0xff, 0xc9, 0x03, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff,
+ 0xdb, 0x07, 0x00, 0xff, 0xdc, 0x06, 0x00, 0xff, 0xde, 0x06, 0x00, 0xff,
+ 0xe0, 0x06, 0x00, 0xff, 0xe2, 0x09, 0x00, 0xff, 0xe1, 0x02, 0x00, 0xff,
+ 0xe3, 0x0b, 0x00, 0xff, 0xe5, 0x13, 0x00, 0xff, 0xe7, 0x19, 0x00, 0xff,
+ 0xe9, 0x2b, 0x00, 0xff, 0xeb, 0x49, 0x00, 0xff, 0xed, 0x6d, 0x00, 0xff,
+ 0xef, 0x8a, 0x00, 0xff, 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x7a, 0x00, 0xff,
+ 0xa9, 0x70, 0x00, 0xff, 0x8e, 0x57, 0x00, 0xff, 0x9a, 0x43, 0x00, 0xff,
+ 0x9a, 0x39, 0x00, 0xff, 0xa0, 0x2d, 0x00, 0xff, 0xa0, 0x21, 0x00, 0xff,
+ 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff,
+ 0xb0, 0x28, 0x00, 0xff, 0xca, 0x0e, 0x00, 0xff, 0xca, 0x0e, 0x00, 0xff,
+ 0xca, 0x0e, 0x00, 0xff, 0xd0, 0x12, 0x00, 0xff, 0xd5, 0x0d, 0x00, 0xff,
+ 0xd5, 0x0d, 0x00, 0xff, 0xe5, 0x11, 0x00, 0xff, 0xdb, 0x07, 0x00, 0xff,
+ 0xdc, 0x09, 0x00, 0xff, 0xde, 0x09, 0x00, 0xff, 0xe0, 0x0c, 0x00, 0xff,
+ 0xe2, 0x0c, 0x00, 0xff, 0xe1, 0x08, 0x00, 0xff, 0xe3, 0x0e, 0x00, 0xff,
+ 0xe5, 0x16, 0x00, 0xff, 0xe7, 0x1f, 0x00, 0xff, 0xe7, 0x3d, 0x00, 0xff,
+ 0xe9, 0x5b, 0x00, 0xff, 0xeb, 0x7f, 0x00, 0xff, 0xed, 0x9c, 0x00, 0xff,
+ 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x7a, 0x00, 0xff, 0xa9, 0x70, 0x00, 0xff,
+ 0x8e, 0x57, 0x00, 0xff, 0xa9, 0x43, 0x00, 0xff, 0xa9, 0x39, 0x00, 0xff,
+ 0xb2, 0x2d, 0x00, 0xff, 0xb2, 0x21, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff,
+ 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff,
+ 0xd6, 0x18, 0x00, 0xff, 0xd0, 0x12, 0x00, 0xff, 0xd6, 0x18, 0x00, 0xff,
+ 0xd6, 0x18, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff,
+ 0xe5, 0x11, 0x00, 0xff, 0xe5, 0x11, 0x00, 0xff, 0xde, 0x0e, 0x00, 0xff,
+ 0xe0, 0x0e, 0x00, 0xff, 0xe2, 0x11, 0x00, 0xff, 0xe4, 0x11, 0x00, 0xff,
+ 0xdf, 0x0b, 0x00, 0xff, 0xe1, 0x13, 0x00, 0xff, 0xe3, 0x19, 0x00, 0xff,
+ 0xe5, 0x1f, 0x00, 0xff, 0xe5, 0x49, 0x00, 0xff, 0xe7, 0x6d, 0x00, 0xff,
+ 0xe9, 0x8a, 0x00, 0xff, 0xeb, 0x9c, 0x00, 0xff, 0xd3, 0x8c, 0x00, 0xff,
+ 0xc4, 0x7b, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff,
+ 0xcd, 0x49, 0x00, 0xff, 0xcd, 0x49, 0x00, 0xff, 0xb8, 0x35, 0x00, 0xff,
+ 0xb8, 0x35, 0x00, 0xff, 0xcb, 0x2a, 0x00, 0xff, 0xcb, 0x2a, 0x00, 0xff,
+ 0xcb, 0x2a, 0x00, 0xff, 0xcb, 0x2a, 0x00, 0xff, 0xd8, 0x1f, 0x00, 0xff,
+ 0xd8, 0x1f, 0x00, 0xff, 0xdd, 0x1f, 0x00, 0xff, 0xe0, 0x1f, 0x00, 0xff,
+ 0xe7, 0x27, 0x00, 0xff, 0xe7, 0x1b, 0x00, 0xff, 0xe7, 0x1b, 0x00, 0xff,
+ 0xe7, 0x1b, 0x00, 0xff, 0xe3, 0x1d, 0x00, 0xff, 0xe3, 0x1d, 0x00, 0xff,
+ 0xe3, 0x1d, 0x00, 0xff, 0xe3, 0x1d, 0x00, 0xff, 0xde, 0x1b, 0x00, 0xff,
+ 0xe0, 0x2a, 0x00, 0xff, 0xe0, 0x2a, 0x00, 0xff, 0xe3, 0x34, 0x00, 0xff,
+ 0xe4, 0x51, 0x00, 0xff, 0xe4, 0x69, 0x00, 0xff, 0xe4, 0x80, 0x00, 0xff,
+ 0xe6, 0x94, 0x00, 0xff, 0xe8, 0x9e, 0x00, 0xff, 0xd3, 0x8c, 0x00, 0xff,
+ 0xcd, 0x69, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, 0xcd, 0x49, 0x00, 0xff,
+ 0xcd, 0x49, 0x00, 0xff, 0xcd, 0x49, 0x00, 0xff, 0xcd, 0x49, 0x00, 0xff,
+ 0xd8, 0x46, 0x00, 0xff, 0xd8, 0x46, 0x00, 0xff, 0xd8, 0x42, 0x00, 0xff,
+ 0xd8, 0x42, 0x00, 0xff, 0xdd, 0x3b, 0x00, 0xff, 0xe0, 0x3b, 0x00, 0xff,
+ 0xe3, 0x3b, 0x00, 0xff, 0xe6, 0x3b, 0x00, 0xff, 0xe9, 0x3b, 0x00, 0xff,
+ 0xe9, 0x3b, 0x00, 0xff, 0xe9, 0x3b, 0x00, 0xff, 0xe9, 0x33, 0x00, 0xff,
+ 0xe7, 0x37, 0x00, 0xff, 0xe7, 0x37, 0x00, 0xff, 0xe7, 0x37, 0x00, 0xff,
+ 0xe7, 0x37, 0x00, 0xff, 0xe3, 0x34, 0x00, 0xff, 0xe3, 0x43, 0x00, 0xff,
+ 0xe6, 0x43, 0x00, 0xff, 0xe6, 0x52, 0x00, 0xff, 0xe6, 0x69, 0x00, 0xff,
+ 0xe6, 0x75, 0x00, 0xff, 0xe8, 0x94, 0x00, 0xff, 0xe8, 0xa0, 0x00, 0xff,
+ 0xfa, 0xb0, 0x00, 0xff, 0xe8, 0x9e, 0x00, 0xff, 0xe2, 0x7b, 0x00, 0xff,
+ 0xcd, 0x69, 0x00, 0xff, 0xe2, 0x65, 0x00, 0xff, 0xe2, 0x65, 0x00, 0xff,
+ 0xe2, 0x65, 0x00, 0xff, 0xe2, 0x65, 0x00, 0xff, 0xe5, 0x5e, 0x00, 0xff,
+ 0xe5, 0x5e, 0x00, 0xff, 0xe5, 0x5a, 0x00, 0xff, 0xe5, 0x5a, 0x00, 0xff,
+ 0xe3, 0x57, 0x00, 0xff, 0xe6, 0x57, 0x00, 0xff, 0xe9, 0x57, 0x00, 0xff,
+ 0xec, 0x57, 0x00, 0xff, 0xeb, 0x57, 0x00, 0xff, 0xeb, 0x57, 0x00, 0xff,
+ 0xeb, 0x57, 0x00, 0xff, 0xeb, 0x4f, 0x00, 0xff, 0xeb, 0x51, 0x00, 0xff,
+ 0xeb, 0x51, 0x00, 0xff, 0xeb, 0x51, 0x00, 0xff, 0xeb, 0x51, 0x00, 0xff,
+ 0xe6, 0x52, 0x00, 0xff, 0xe9, 0x52, 0x00, 0xff, 0xe9, 0x61, 0x00, 0xff,
+ 0xe9, 0x6b, 0x00, 0xff, 0xe8, 0x75, 0x00, 0xff, 0xea, 0x80, 0x00, 0xff,
+ 0xea, 0xa0, 0x00, 0xff, 0xec, 0xac, 0x00, 0xff, 0xfa, 0xb0, 0x00, 0xff,
+ 0xfa, 0xb0, 0x00, 0xff, 0xf1, 0x8c, 0x00, 0xff, 0xf1, 0x8c, 0x00, 0xff,
+ 0xf7, 0x7d, 0x00, 0xff, 0xf7, 0x7d, 0x00, 0xff, 0xf7, 0x7d, 0x00, 0xff,
+ 0xf7, 0x7d, 0x00, 0xff, 0xf2, 0x76, 0x00, 0xff, 0xf2, 0x76, 0x00, 0xff,
+ 0xf2, 0x76, 0x00, 0xff, 0xf2, 0x76, 0x00, 0xff, 0xe9, 0x73, 0x00, 0xff,
+ 0xec, 0x73, 0x00, 0xff, 0xf1, 0x73, 0x00, 0xff, 0xf1, 0x73, 0x00, 0xff,
+ 0xed, 0x6f, 0x00, 0xff, 0xed, 0x6f, 0x00, 0xff, 0xed, 0x6f, 0x00, 0xff,
+ 0xed, 0x6f, 0x00, 0xff, 0xef, 0x6b, 0x00, 0xff, 0xef, 0x6b, 0x00, 0xff,
+ 0xef, 0x6b, 0x00, 0xff, 0xef, 0x6b, 0x00, 0xff, 0xeb, 0x6b, 0x00, 0xff,
+ 0xeb, 0x6b, 0x00, 0xff, 0xee, 0x7a, 0x00, 0xff, 0xee, 0x7a, 0x00, 0xff,
+ 0xec, 0x80, 0x00, 0xff, 0xec, 0x94, 0x00, 0xff, 0xee, 0xac, 0x00, 0xff,
+ 0xee, 0xc4, 0x00, 0xff,
+ ]),
+};
+
+var img_32x32_rgb_etc2 = {
+ compressed: new Uint8Array([
+ 0x8d, 0x9d, 0xb6, 0x4a, 0xc4, 0x80, 0x83, 0x97, 0x64, 0x74, 0x95, 0x4b,
+ 0xae, 0xa2, 0x91, 0x05, 0x74, 0x85, 0xa7, 0x25, 0xfa, 0xa6, 0xff, 0x42,
+ 0x64, 0x74, 0x85, 0x49, 0xae, 0xea, 0x89, 0xba, 0x64, 0x74, 0x7c, 0x4b,
+ 0xa8, 0x8a, 0xa4, 0x81, 0x73, 0x73, 0x85, 0x29, 0xab, 0xa3, 0x3e, 0x2a,
+ 0x75, 0x74, 0x86, 0x25, 0xaa, 0x6e, 0x71, 0x11, 0xbe, 0x7f, 0x04, 0x62,
+ 0xbb, 0x6c, 0x86, 0xcf,
+
+ 0x74, 0x74, 0x97, 0x48, 0xec, 0xf0, 0x50, 0xe6, 0x21, 0x30, 0x5f, 0x4a,
+ 0xbd, 0xe8, 0x8e, 0x5b, 0x10, 0x27, 0x3a, 0x46, 0x8c, 0xe2, 0x87, 0x10,
+ 0x1e, 0x18, 0x48, 0x07, 0x6b, 0x31, 0xe9, 0xa9, 0x05, 0x13, 0x23, 0x57,
+ 0x66, 0xd6, 0x34, 0xc4, 0x43, 0x4e, 0x5c, 0x2b, 0xbd, 0xee, 0x59, 0xb4,
+ 0x57, 0x44, 0x55, 0x45, 0x44, 0x2b, 0xa9, 0x01, 0x9a, 0x48, 0x41, 0x2e,
+ 0x00, 0x31, 0xf0, 0xc5,
+
+ 0x6c, 0x7c, 0x9e, 0x4a, 0xfb, 0xf2, 0xd8, 0x58, 0x18, 0x20, 0x4a, 0x27,
+ 0x6b, 0x90, 0x0e, 0x35, 0x00, 0x0b, 0x29, 0x2f, 0xcc, 0x29, 0xf0, 0x87,
+ 0x03, 0x10, 0x2f, 0x26, 0x76, 0x48, 0x29, 0x19, 0x33, 0x18, 0x40, 0x26,
+ 0x06, 0x76, 0x2e, 0x3e, 0xb9, 0x06, 0x32, 0x2b, 0x02, 0x13, 0x10, 0x03,
+ 0x49, 0x15, 0xd0, 0x06, 0xcc, 0xe9, 0x02, 0x33, 0x6a, 0x06, 0x6b, 0x33,
+ 0xf1, 0x05, 0x01, 0xff,
+
+ 0x74, 0x95, 0xa6, 0x2c, 0x70, 0xf0, 0xbe, 0x5c, 0x1d, 0x1d, 0x32, 0x4e,
+ 0xfe, 0xf6, 0x4c, 0xe8, 0x00, 0x01, 0x37, 0x2a, 0x0c, 0x63, 0x0c, 0x6b,
+ 0x23, 0x28, 0x43, 0x26, 0x03, 0x11, 0xea, 0xd1, 0x63, 0x30, 0x66, 0x46,
+ 0x05, 0x23, 0x5b, 0xa1, 0xf3, 0x12, 0x93, 0x46, 0x0b, 0x57, 0x06, 0xa8,
+ 0x60, 0x86, 0x04, 0xf6, 0x18, 0x46, 0x80, 0x00, 0x72, 0xa6, 0x0d, 0x73,
+ 0x8b, 0x2f, 0x64, 0x48,
+
+ 0x50, 0x6c, 0x85, 0x6b, 0xec, 0x00, 0xc0, 0x1f, 0x31, 0x40, 0x63, 0x6c,
+ 0x71, 0xfc, 0x2d, 0x09, 0x07, 0x01, 0x33, 0x6b, 0x6f, 0x73, 0xa1, 0x33,
+ 0xeb, 0x35, 0x53, 0x5a, 0x02, 0x7f, 0x31, 0x83, 0x7b, 0x55, 0x67, 0x27,
+ 0x84, 0x6f, 0x61, 0x29, 0x51, 0x05, 0x68, 0x8b, 0xfe, 0x00, 0xfe, 0x21,
+ 0xe0, 0x01, 0x09, 0x22, 0x0c, 0x1f, 0x70, 0x03, 0x72, 0x9e, 0x0c, 0x7a,
+ 0xa1, 0x2f, 0x43, 0x87,
+
+ 0x77, 0x6d, 0x8f, 0x4a, 0xff, 0x70, 0x36, 0x3e, 0x0e, 0x15, 0x43, 0x67,
+ 0x13, 0x33, 0x62, 0xfc, 0xb8, 0x04, 0xb1, 0xb3, 0x31, 0xcf, 0x01, 0x11,
+ 0x83, 0x44, 0x64, 0x47, 0x96, 0x18, 0x80, 0x5c, 0x58, 0x14, 0xc9, 0x1a,
+ 0x01, 0x77, 0x72, 0x08, 0xd9, 0x0f, 0x08, 0x42, 0xef, 0xef, 0x89, 0x03,
+ 0x74, 0x80, 0x04, 0xf7, 0x14, 0x3f, 0x00, 0x42, 0x74, 0x9c, 0x07, 0xf7,
+ 0x9b, 0x2f, 0x43, 0x47,
+
+ 0x98, 0x84, 0xa5, 0x0e, 0xf1, 0xd2, 0x10, 0xec, 0xb8, 0xbc, 0xfa, 0xc2,
+ 0x10, 0x85, 0xc8, 0xd2, 0x51, 0x05, 0x41, 0x2a, 0x01, 0x11, 0x30, 0x6f,
+ 0xb3, 0x10, 0x10, 0x03, 0x24, 0x57, 0x8b, 0x3a, 0xca, 0x08, 0x10, 0x22,
+ 0x73, 0x33, 0x9f, 0x89, 0x6c, 0x80, 0x05, 0x72, 0x04, 0x0e, 0xe2, 0x46,
+ 0x70, 0x80, 0x04, 0x76, 0x1c, 0x56, 0xe2, 0x03, 0x74, 0xa6, 0x0c, 0xfa,
+ 0xa5, 0x37, 0x0a, 0x50,
+
+ 0xdf, 0x94, 0x8d, 0x4a, 0x73, 0x31, 0xb9, 0x9c, 0xd2, 0x53, 0x53, 0x47,
+ 0x77, 0x77, 0x99, 0x88, 0x64, 0xae, 0x0d, 0xe6, 0x26, 0x5f, 0xf1, 0xe4,
+ 0x6a, 0xa0, 0x0c, 0xf2, 0x1e, 0x47, 0x71, 0xe3, 0x72, 0xa2, 0x0c, 0xf3,
+ 0x18, 0x4f, 0x71, 0xa0, 0x70, 0x9c, 0x0c, 0x72, 0x1c, 0x47, 0x90, 0xa2,
+ 0x6e, 0x9a, 0x0c, 0x72, 0x3c, 0x6f, 0x70, 0x61, 0x70, 0x54, 0x15, 0x73,
+ 0xa7, 0x3f, 0x72, 0x22,
+ ]),
+ decompressed: new Uint8Array([
+ 0xa9, 0xb9, 0xd2, 0xff, 0xa9, 0xb9, 0xd2, 0xff, 0x90, 0xa1, 0xc2, 0xff,
+ 0x7c, 0x8d, 0xae, 0xff, 0x80, 0x90, 0xb1, 0xff, 0x6c, 0x7c, 0x9d, 0xff,
+ 0x80, 0x90, 0xb1, 0xff, 0x80, 0x90, 0xb1, 0xff, 0x7c, 0x8d, 0xaf, 0xff,
+ 0x7c, 0x8d, 0xaf, 0xff, 0x88, 0x99, 0xbb, 0xff, 0x66, 0x77, 0x99, 0xff,
+ 0x6f, 0x80, 0x91, 0xff, 0x83, 0x94, 0xa5, 0xff, 0x83, 0x94, 0xa5, 0xff,
+ 0x6f, 0x80, 0x91, 0xff, 0x80, 0x90, 0x98, 0xff, 0x6c, 0x7c, 0x84, 0xff,
+ 0x6c, 0x7c, 0x84, 0xff, 0x6c, 0x7c, 0x84, 0xff, 0x72, 0x72, 0x83, 0xff,
+ 0x7c, 0x7c, 0x8d, 0xff, 0x72, 0x72, 0x83, 0xff, 0x88, 0x88, 0x99, 0xff,
+ 0x88, 0x88, 0x99, 0xff, 0x88, 0x88, 0x99, 0xff, 0x88, 0x88, 0x99, 0xff,
+ 0x88, 0x88, 0x99, 0xff, 0x7d, 0x7e, 0x82, 0xff, 0x8f, 0x8d, 0x8f, 0xff,
+ 0xa0, 0x9d, 0x9c, 0xff, 0xb2, 0xac, 0xa9, 0xff, 0xa9, 0xb9, 0xd2, 0xff,
+ 0x95, 0xa5, 0xbe, 0xff, 0x90, 0xa1, 0xc2, 0xff, 0x7c, 0x8d, 0xae, 0xff,
+ 0x5a, 0x6a, 0x8b, 0xff, 0x5a, 0x6a, 0x8b, 0xff, 0x5a, 0x6a, 0x8b, 0xff,
+ 0x5a, 0x6a, 0x8b, 0xff, 0x66, 0x77, 0x99, 0xff, 0x72, 0x83, 0xa5, 0xff,
+ 0x66, 0x77, 0x99, 0xff, 0x66, 0x77, 0x99, 0xff, 0x49, 0x5a, 0x6b, 0xff,
+ 0x49, 0x5a, 0x6b, 0xff, 0x5d, 0x6e, 0x7f, 0xff, 0x5d, 0x6e, 0x7f, 0xff,
+ 0x5a, 0x6a, 0x72, 0xff, 0x6c, 0x7c, 0x84, 0xff, 0x6c, 0x7c, 0x84, 0xff,
+ 0x46, 0x56, 0x5e, 0xff, 0x66, 0x66, 0x77, 0xff, 0x66, 0x66, 0x77, 0xff,
+ 0x66, 0x66, 0x77, 0xff, 0x66, 0x66, 0x77, 0xff, 0x72, 0x72, 0x83, 0xff,
+ 0x72, 0x72, 0x83, 0xff, 0x72, 0x72, 0x83, 0xff, 0x66, 0x66, 0x77, 0xff,
+ 0x82, 0x6c, 0x71, 0xff, 0x94, 0x7b, 0x7e, 0xff, 0xa5, 0x8b, 0x8b, 0xff,
+ 0xb7, 0x9a, 0x98, 0xff, 0xa9, 0xb9, 0xd2, 0xff, 0x95, 0xa5, 0xbe, 0xff,
+ 0x6a, 0x7b, 0x9c, 0xff, 0x6a, 0x7b, 0x9c, 0xff, 0x5f, 0x6f, 0x98, 0xff,
+ 0x4b, 0x5b, 0x84, 0xff, 0x39, 0x49, 0x72, 0xff, 0x4b, 0x5b, 0x84, 0xff,
+ 0x3f, 0x50, 0x72, 0xff, 0x55, 0x66, 0x88, 0xff, 0x55, 0x66, 0x88, 0xff,
+ 0x33, 0x44, 0x66, 0xff, 0x4d, 0x4d, 0x5e, 0xff, 0x3b, 0x3b, 0x4c, 0xff,
+ 0x3b, 0x3b, 0x4c, 0xff, 0x4d, 0x4d, 0x5e, 0xff, 0x4b, 0x5b, 0x63, 0xff,
+ 0x4b, 0x5b, 0x63, 0xff, 0x5f, 0x6f, 0x77, 0xff, 0x4b, 0x5b, 0x63, 0xff,
+ 0x3c, 0x3c, 0x5e, 0xff, 0x3c, 0x3c, 0x5e, 0xff, 0x50, 0x50, 0x72, 0xff,
+ 0x3c, 0x3c, 0x5e, 0xff, 0x50, 0x3f, 0x61, 0xff, 0x50, 0x3f, 0x61, 0xff,
+ 0x5a, 0x49, 0x6b, 0xff, 0x66, 0x55, 0x77, 0xff, 0x88, 0x5a, 0x5f, 0xff,
+ 0x99, 0x69, 0x6c, 0xff, 0xab, 0x79, 0x79, 0xff, 0xbc, 0x88, 0x86, 0xff,
+ 0x95, 0xa5, 0xbe, 0xff, 0x6f, 0x7f, 0x98, 0xff, 0x7c, 0x8d, 0xae, 0xff,
+ 0x56, 0x67, 0x88, 0xff, 0x4b, 0x5b, 0x84, 0xff, 0x39, 0x49, 0x72, 0xff,
+ 0x39, 0x49, 0x72, 0xff, 0x25, 0x35, 0x5e, 0xff, 0x49, 0x5a, 0x7c, 0xff,
+ 0x3f, 0x50, 0x72, 0xff, 0x33, 0x44, 0x66, 0xff, 0x33, 0x44, 0x66, 0xff,
+ 0x27, 0x27, 0x38, 0xff, 0x27, 0x27, 0x38, 0xff, 0x27, 0x27, 0x38, 0xff,
+ 0x27, 0x27, 0x38, 0xff, 0x39, 0x49, 0x51, 0xff, 0x25, 0x35, 0x3d, 0xff,
+ 0x39, 0x49, 0x51, 0xff, 0x25, 0x35, 0x3d, 0xff, 0x50, 0x50, 0x72, 0xff,
+ 0x2a, 0x2a, 0x4c, 0xff, 0x16, 0x16, 0x38, 0xff, 0x2a, 0x2a, 0x4c, 0xff,
+ 0x50, 0x3f, 0x61, 0xff, 0x5a, 0x49, 0x6b, 0xff, 0x50, 0x3f, 0x61, 0xff,
+ 0x50, 0x3f, 0x61, 0xff, 0x8d, 0x48, 0x4e, 0xff, 0x9e, 0x57, 0x5b, 0xff,
+ 0xb0, 0x67, 0x68, 0xff, 0xc1, 0x76, 0x75, 0xff, 0x80, 0x80, 0xa2, 0xff,
+ 0x6e, 0x6e, 0x90, 0xff, 0x4d, 0x4d, 0x80, 0xff, 0x61, 0x61, 0x94, 0xff,
+ 0x3e, 0x4e, 0x77, 0xff, 0x3e, 0x4e, 0x77, 0xff, 0x20, 0x28, 0x49, 0xff,
+ 0x20, 0x28, 0x49, 0xff, 0x19, 0x2a, 0x42, 0xff, 0x2d, 0x3e, 0x56, 0xff,
+ 0x21, 0x29, 0x5b, 0xff, 0x15, 0x1d, 0x4f, 0xff, 0x10, 0x10, 0x42, 0xff,
+ 0x16, 0x16, 0x48, 0xff, 0x10, 0x10, 0x42, 0xff, 0x1a, 0x1a, 0x4c, 0xff,
+ 0x11, 0x11, 0x33, 0xff, 0x22, 0x33, 0x55, 0xff, 0x11, 0x11, 0x33, 0xff,
+ 0x32, 0x43, 0x65, 0xff, 0x47, 0x4f, 0x5f, 0xff, 0x53, 0x5b, 0x6b, 0xff,
+ 0x31, 0x39, 0x49, 0xff, 0x31, 0x39, 0x49, 0xff, 0x38, 0x27, 0x38, 0xff,
+ 0x5e, 0x4d, 0x5e, 0xff, 0x72, 0x61, 0x72, 0xff, 0x5e, 0x4d, 0x5e, 0xff,
+ 0x8b, 0x39, 0x31, 0xff, 0x97, 0x45, 0x3d, 0xff, 0xba, 0x57, 0x57, 0xff,
+ 0xd7, 0x74, 0x74, 0xff, 0x94, 0x94, 0xb6, 0xff, 0x5a, 0x5a, 0x7c, 0xff,
+ 0x4d, 0x4d, 0x80, 0xff, 0x3b, 0x3b, 0x6e, 0xff, 0x3e, 0x4e, 0x77, 0xff,
+ 0x18, 0x28, 0x51, 0xff, 0x46, 0x4e, 0x6f, 0xff, 0x20, 0x28, 0x49, 0xff,
+ 0x07, 0x18, 0x30, 0xff, 0x07, 0x18, 0x30, 0xff, 0x21, 0x29, 0x5b, 0xff,
+ 0x15, 0x1d, 0x4f, 0xff, 0x1a, 0x1a, 0x4c, 0xff, 0x10, 0x10, 0x42, 0xff,
+ 0x16, 0x16, 0x48, 0xff, 0x10, 0x10, 0x42, 0xff, 0x22, 0x33, 0x55, 0xff,
+ 0x11, 0x11, 0x33, 0xff, 0x22, 0x33, 0x55, 0xff, 0x12, 0x23, 0x45, 0xff,
+ 0x3d, 0x45, 0x55, 0xff, 0x31, 0x39, 0x49, 0xff, 0x47, 0x4f, 0x5f, 0xff,
+ 0x3d, 0x45, 0x55, 0xff, 0x4c, 0x3b, 0x4c, 0xff, 0x4c, 0x3b, 0x4c, 0xff,
+ 0x5e, 0x4d, 0x5e, 0xff, 0x72, 0x61, 0x72, 0xff, 0xa1, 0x4f, 0x47, 0xff,
+ 0x97, 0x45, 0x3d, 0xff, 0xba, 0x57, 0x57, 0xff, 0xd7, 0x74, 0x74, 0xff,
+ 0x94, 0x94, 0xb6, 0xff, 0x5a, 0x5a, 0x7c, 0xff, 0x3b, 0x3b, 0x6e, 0xff,
+ 0x27, 0x27, 0x5a, 0xff, 0x2a, 0x3a, 0x63, 0xff, 0x04, 0x14, 0x3d, 0xff,
+ 0x0c, 0x14, 0x35, 0xff, 0x32, 0x3a, 0x5b, 0xff, 0x19, 0x2a, 0x42, 0xff,
+ 0x07, 0x18, 0x30, 0xff, 0x00, 0x07, 0x39, 0xff, 0x15, 0x1d, 0x4f, 0xff,
+ 0x0d, 0x1d, 0x4f, 0xff, 0x0d, 0x1d, 0x4f, 0xff, 0x0d, 0x1d, 0x4f, 0xff,
+ 0x00, 0x07, 0x39, 0xff, 0x12, 0x23, 0x45, 0xff, 0x12, 0x23, 0x45, 0xff,
+ 0x12, 0x23, 0x45, 0xff, 0x22, 0x33, 0x55, 0xff, 0x3d, 0x1c, 0x1c, 0xff,
+ 0x51, 0x30, 0x30, 0xff, 0x51, 0x30, 0x30, 0xff, 0x77, 0x56, 0x56, 0xff,
+ 0x7c, 0x49, 0x5a, 0xff, 0x7c, 0x49, 0x5a, 0xff, 0x72, 0x3f, 0x50, 0xff,
+ 0x72, 0x3f, 0x50, 0xff, 0xad, 0x5b, 0x53, 0xff, 0xad, 0x5b, 0x53, 0xff,
+ 0xba, 0x57, 0x57, 0xff, 0xd7, 0x74, 0x74, 0xff, 0x80, 0x80, 0xa2, 0xff,
+ 0x5a, 0x5a, 0x7c, 0xff, 0x3b, 0x3b, 0x6e, 0xff, 0x3b, 0x3b, 0x6e, 0xff,
+ 0x04, 0x14, 0x3d, 0xff, 0x18, 0x28, 0x51, 0xff, 0x0c, 0x14, 0x35, 0xff,
+ 0x0c, 0x14, 0x35, 0xff, 0x19, 0x2a, 0x42, 0xff, 0x07, 0x18, 0x30, 0xff,
+ 0x0b, 0x13, 0x45, 0xff, 0x00, 0x07, 0x39, 0xff, 0x19, 0x29, 0x5b, 0xff,
+ 0x19, 0x29, 0x5b, 0xff, 0x00, 0x07, 0x39, 0xff, 0x19, 0x29, 0x5b, 0xff,
+ 0x11, 0x11, 0x33, 0xff, 0x12, 0x23, 0x45, 0xff, 0x11, 0x11, 0x33, 0xff,
+ 0x11, 0x11, 0x33, 0xff, 0x51, 0x30, 0x30, 0xff, 0x3d, 0x1c, 0x1c, 0xff,
+ 0x3d, 0x1c, 0x1c, 0xff, 0x51, 0x30, 0x30, 0xff, 0x72, 0x3f, 0x50, 0xff,
+ 0x7c, 0x49, 0x5a, 0xff, 0x88, 0x55, 0x66, 0xff, 0x88, 0x55, 0x66, 0xff,
+ 0xa1, 0x4f, 0x47, 0xff, 0xad, 0x5b, 0x53, 0xff, 0xba, 0x57, 0x57, 0xff,
+ 0xd7, 0x74, 0x74, 0xff, 0x74, 0x84, 0xa5, 0xff, 0x4e, 0x5e, 0x7f, 0xff,
+ 0x41, 0x51, 0x83, 0xff, 0x2d, 0x3d, 0x6f, 0xff, 0x29, 0x32, 0x5b, 0xff,
+ 0x07, 0x10, 0x39, 0xff, 0x13, 0x1c, 0x45, 0xff, 0x1d, 0x26, 0x4f, 0xff,
+ 0x00, 0x00, 0x18, 0xff, 0x05, 0x0d, 0x2e, 0xff, 0x05, 0x0d, 0x2e, 0xff,
+ 0x11, 0x19, 0x3a, 0xff, 0x11, 0x21, 0x3a, 0xff, 0x11, 0x21, 0x3a, 0xff,
+ 0x29, 0x21, 0x32, 0xff, 0x13, 0x0b, 0x1c, 0xff, 0x36, 0x1d, 0x47, 0xff,
+ 0x20, 0x07, 0x31, 0xff, 0x4f, 0x1d, 0x47, 0xff, 0x4f, 0x1d, 0x47, 0xff,
+ 0x56, 0x34, 0x45, 0xff, 0x76, 0x54, 0x65, 0xff, 0x87, 0x32, 0x54, 0xff,
+ 0x67, 0x12, 0x34, 0xff, 0x93, 0x00, 0x00, 0xff, 0x82, 0x1c, 0x1c, 0xff,
+ 0xb0, 0x4a, 0x4a, 0xff, 0xb0, 0x4a, 0x4a, 0xff, 0xd2, 0x5b, 0x5b, 0xff,
+ 0xd2, 0x39, 0x39, 0xff, 0xd2, 0x5b, 0x5b, 0xff, 0xe8, 0x71, 0x71, 0xff,
+ 0x62, 0x72, 0x93, 0xff, 0x62, 0x72, 0x93, 0xff, 0x41, 0x51, 0x83, 0xff,
+ 0x41, 0x51, 0x83, 0xff, 0x1d, 0x26, 0x4f, 0xff, 0x29, 0x32, 0x5b, 0xff,
+ 0x07, 0x10, 0x39, 0xff, 0x13, 0x1c, 0x45, 0xff, 0x11, 0x19, 0x3a, 0xff,
+ 0x00, 0x03, 0x24, 0xff, 0x05, 0x0d, 0x2e, 0xff, 0x11, 0x19, 0x3a, 0xff,
+ 0x05, 0x15, 0x2e, 0xff, 0x05, 0x15, 0x2e, 0xff, 0x13, 0x0b, 0x1c, 0xff,
+ 0x07, 0x00, 0x10, 0xff, 0x20, 0x07, 0x31, 0xff, 0x20, 0x07, 0x31, 0xff,
+ 0x39, 0x07, 0x31, 0xff, 0x5b, 0x29, 0x53, 0xff, 0x56, 0x34, 0x45, 0xff,
+ 0x87, 0x32, 0x54, 0xff, 0x76, 0x54, 0x65, 0xff, 0x87, 0x32, 0x54, 0xff,
+ 0x82, 0x1c, 0x1c, 0xff, 0x93, 0x00, 0x00, 0xff, 0x82, 0x1c, 0x1c, 0xff,
+ 0xb0, 0x4a, 0x4a, 0xff, 0xd2, 0x39, 0x39, 0xff, 0xd2, 0x39, 0x39, 0xff,
+ 0xe8, 0x4f, 0x4f, 0xff, 0xe8, 0x71, 0x71, 0xff, 0x74, 0x84, 0xa5, 0xff,
+ 0x4e, 0x5e, 0x7f, 0xff, 0x53, 0x63, 0x95, 0xff, 0x2d, 0x3d, 0x6f, 0xff,
+ 0x29, 0x32, 0x6b, 0xff, 0x1d, 0x26, 0x5f, 0xff, 0x29, 0x32, 0x6b, 0xff,
+ 0x13, 0x1c, 0x55, 0xff, 0x2a, 0x4b, 0x5b, 0xff, 0x0d, 0x2e, 0x3e, 0xff,
+ 0x00, 0x14, 0x24, 0xff, 0x00, 0x00, 0x07, 0xff, 0x05, 0x15, 0x2e, 0xff,
+ 0x00, 0x0b, 0x24, 0xff, 0x13, 0x0b, 0x1c, 0xff, 0x13, 0x0b, 0x1c, 0xff,
+ 0x20, 0x07, 0x31, 0xff, 0x2c, 0x13, 0x3d, 0xff, 0x39, 0x07, 0x31, 0xff,
+ 0x4f, 0x1d, 0x47, 0xff, 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff,
+ 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff, 0xb0, 0x4a, 0x4a, 0xff,
+ 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff,
+ 0xd2, 0x5b, 0x5b, 0xff, 0xd2, 0x39, 0x39, 0xff, 0xe8, 0x4f, 0x4f, 0xff,
+ 0xe8, 0x71, 0x71, 0xff, 0x88, 0x98, 0xb9, 0xff, 0x62, 0x72, 0x93, 0xff,
+ 0x2d, 0x3d, 0x6f, 0xff, 0x2d, 0x3d, 0x6f, 0xff, 0x1d, 0x26, 0x5f, 0xff,
+ 0x13, 0x1c, 0x55, 0xff, 0x07, 0x10, 0x49, 0xff, 0x1d, 0x26, 0x5f, 0xff,
+ 0x00, 0x14, 0x24, 0xff, 0x2a, 0x4b, 0x5b, 0xff, 0x00, 0x14, 0x24, 0xff,
+ 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x18, 0xff, 0x05, 0x15, 0x2e, 0xff,
+ 0x29, 0x21, 0x32, 0xff, 0x1d, 0x15, 0x26, 0xff, 0x42, 0x29, 0x53, 0xff,
+ 0x36, 0x1d, 0x47, 0xff, 0x5b, 0x29, 0x53, 0xff, 0x4f, 0x1d, 0x47, 0xff,
+ 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff,
+ 0x87, 0x32, 0x54, 0xff, 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff,
+ 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, 0xd2, 0x39, 0x39, 0xff,
+ 0xd2, 0x39, 0x39, 0xff, 0xe8, 0x4f, 0x4f, 0xff, 0xe8, 0x71, 0x71, 0xff,
+ 0x7c, 0x9e, 0xaf, 0xff, 0x66, 0x88, 0x99, 0xff, 0x51, 0x62, 0x73, 0xff,
+ 0x1a, 0x2b, 0x3c, 0xff, 0x21, 0x21, 0x3a, 0xff, 0x0f, 0x0f, 0x28, 0xff,
+ 0x0d, 0x0d, 0x4f, 0xff, 0x00, 0x00, 0x35, 0xff, 0x00, 0x00, 0x20, 0xff,
+ 0x05, 0x05, 0x36, 0xff, 0x09, 0x11, 0x32, 0xff, 0x09, 0x11, 0x32, 0xff,
+ 0x10, 0x18, 0x31, 0xff, 0x10, 0x18, 0x31, 0xff, 0x34, 0x24, 0x55, 0xff,
+ 0x3e, 0x2e, 0x5f, 0xff, 0x46, 0x14, 0x46, 0xff, 0x6c, 0x3a, 0x6c, 0xff,
+ 0x6a, 0x20, 0x41, 0xff, 0x8c, 0x42, 0x63, 0xff, 0x99, 0x33, 0x44, 0xff,
+ 0x99, 0x33, 0x44, 0xff, 0x99, 0x33, 0x44, 0xff, 0xbb, 0x11, 0x22, 0xff,
+ 0xc3, 0x06, 0x04, 0xff, 0xcd, 0x0b, 0x0b, 0xff, 0xd7, 0x0f, 0x12, 0xff,
+ 0xe1, 0x14, 0x19, 0xff, 0xe7, 0x26, 0x28, 0xff, 0xe7, 0x3f, 0x44, 0xff,
+ 0xe7, 0x59, 0x5f, 0xff, 0xe7, 0x72, 0x7b, 0xff, 0x7c, 0x9e, 0xaf, 0xff,
+ 0x72, 0x94, 0xa5, 0xff, 0x6e, 0x7f, 0x90, 0xff, 0x1a, 0x2b, 0x3c, 0xff,
+ 0x0f, 0x0f, 0x28, 0xff, 0x00, 0x00, 0x14, 0xff, 0x00, 0x00, 0x35, 0xff,
+ 0x00, 0x00, 0x35, 0xff, 0x00, 0x00, 0x20, 0xff, 0x00, 0x00, 0x20, 0xff,
+ 0x09, 0x11, 0x32, 0xff, 0x09, 0x11, 0x32, 0xff, 0x26, 0x2e, 0x47, 0xff,
+ 0x26, 0x2e, 0x47, 0xff, 0x28, 0x18, 0x49, 0xff, 0x4a, 0x3a, 0x6b, 0xff,
+ 0x5a, 0x28, 0x5a, 0xff, 0x46, 0x14, 0x46, 0xff, 0x8c, 0x42, 0x63, 0xff,
+ 0x80, 0x36, 0x57, 0xff, 0x99, 0x33, 0x44, 0xff, 0xa4, 0x3e, 0x4f, 0xff,
+ 0x8e, 0x28, 0x39, 0xff, 0xbb, 0x11, 0x22, 0xff, 0xc7, 0x05, 0x03, 0xff,
+ 0xd1, 0x09, 0x0a, 0xff, 0xdb, 0x0e, 0x11, 0xff, 0xe5, 0x12, 0x18, 0xff,
+ 0xe9, 0x25, 0x26, 0xff, 0xe9, 0x3e, 0x42, 0xff, 0xe9, 0x58, 0x5d, 0xff,
+ 0xe9, 0x71, 0x79, 0xff, 0x88, 0xaa, 0xbb, 0xff, 0x66, 0x88, 0x99, 0xff,
+ 0x6e, 0x7f, 0x90, 0xff, 0x37, 0x48, 0x59, 0xff, 0x0f, 0x0f, 0x28, 0xff,
+ 0x00, 0x00, 0x14, 0xff, 0x00, 0x00, 0x18, 0xff, 0x00, 0x00, 0x18, 0xff,
+ 0x05, 0x05, 0x36, 0xff, 0x00, 0x00, 0x20, 0xff, 0x00, 0x00, 0x0c, 0xff,
+ 0x09, 0x11, 0x32, 0xff, 0x26, 0x2e, 0x47, 0xff, 0x32, 0x3a, 0x53, 0xff,
+ 0x3e, 0x2e, 0x5f, 0xff, 0x4a, 0x3a, 0x6b, 0xff, 0x6c, 0x3a, 0x6c, 0xff,
+ 0x6c, 0x3a, 0x6c, 0xff, 0x76, 0x2c, 0x4d, 0xff, 0x8c, 0x42, 0x63, 0xff,
+ 0x99, 0x33, 0x44, 0xff, 0x99, 0x33, 0x44, 0xff, 0xa4, 0x3e, 0x4f, 0xff,
+ 0xbb, 0x11, 0x22, 0xff, 0xcb, 0x03, 0x02, 0xff, 0xd5, 0x08, 0x09, 0xff,
+ 0xdf, 0x0c, 0x10, 0xff, 0xe9, 0x11, 0x17, 0xff, 0xeb, 0x24, 0x24, 0xff,
+ 0xeb, 0x3d, 0x40, 0xff, 0xeb, 0x57, 0x5b, 0xff, 0xeb, 0x70, 0x77, 0xff,
+ 0x88, 0xaa, 0xbb, 0xff, 0x72, 0x94, 0xa5, 0xff, 0x6e, 0x7f, 0x90, 0xff,
+ 0x6e, 0x7f, 0x90, 0xff, 0x35, 0x35, 0x4e, 0xff, 0x00, 0x00, 0x14, 0xff,
+ 0x00, 0x00, 0x18, 0xff, 0x00, 0x00, 0x35, 0xff, 0x11, 0x11, 0x42, 0xff,
+ 0x05, 0x05, 0x36, 0xff, 0x00, 0x00, 0x0c, 0xff, 0x09, 0x11, 0x32, 0xff,
+ 0x26, 0x2e, 0x47, 0xff, 0x32, 0x3a, 0x53, 0xff, 0x4a, 0x3a, 0x6b, 0xff,
+ 0x4a, 0x3a, 0x6b, 0xff, 0x6c, 0x3a, 0x6c, 0xff, 0x80, 0x4e, 0x80, 0xff,
+ 0x8c, 0x42, 0x63, 0xff, 0x80, 0x36, 0x57, 0xff, 0xa4, 0x3e, 0x4f, 0xff,
+ 0xa4, 0x3e, 0x4f, 0xff, 0x99, 0x33, 0x44, 0xff, 0xbb, 0x11, 0x22, 0xff,
+ 0xcf, 0x02, 0x01, 0xff, 0xd9, 0x06, 0x08, 0xff, 0xe3, 0x0b, 0x0f, 0xff,
+ 0xed, 0x0f, 0x16, 0xff, 0xed, 0x23, 0x22, 0xff, 0xed, 0x3c, 0x3e, 0xff,
+ 0xed, 0x56, 0x59, 0xff, 0xed, 0x6f, 0x75, 0xff, 0x7c, 0x95, 0xae, 0xff,
+ 0x7c, 0x95, 0xae, 0xff, 0x5f, 0x78, 0x91, 0xff, 0x5f, 0x78, 0x91, 0xff,
+ 0x5d, 0x6e, 0x90, 0xff, 0x26, 0x37, 0x59, 0xff, 0x00, 0x00, 0x09, 0xff,
+ 0x04, 0x00, 0x26, 0xff, 0x13, 0x13, 0x46, 0xff, 0x13, 0x13, 0x46, 0xff,
+ 0x13, 0x13, 0x46, 0xff, 0x33, 0x00, 0x11, 0xff, 0x3e, 0x1c, 0x3e, 0xff,
+ 0x55, 0x33, 0x55, 0xff, 0x6c, 0x4a, 0x6c, 0xff, 0x6c, 0x4a, 0x6c, 0xff,
+ 0x6a, 0x41, 0x52, 0xff, 0x80, 0x57, 0x68, 0xff, 0x8c, 0x63, 0x74, 0xff,
+ 0x80, 0x57, 0x68, 0xff, 0x9f, 0x17, 0x17, 0xff, 0xb5, 0x2d, 0x2d, 0xff,
+ 0xb5, 0x2d, 0x2d, 0xff, 0xd2, 0x06, 0x06, 0xff, 0xd6, 0x00, 0x00, 0xff,
+ 0xe2, 0x00, 0x03, 0xff, 0xe9, 0x0a, 0x12, 0xff, 0xef, 0x10, 0x18, 0xff,
+ 0xe7, 0x1e, 0x20, 0xff, 0xea, 0x3f, 0x3e, 0xff, 0xed, 0x60, 0x5b, 0xff,
+ 0xf0, 0x80, 0x79, 0xff, 0x7c, 0x95, 0xae, 0xff, 0x5f, 0x78, 0x91, 0xff,
+ 0x5f, 0x78, 0x91, 0xff, 0x45, 0x5e, 0x77, 0xff, 0x40, 0x51, 0x73, 0xff,
+ 0x26, 0x37, 0x59, 0xff, 0x1e, 0x0d, 0x40, 0xff, 0x00, 0x00, 0x09, 0xff,
+ 0x13, 0x13, 0x46, 0xff, 0x13, 0x13, 0x46, 0xff, 0x33, 0x33, 0x66, 0xff,
+ 0x13, 0x13, 0x46, 0xff, 0x3e, 0x1c, 0x3e, 0xff, 0x55, 0x33, 0x55, 0xff,
+ 0x55, 0x33, 0x55, 0xff, 0x6c, 0x4a, 0x6c, 0xff, 0x76, 0x4d, 0x5e, 0xff,
+ 0x6a, 0x41, 0x52, 0xff, 0x80, 0x57, 0x68, 0xff, 0x8c, 0x63, 0x74, 0xff,
+ 0xb5, 0x2d, 0x2d, 0xff, 0x9f, 0x17, 0x17, 0xff, 0xd2, 0x06, 0x06, 0xff,
+ 0xd2, 0x06, 0x06, 0xff, 0xd6, 0x00, 0x00, 0xff, 0xec, 0x05, 0x0d, 0xff,
+ 0xe9, 0x0a, 0x12, 0xff, 0xef, 0x10, 0x18, 0xff, 0xe8, 0x1e, 0x1f, 0xff,
+ 0xeb, 0x3e, 0x3d, 0xff, 0xee, 0x5f, 0x5a, 0xff, 0xf1, 0x80, 0x78, 0xff,
+ 0x6f, 0x67, 0x88, 0xff, 0x5b, 0x53, 0x74, 0xff, 0x49, 0x41, 0x62, 0xff,
+ 0x35, 0x2d, 0x4e, 0xff, 0x26, 0x37, 0x59, 0xff, 0x26, 0x37, 0x59, 0xff,
+ 0x3b, 0x2a, 0x5d, 0xff, 0x04, 0x00, 0x26, 0xff, 0x33, 0x00, 0x11, 0xff,
+ 0x33, 0x33, 0x66, 0xff, 0x33, 0x33, 0x66, 0xff, 0x33, 0x33, 0x66, 0xff,
+ 0x55, 0x33, 0x55, 0xff, 0x55, 0x33, 0x55, 0xff, 0x77, 0x33, 0x55, 0xff,
+ 0x77, 0x33, 0x55, 0xff, 0x8f, 0x34, 0x55, 0xff, 0x8f, 0x34, 0x55, 0xff,
+ 0x8f, 0x34, 0x55, 0xff, 0xa5, 0x4a, 0x6b, 0xff, 0xb5, 0x2d, 0x2d, 0xff,
+ 0xb5, 0x2d, 0x2d, 0xff, 0xd2, 0x06, 0x06, 0xff, 0xd2, 0x06, 0x06, 0xff,
+ 0xe2, 0x00, 0x03, 0xff, 0xec, 0x05, 0x0d, 0xff, 0xe5, 0x06, 0x0e, 0xff,
+ 0xef, 0x10, 0x18, 0xff, 0xe9, 0x1d, 0x1e, 0xff, 0xec, 0x3e, 0x3c, 0xff,
+ 0xef, 0x5f, 0x59, 0xff, 0xf2, 0x7f, 0x77, 0xff, 0x6f, 0x67, 0x88, 0xff,
+ 0x5b, 0x53, 0x74, 0xff, 0x49, 0x41, 0x62, 0xff, 0x35, 0x2d, 0x4e, 0xff,
+ 0x09, 0x1a, 0x3c, 0xff, 0x26, 0x37, 0x59, 0xff, 0x3b, 0x2a, 0x5d, 0xff,
+ 0x1e, 0x0d, 0x40, 0xff, 0x33, 0x00, 0x11, 0xff, 0x33, 0x00, 0x11, 0xff,
+ 0x33, 0x33, 0x66, 0xff, 0x53, 0x53, 0x86, 0xff, 0x55, 0x33, 0x55, 0xff,
+ 0x6c, 0x4a, 0x6c, 0xff, 0x77, 0x33, 0x55, 0xff, 0x77, 0x33, 0x55, 0xff,
+ 0x83, 0x28, 0x49, 0xff, 0x99, 0x3e, 0x5f, 0xff, 0x99, 0x3e, 0x5f, 0xff,
+ 0x8f, 0x34, 0x55, 0xff, 0xb5, 0x2d, 0x2d, 0xff, 0xb5, 0x2d, 0x2d, 0xff,
+ 0xd2, 0x06, 0x06, 0xff, 0xd2, 0x06, 0x06, 0xff, 0xe2, 0x00, 0x03, 0xff,
+ 0xec, 0x05, 0x0d, 0xff, 0xe5, 0x06, 0x0e, 0xff, 0xe9, 0x0a, 0x12, 0xff,
+ 0xea, 0x1d, 0x1d, 0xff, 0xed, 0x3d, 0x3b, 0xff, 0xf0, 0x5e, 0x58, 0xff,
+ 0xf3, 0x7f, 0x76, 0xff, 0x7c, 0x74, 0x95, 0xff, 0x56, 0x4e, 0x6f, 0xff,
+ 0x62, 0x49, 0x7b, 0xff, 0x4e, 0x35, 0x67, 0xff, 0x44, 0x33, 0x66, 0xff,
+ 0x34, 0x23, 0x56, 0xff, 0x44, 0x33, 0x66, 0xff, 0x44, 0x33, 0x66, 0xff,
+ 0x56, 0x23, 0x56, 0xff, 0x67, 0x00, 0x01, 0xff, 0x56, 0x23, 0x56, 0xff,
+ 0x76, 0x43, 0x76, 0xff, 0x8d, 0x4b, 0x6c, 0xff, 0x67, 0x25, 0x46, 0xff,
+ 0x8d, 0x4b, 0x6c, 0xff, 0x7b, 0x39, 0x5a, 0xff, 0x9f, 0x28, 0x39, 0xff,
+ 0x9f, 0x28, 0x39, 0xff, 0x9f, 0x28, 0x39, 0xff, 0xb5, 0x0b, 0x0b, 0xff,
+ 0xc1, 0x00, 0x00, 0xff, 0xe7, 0x11, 0x11, 0xff, 0xdf, 0x00, 0x00, 0xff,
+ 0xe9, 0x02, 0x0a, 0xff, 0xeb, 0x00, 0x04, 0xff, 0xec, 0x05, 0x0a, 0xff,
+ 0xed, 0x0a, 0x10, 0xff, 0xee, 0x0f, 0x16, 0xff, 0xeb, 0x1c, 0x1c, 0xff,
+ 0xec, 0x3c, 0x3b, 0xff, 0xed, 0x5c, 0x59, 0xff, 0xee, 0x7b, 0x78, 0xff,
+ 0x90, 0x88, 0xa9, 0xff, 0x56, 0x4e, 0x6f, 0xff, 0x4e, 0x35, 0x67, 0xff,
+ 0x4e, 0x35, 0x67, 0xff, 0x44, 0x33, 0x66, 0xff, 0x34, 0x23, 0x56, 0xff,
+ 0x34, 0x23, 0x56, 0xff, 0x54, 0x43, 0x76, 0xff, 0x76, 0x43, 0x76, 0xff,
+ 0x87, 0x10, 0x21, 0xff, 0x87, 0x10, 0x21, 0xff, 0x76, 0x43, 0x76, 0xff,
+ 0x8d, 0x4b, 0x6c, 0xff, 0x8d, 0x4b, 0x6c, 0xff, 0x7b, 0x39, 0x5a, 0xff,
+ 0x8d, 0x4b, 0x6c, 0xff, 0x9f, 0x28, 0x39, 0xff, 0x9f, 0x28, 0x39, 0xff,
+ 0xb5, 0x0b, 0x0b, 0xff, 0xb5, 0x0b, 0x0b, 0xff, 0xc1, 0x00, 0x00, 0xff,
+ 0xd5, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x06, 0xff, 0xe5, 0x00, 0x06, 0xff,
+ 0xe9, 0x01, 0x05, 0xff, 0xea, 0x06, 0x0b, 0xff, 0xeb, 0x0b, 0x11, 0xff,
+ 0xec, 0x10, 0x17, 0xff, 0xeb, 0x1c, 0x1c, 0xff, 0xec, 0x3b, 0x3b, 0xff,
+ 0xed, 0x5b, 0x59, 0xff, 0xee, 0x7b, 0x78, 0xff, 0x90, 0x88, 0xa9, 0xff,
+ 0x6a, 0x62, 0x83, 0xff, 0x4e, 0x35, 0x67, 0xff, 0x62, 0x49, 0x7b, 0xff,
+ 0x54, 0x43, 0x76, 0xff, 0x54, 0x43, 0x76, 0xff, 0x66, 0x11, 0x55, 0xff,
+ 0x54, 0x43, 0x76, 0xff, 0x76, 0x43, 0x76, 0xff, 0x76, 0x43, 0x76, 0xff,
+ 0x87, 0x10, 0x21, 0xff, 0x87, 0x10, 0x21, 0xff, 0xad, 0x32, 0x53, 0xff,
+ 0xad, 0x32, 0x53, 0xff, 0x97, 0x1c, 0x3d, 0xff, 0xa1, 0x26, 0x47, 0xff,
+ 0x9f, 0x28, 0x39, 0xff, 0x9f, 0x28, 0x39, 0xff, 0xc1, 0x17, 0x17, 0xff,
+ 0xb5, 0x0b, 0x0b, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff,
+ 0xe5, 0x00, 0x06, 0xff, 0xe5, 0x00, 0x06, 0xff, 0xe7, 0x01, 0x06, 0xff,
+ 0xe8, 0x06, 0x0c, 0xff, 0xe9, 0x0b, 0x12, 0xff, 0xea, 0x10, 0x18, 0xff,
+ 0xeb, 0x1b, 0x1c, 0xff, 0xec, 0x3b, 0x3b, 0xff, 0xed, 0x5b, 0x59, 0xff,
+ 0xee, 0x7a, 0x78, 0xff, 0x90, 0x88, 0xa9, 0xff, 0x7c, 0x74, 0x95, 0xff,
+ 0x62, 0x49, 0x7b, 0xff, 0x62, 0x49, 0x7b, 0xff, 0x54, 0x43, 0x76, 0xff,
+ 0x54, 0x43, 0x76, 0xff, 0x66, 0x11, 0x55, 0xff, 0x66, 0x11, 0x55, 0xff,
+ 0x76, 0x43, 0x76, 0xff, 0x76, 0x43, 0x76, 0xff, 0x87, 0x10, 0x21, 0xff,
+ 0x87, 0x10, 0x21, 0xff, 0x8b, 0x10, 0x31, 0xff, 0xa1, 0x26, 0x47, 0xff,
+ 0xa1, 0x26, 0x47, 0xff, 0x8b, 0x10, 0x31, 0xff, 0xb5, 0x0b, 0x0b, 0xff,
+ 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff,
+ 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xdf, 0x00, 0x00, 0xff,
+ 0xdf, 0x00, 0x00, 0xff, 0xe5, 0x02, 0x07, 0xff, 0xe6, 0x07, 0x0d, 0xff,
+ 0xe7, 0x0c, 0x13, 0xff, 0xe8, 0x11, 0x19, 0xff, 0xeb, 0x1b, 0x1c, 0xff,
+ 0xec, 0x3a, 0x3b, 0xff, 0xed, 0x5a, 0x59, 0xff, 0xee, 0x7a, 0x78, 0xff,
+ 0x9e, 0x86, 0xa7, 0xff, 0x9a, 0x82, 0xa3, 0xff, 0x8f, 0x56, 0x7f, 0xff,
+ 0x72, 0x39, 0x62, 0xff, 0x71, 0x3c, 0x75, 0xff, 0x75, 0x31, 0x68, 0xff,
+ 0x7a, 0x26, 0x5b, 0xff, 0x7e, 0x1b, 0x4e, 0xff, 0x82, 0x1c, 0x4f, 0xff,
+ 0x8e, 0x28, 0x5b, 0xff, 0x8e, 0x28, 0x5b, 0xff, 0xa4, 0x1c, 0x1c, 0xff,
+ 0xb3, 0x0e, 0x0e, 0xff, 0xad, 0x08, 0x08, 0xff, 0xbd, 0x18, 0x18, 0xff,
+ 0xb7, 0x12, 0x12, 0xff, 0xbd, 0x00, 0x00, 0xff, 0xc9, 0x03, 0x0b, 0xff,
+ 0xd6, 0x00, 0x08, 0xff, 0xd6, 0x00, 0x08, 0xff, 0xdb, 0x00, 0x08, 0xff,
+ 0xdd, 0x01, 0x07, 0xff, 0xdf, 0x02, 0x06, 0xff, 0xe1, 0x03, 0x05, 0xff,
+ 0xe3, 0x00, 0x00, 0xff, 0xe5, 0x07, 0x0a, 0xff, 0xe7, 0x0e, 0x14, 0xff,
+ 0xe9, 0x15, 0x1e, 0xff, 0xeb, 0x26, 0x24, 0xff, 0xed, 0x46, 0x42, 0xff,
+ 0xef, 0x66, 0x5f, 0xff, 0xf1, 0x85, 0x7d, 0xff, 0x9a, 0x82, 0xa3, 0xff,
+ 0xa4, 0x8c, 0xad, 0xff, 0xa9, 0x70, 0x99, 0xff, 0x8f, 0x56, 0x7f, 0xff,
+ 0x83, 0x3f, 0x6a, 0xff, 0x88, 0x34, 0x5d, 0xff, 0x8c, 0x29, 0x50, 0xff,
+ 0x90, 0x1e, 0x43, 0xff, 0xa4, 0x1c, 0x1c, 0xff, 0xa4, 0x1c, 0x1c, 0xff,
+ 0xb0, 0x28, 0x28, 0xff, 0xa4, 0x1c, 0x1c, 0xff, 0xad, 0x08, 0x08, 0xff,
+ 0xbd, 0x18, 0x18, 0xff, 0xbd, 0x18, 0x18, 0xff, 0xb3, 0x0e, 0x0e, 0xff,
+ 0xc9, 0x03, 0x0b, 0xff, 0xc9, 0x03, 0x0b, 0xff, 0xd6, 0x00, 0x08, 0xff,
+ 0xdc, 0x06, 0x0e, 0xff, 0xdc, 0x05, 0x0c, 0xff, 0xde, 0x06, 0x0b, 0xff,
+ 0xe0, 0x07, 0x0a, 0xff, 0xe2, 0x08, 0x09, 0xff, 0xe2, 0x04, 0x03, 0xff,
+ 0xe4, 0x0b, 0x0d, 0xff, 0xe6, 0x12, 0x17, 0xff, 0xe8, 0x19, 0x21, 0xff,
+ 0xe9, 0x31, 0x2b, 0xff, 0xeb, 0x51, 0x49, 0xff, 0xed, 0x71, 0x66, 0xff,
+ 0xef, 0x90, 0x84, 0xff, 0xa4, 0x8c, 0xad, 0xff, 0x94, 0x7c, 0x9d, 0xff,
+ 0xa9, 0x70, 0x99, 0xff, 0x8f, 0x56, 0x7f, 0xff, 0x96, 0x41, 0x5f, 0xff,
+ 0x9a, 0x36, 0x52, 0xff, 0x9e, 0x2b, 0x45, 0xff, 0xa2, 0x20, 0x38, 0xff,
+ 0xa4, 0x1c, 0x1c, 0xff, 0xa4, 0x1c, 0x1c, 0xff, 0xb0, 0x28, 0x28, 0xff,
+ 0xb0, 0x28, 0x28, 0xff, 0xcc, 0x0e, 0x0e, 0xff, 0xcc, 0x0e, 0x0e, 0xff,
+ 0xcc, 0x0e, 0x0e, 0xff, 0xd0, 0x12, 0x12, 0xff, 0xd3, 0x0d, 0x15, 0xff,
+ 0xd3, 0x0d, 0x15, 0xff, 0xe6, 0x10, 0x18, 0xff, 0xdc, 0x06, 0x0e, 0xff,
+ 0xdd, 0x09, 0x10, 0xff, 0xdf, 0x0a, 0x0f, 0xff, 0xe1, 0x0b, 0x0e, 0xff,
+ 0xe3, 0x0c, 0x0d, 0xff, 0xe1, 0x08, 0x06, 0xff, 0xe3, 0x0f, 0x10, 0xff,
+ 0xe5, 0x16, 0x1a, 0xff, 0xe7, 0x1d, 0x24, 0xff, 0xe7, 0x3c, 0x33, 0xff,
+ 0xe9, 0x5c, 0x50, 0xff, 0xeb, 0x7c, 0x6e, 0xff, 0xed, 0x9b, 0x8b, 0xff,
+ 0xa4, 0x8c, 0xad, 0xff, 0x94, 0x7c, 0x9d, 0xff, 0xa9, 0x70, 0x99, 0xff,
+ 0x8f, 0x56, 0x7f, 0xff, 0xa8, 0x44, 0x54, 0xff, 0xac, 0x39, 0x47, 0xff,
+ 0xb0, 0x2e, 0x3a, 0xff, 0xb5, 0x23, 0x2d, 0xff, 0xa4, 0x1c, 0x1c, 0xff,
+ 0xb0, 0x28, 0x28, 0xff, 0xb0, 0x28, 0x28, 0xff, 0xb0, 0x28, 0x28, 0xff,
+ 0xd6, 0x18, 0x18, 0xff, 0xd0, 0x12, 0x12, 0xff, 0xd6, 0x18, 0x18, 0xff,
+ 0xd6, 0x18, 0x18, 0xff, 0xdf, 0x19, 0x21, 0xff, 0xdf, 0x19, 0x21, 0xff,
+ 0xe6, 0x10, 0x18, 0xff, 0xe6, 0x10, 0x18, 0xff, 0xde, 0x0e, 0x14, 0xff,
+ 0xe0, 0x0f, 0x13, 0xff, 0xe2, 0x10, 0x12, 0xff, 0xe4, 0x11, 0x11, 0xff,
+ 0xe0, 0x0c, 0x09, 0xff, 0xe2, 0x13, 0x13, 0xff, 0xe4, 0x1a, 0x1d, 0xff,
+ 0xe6, 0x21, 0x27, 0xff, 0xe5, 0x47, 0x3a, 0xff, 0xe7, 0x67, 0x57, 0xff,
+ 0xe9, 0x87, 0x75, 0xff, 0xeb, 0xa6, 0x92, 0xff, 0xd5, 0x8b, 0x83, 0xff,
+ 0xc1, 0x77, 0x6f, 0xff, 0xb9, 0x56, 0x56, 0xff, 0xb9, 0x56, 0x56, 0xff,
+ 0xcd, 0x49, 0x49, 0xff, 0xcd, 0x49, 0x49, 0xff, 0xb9, 0x35, 0x35, 0xff,
+ 0xb9, 0x35, 0x35, 0xff, 0xcb, 0x2e, 0x2c, 0xff, 0xcb, 0x2c, 0x2c, 0xff,
+ 0xcb, 0x2a, 0x2c, 0xff, 0xcb, 0x28, 0x2c, 0xff, 0xd7, 0x20, 0x24, 0xff,
+ 0xda, 0x20, 0x23, 0xff, 0xdd, 0x1f, 0x22, 0xff, 0xe0, 0x1f, 0x21, 0xff,
+ 0xe7, 0x22, 0x24, 0xff, 0xe7, 0x20, 0x24, 0xff, 0xe7, 0x1d, 0x24, 0xff,
+ 0xe7, 0x1b, 0x24, 0xff, 0xe3, 0x1c, 0x20, 0xff, 0xe3, 0x1c, 0x20, 0xff,
+ 0xe3, 0x1c, 0x20, 0xff, 0xe3, 0x1c, 0x20, 0xff, 0xdf, 0x1a, 0x20, 0xff,
+ 0xe0, 0x23, 0x25, 0xff, 0xe1, 0x2b, 0x2a, 0xff, 0xe2, 0x34, 0x2f, 0xff,
+ 0xe3, 0x54, 0x49, 0xff, 0xe4, 0x69, 0x5e, 0xff, 0xe5, 0x7e, 0x74, 0xff,
+ 0xe6, 0x92, 0x89, 0xff, 0xe7, 0x9d, 0x95, 0xff, 0xd5, 0x8b, 0x83, 0xff,
+ 0xcd, 0x6a, 0x6a, 0xff, 0xb9, 0x56, 0x56, 0xff, 0xcd, 0x49, 0x49, 0xff,
+ 0xcd, 0x49, 0x49, 0xff, 0xcd, 0x49, 0x49, 0xff, 0xcd, 0x49, 0x49, 0xff,
+ 0xd8, 0x46, 0x46, 0xff, 0xd8, 0x44, 0x46, 0xff, 0xd8, 0x42, 0x46, 0xff,
+ 0xd8, 0x40, 0x46, 0xff, 0xdd, 0x3c, 0x3f, 0xff, 0xe0, 0x3b, 0x3e, 0xff,
+ 0xe3, 0x3b, 0x3d, 0xff, 0xe6, 0x3a, 0x3c, 0xff, 0xe9, 0x3d, 0x3c, 0xff,
+ 0xe9, 0x3a, 0x3c, 0xff, 0xe9, 0x38, 0x3c, 0xff, 0xe9, 0x35, 0x3c, 0xff,
+ 0xe7, 0x36, 0x3b, 0xff, 0xe7, 0x36, 0x3b, 0xff, 0xe7, 0x36, 0x3b, 0xff,
+ 0xe7, 0x36, 0x3b, 0xff, 0xe3, 0x34, 0x3a, 0xff, 0xe4, 0x3d, 0x3f, 0xff,
+ 0xe5, 0x45, 0x44, 0xff, 0xe6, 0x4e, 0x49, 0xff, 0xe6, 0x63, 0x59, 0xff,
+ 0xe7, 0x78, 0x6f, 0xff, 0xe8, 0x8d, 0x84, 0xff, 0xe9, 0xa2, 0x99, 0xff,
+ 0xfb, 0xb1, 0xa9, 0xff, 0xe7, 0x9d, 0x95, 0xff, 0xdf, 0x7c, 0x7c, 0xff,
+ 0xcd, 0x6a, 0x6a, 0xff, 0xe2, 0x66, 0x66, 0xff, 0xe2, 0x66, 0x66, 0xff,
+ 0xe2, 0x66, 0x66, 0xff, 0xe2, 0x66, 0x66, 0xff, 0xe5, 0x5f, 0x5f, 0xff,
+ 0xe5, 0x5d, 0x5f, 0xff, 0xe5, 0x5b, 0x5f, 0xff, 0xe5, 0x59, 0x5f, 0xff,
+ 0xe3, 0x58, 0x59, 0xff, 0xe6, 0x57, 0x58, 0xff, 0xe9, 0x57, 0x57, 0xff,
+ 0xec, 0x56, 0x56, 0xff, 0xeb, 0x58, 0x53, 0xff, 0xeb, 0x55, 0x53, 0xff,
+ 0xeb, 0x53, 0x53, 0xff, 0xeb, 0x50, 0x53, 0xff, 0xeb, 0x51, 0x55, 0xff,
+ 0xeb, 0x51, 0x55, 0xff, 0xeb, 0x51, 0x55, 0xff, 0xeb, 0x51, 0x55, 0xff,
+ 0xe7, 0x4f, 0x53, 0xff, 0xe8, 0x57, 0x58, 0xff, 0xe9, 0x60, 0x5d, 0xff,
+ 0xea, 0x68, 0x62, 0xff, 0xe9, 0x73, 0x6a, 0xff, 0xea, 0x87, 0x7f, 0xff,
+ 0xeb, 0x9c, 0x94, 0xff, 0xec, 0xb1, 0xa9, 0xff, 0xfb, 0xb1, 0xa9, 0xff,
+ 0xfb, 0xb1, 0xa9, 0xff, 0xf3, 0x90, 0x90, 0xff, 0xf3, 0x90, 0x90, 0xff,
+ 0xf8, 0x7c, 0x7c, 0xff, 0xf8, 0x7c, 0x7c, 0xff, 0xf8, 0x7c, 0x7c, 0xff,
+ 0xf8, 0x7c, 0x7c, 0xff, 0xf2, 0x77, 0x79, 0xff, 0xf2, 0x75, 0x79, 0xff,
+ 0xf2, 0x73, 0x79, 0xff, 0xf2, 0x71, 0x79, 0xff, 0xe9, 0x73, 0x74, 0xff,
+ 0xec, 0x73, 0x73, 0xff, 0xef, 0x72, 0x72, 0xff, 0xf2, 0x72, 0x71, 0xff,
+ 0xed, 0x72, 0x6b, 0xff, 0xed, 0x70, 0x6b, 0xff, 0xed, 0x6d, 0x6b, 0xff,
+ 0xed, 0x6b, 0x6b, 0xff, 0xef, 0x6b, 0x70, 0xff, 0xef, 0x6b, 0x70, 0xff,
+ 0xef, 0x6b, 0x70, 0xff, 0xef, 0x6b, 0x70, 0xff, 0xeb, 0x69, 0x6d, 0xff,
+ 0xec, 0x71, 0x72, 0xff, 0xed, 0x7a, 0x77, 0xff, 0xee, 0x82, 0x7c, 0xff,
+ 0xec, 0x82, 0x7a, 0xff, 0xed, 0x97, 0x8f, 0xff, 0xee, 0xab, 0xa4, 0xff,
+ 0xef, 0xc0, 0xba, 0xff,
+ ]),
+};
+
+var img_32x32_rgb_punchthrough_etc2 = {
+ compressed: new Uint8Array([
+ 0x84, 0x94, 0xb4, 0x05, 0xf6, 0xff, 0x99, 0x00, 0x74, 0x84, 0xa4, 0x05,
+ 0xff, 0xf6, 0x08, 0x91, 0x5f, 0x6f, 0x8f, 0x00, 0xff, 0xff, 0x00, 0x00,
+ 0x4b, 0x5b, 0x6b, 0x00, 0xff, 0xfd, 0x20, 0x00, 0x56, 0x66, 0x6e, 0x00,
+ 0xdf, 0xfd, 0x00, 0x02, 0x0e, 0x67, 0x33, 0x54, 0xff, 0xb9, 0x00, 0xc4,
+ 0xeb, 0x78, 0x54, 0x61, 0xff, 0xff, 0x08, 0x00, 0x8b, 0x4b, 0x53, 0x00,
+ 0xff, 0xf7, 0x00, 0x00, 0xeb, 0x79, 0x44, 0x74, 0xff, 0xff, 0x80, 0x00,
+ 0x01, 0x10, 0x3f, 0x00, 0xfb, 0xb7, 0x00, 0x00, 0x10, 0x27, 0x3a, 0x00,
+ 0xff, 0xfb, 0x00, 0xc4, 0x05, 0x24, 0x00, 0x38, 0xff, 0xef, 0x00, 0x10,
+ 0x05, 0x13, 0x23, 0x50, 0xfe, 0xff, 0x00, 0x00, 0x41, 0x4c, 0x5c, 0x25,
+ 0xff, 0xa7, 0x00, 0xb0, 0x61, 0x43, 0x53, 0x00, 0xfe, 0xff, 0x01, 0x00,
+ 0x8b, 0x3b, 0x33, 0x01, 0xff, 0x9e, 0x00, 0x60, 0x0e, 0x79, 0x34, 0x71,
+ 0xff, 0xff, 0x80, 0x00, 0x18, 0x20, 0x58, 0x04, 0xbb, 0xbf, 0x04, 0x40,
+ 0x16, 0x25, 0x3d, 0x00, 0xff, 0xff, 0x00, 0x00, 0x03, 0x10, 0x2f, 0x00,
+ 0xff, 0xdf, 0x00, 0x60, 0x0c, 0x24, 0x21, 0x31, 0xee, 0xff, 0x00, 0x10,
+ 0x79, 0x3f, 0x50, 0x00, 0xff, 0xff, 0x00, 0x00, 0x93, 0x34, 0x34, 0x21,
+ 0xfa, 0xf7, 0x07, 0x08, 0xf9, 0x66, 0xc3, 0x31, 0xff, 0x3f, 0x00, 0xc0,
+ 0x74, 0x94, 0xa4, 0x00, 0xff, 0xff, 0x00, 0x00, 0x0f, 0x0f, 0x21, 0x00,
+ 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x22, 0x0d, 0x7f, 0x70, 0x08, 0x00,
+ 0x23, 0x28, 0x43, 0x00, 0xff, 0xf7, 0x00, 0x08, 0x6a, 0x3f, 0x6d, 0x04,
+ 0xe7, 0xef, 0x19, 0x00, 0xa6, 0x46, 0x56, 0x00, 0xf7, 0x77, 0x00, 0x00,
+ 0xc3, 0x08, 0x09, 0x00, 0xff, 0xfc, 0x00, 0x00, 0xef, 0x43, 0x4b, 0x00,
+ 0xff, 0xff, 0x00, 0x70, 0x6c, 0x74, 0x94, 0x00, 0xff, 0xff, 0x00, 0x00,
+ 0x21, 0x35, 0x57, 0x04, 0xf7, 0xcf, 0x88, 0x30, 0x06, 0x13, 0x33, 0x65,
+ 0x77, 0x77, 0x88, 0x00, 0x0e, 0x35, 0x42, 0x4c, 0xea, 0x3f, 0x11, 0x80,
+ 0x88, 0x64, 0x74, 0x01, 0xf2, 0xbb, 0x08, 0x00, 0x1c, 0x00, 0xa2, 0x24,
+ 0xf0, 0xff, 0x01, 0x00, 0xd2, 0x01, 0x01, 0x01, 0xff, 0xfc, 0x00, 0x04,
+ 0xe1, 0x3b, 0x3b, 0x00, 0xff, 0x1f, 0x00, 0x60, 0x58, 0x4f, 0x70, 0x01,
+ 0x7f, 0xff, 0x80, 0x00, 0x3b, 0x2d, 0x5f, 0x01, 0xfa, 0xff, 0x07, 0x10,
+ 0x6a, 0x2e, 0x55, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x30, 0x50, 0x00,
+ 0xff, 0xff, 0x00, 0x00, 0x15, 0x23, 0xb1, 0x11, 0xf2, 0xff, 0x0e, 0x00,
+ 0xdf, 0x00, 0x00, 0x01, 0xfc, 0xbf, 0x02, 0x20, 0xe0, 0x02, 0x0a, 0x00,
+ 0x7f, 0xff, 0x00, 0x00, 0xe0, 0x27, 0x27, 0x21, 0xff, 0xe8, 0x00, 0x10,
+ 0x90, 0x6e, 0x96, 0x01, 0xff, 0xff, 0xc0, 0x00, 0x8e, 0x3c, 0x5e, 0x00,
+ 0xef, 0xff, 0x00, 0x00, 0xf2, 0x22, 0x82, 0x51, 0xff, 0xff, 0x00, 0x01,
+ 0xb2, 0x17, 0x17, 0x01, 0xaa, 0xba, 0x45, 0x54, 0xc2, 0x0f, 0x08, 0x04,
+ 0x7e, 0xef, 0x80, 0x01, 0xd9, 0x09, 0x10, 0x00, 0xff, 0xb3, 0x00, 0x00,
+ 0xe0, 0x12, 0x1a, 0x01, 0x6c, 0xff, 0x10, 0x20, 0xef, 0x4b, 0x43, 0x00,
+ 0xff, 0xff, 0x00, 0x00, 0xb3, 0x53, 0x53, 0x01, 0xef, 0xff, 0x00, 0x00,
+ 0xc0, 0x40, 0x40, 0x00, 0xdd, 0xdd, 0x22, 0x22, 0xd0, 0x40, 0x40, 0x00,
+ 0xdd, 0xdd, 0x00, 0x00, 0xd8, 0x38, 0x38, 0x00, 0xfd, 0xdd, 0x00, 0x00,
+ 0xe0, 0x33, 0x3b, 0x01, 0xdb, 0xbf, 0x04, 0x40, 0xe0, 0x47, 0x4e, 0x00,
+ 0xdf, 0xff, 0x00, 0x00, 0xd8, 0x37, 0x3e, 0x00, 0xee, 0xdd, 0x10, 0x20,
+ 0xe0, 0x73, 0x6b, 0x00, 0xff, 0xff, 0x00, 0x00,
+ ]),
+ decompressed: new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x9c, 0xbd, 0xff,
+ 0x7c, 0x8c, 0xad, 0xff, 0x7b, 0x8c, 0xad, 0xff, 0x6b, 0x7c, 0x9d, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x5a, 0x6b, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x6b, 0x7c, 0xff,
+ 0x5a, 0x6b, 0x73, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x42, 0x52, 0x5a, 0xff, 0x66, 0x66, 0x77, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3e, 0x3e, 0x60, 0xff, 0x3e, 0x3e, 0x60, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x84, 0xa5, 0xff,
+ 0x52, 0x62, 0x83, 0xff, 0x52, 0x63, 0x84, 0xff, 0x41, 0x52, 0x73, 0xff,
+ 0x41, 0x52, 0x73, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x28, 0x28, 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x3e, 0x60, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x8c, 0x4a, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x17, 0x17, 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x33, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x5b, 0x6b, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x73, 0x62, 0x73, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x8c, 0x39, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x31, 0x39, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x94, 0x41, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x39, 0xff,
+ 0x08, 0x10, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, 0x18, 0x29, 0x41, 0xff,
+ 0x08, 0x19, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x4a, 0x29, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x5a, 0x52, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x39, 0x6c, 0xff,
+ 0x00, 0x10, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x19, 0x31, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x4a, 0x29, 0x39, 0xff, 0x39, 0x18, 0x28, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x1c, 0x0b, 0x2d, 0xff, 0x44, 0x22, 0x44, 0xff, 0x44, 0x22, 0x44, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xa5, 0x42, 0x42, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x20, 0x20, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x29, 0x62, 0xff, 0x29, 0x32, 0x6b, 0xff,
+ 0x18, 0x21, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x21, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb5, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd2, 0x39, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2d, 0x3e, 0x71, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb5, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xd2, 0x39, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x39, 0x6b, 0xff,
+ 0x6a, 0x20, 0x41, 0xff, 0x8c, 0x42, 0x63, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc6, 0x08, 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x3a, 0x42, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x08, 0x08, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe7, 0x3a, 0x42, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x08, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xe7, 0x3a, 0x42, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x31, 0xff,
+ 0x08, 0x08, 0x31, 0xff, 0x00, 0x00, 0x07, 0xff, 0x08, 0x08, 0x31, 0xff,
+ 0x29, 0x31, 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x8c, 0x42, 0x63, 0xff, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x42, 0x52, 0xff,
+ 0xa5, 0x42, 0x52, 0xff, 0x94, 0x31, 0x42, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x29, 0x39, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x6d, 0x4b, 0x6d, 0xff, 0x6d, 0x4b, 0x6d, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x63, 0x73, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xb5, 0x2d, 0x2d, 0xff, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x29, 0x39, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xef, 0x41, 0x41, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x66, 0x33, 0x55, 0xff, 0x66, 0x33, 0x55, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x8c, 0x42, 0x52, 0xff, 0x8c, 0x42, 0x52, 0xff,
+ 0x8c, 0x42, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0xdf, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x41, 0x41, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x29, 0x5b, 0xff,
+ 0x18, 0x07, 0x39, 0xff, 0x22, 0x11, 0x33, 0xff, 0x22, 0x11, 0x33, 0xff,
+ 0x43, 0x43, 0x76, 0xff, 0x43, 0x43, 0x76, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x6d, 0x4b, 0x6d, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x4a, 0x5a, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xcc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x31, 0x21, 0x52, 0xff, 0x41, 0x31, 0x62, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x99, 0x22, 0x33, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x21, 0x21, 0xff,
+ 0xf8, 0x32, 0x32, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x31, 0x21, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xb5, 0x0b, 0x0b, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xd6, 0x00, 0x00, 0xff, 0xe6, 0x08, 0x08, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe7, 0x21, 0x21, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x18, 0x5a, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x17, 0x17, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xe7, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x62, 0x4a, 0x7b, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe7, 0x10, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7b, 0x18, 0x4a, 0xff, 0x82, 0x1c, 0x4f, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xb5, 0x10, 0x10, 0xff, 0xad, 0x08, 0x08, 0xff, 0xbd, 0x18, 0x18, 0xff,
+ 0xb5, 0x10, 0x10, 0xff, 0xbe, 0x00, 0x00, 0xff, 0xc6, 0x08, 0x08, 0xff,
+ 0xd6, 0x00, 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x10, 0x18, 0xff,
+ 0xef, 0x18, 0x20, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xdf, 0x08, 0x10, 0xff, 0xe7, 0x10, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8c, 0x52, 0x7c, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xce, 0x10, 0x10, 0xff, 0xce, 0x10, 0x10, 0xff,
+ 0xce, 0x10, 0x10, 0xff, 0xce, 0x10, 0x10, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xde, 0x08, 0x10, 0xff, 0xde, 0x08, 0x10, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x8c, 0x52, 0x7c, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe7, 0x11, 0x19, 0xff, 0xde, 0x08, 0x10, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xe7, 0x21, 0x29, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x52, 0x52, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xde, 0x29, 0x29, 0xff, 0xe6, 0x31, 0x31, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x4a, 0x4a, 0xff,
+ 0xce, 0x4a, 0x4a, 0xff, 0xce, 0x4a, 0x4a, 0xff, 0xce, 0x4a, 0x4a, 0xff,
+ 0xd6, 0x42, 0x42, 0xff, 0xd6, 0x42, 0x42, 0xff, 0xd6, 0x42, 0x42, 0xff,
+ 0xd6, 0x42, 0x42, 0xff, 0xde, 0x39, 0x39, 0xff, 0xde, 0x39, 0x39, 0xff,
+ 0xde, 0x39, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x31, 0x39, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xe7, 0x39, 0x39, 0xff, 0xde, 0x31, 0x39, 0xff, 0xe6, 0x39, 0x41, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x52, 0x5a, 0xff,
+ 0xef, 0x52, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ ]),
+};
+
+var img_32x32_rgba_etc2 = {
+ compressed: new Uint8Array([
+ 0x04, 0x1d, 0x6d, 0x26, 0x91, 0x48, 0x84, 0x45, 0x8d, 0x9d, 0xb6, 0x4a,
+ 0xc4, 0x80, 0x83, 0x97, 0x0b, 0x12, 0x48, 0x94, 0x88, 0x44, 0x42, 0x25,
+ 0x64, 0x74, 0x95, 0x4b, 0xae, 0xa2, 0x91, 0x05, 0x15, 0x11, 0x68, 0x86,
+ 0x84, 0x44, 0x54, 0x26, 0x74, 0x85, 0xa7, 0x25, 0xfa, 0xa6, 0xff, 0x42,
+ 0x1b, 0x12, 0x68, 0x66, 0xa7, 0x66, 0xf6, 0x6f, 0x64, 0x74, 0x85, 0x49,
+ 0xae, 0xea, 0x89, 0xba, 0x1d, 0x12, 0x66, 0x76, 0xa7, 0x6a, 0x76, 0x86,
+ 0x64, 0x74, 0x7c, 0x4b, 0xa8, 0x8a, 0xa4, 0x81, 0x15, 0x11, 0x22, 0xf4,
+ 0x26, 0x44, 0x56, 0x84, 0x73, 0x73, 0x85, 0x29, 0xab, 0xa3, 0x3e, 0x2a,
+ 0x0b, 0x1b, 0x22, 0xf2, 0x25, 0x44, 0x44, 0x88, 0x75, 0x74, 0x86, 0x25,
+ 0xaa, 0x6e, 0x71, 0x11, 0x04, 0x1d, 0x22, 0xe4, 0x45, 0x48, 0x86, 0x91,
+ 0xbe, 0x7f, 0x04, 0x62, 0xbb, 0x6c, 0x86, 0xcf, 0x0b, 0x1b, 0x6d, 0x24,
+ 0x89, 0x44, 0x02, 0x25, 0x74, 0x74, 0x97, 0x48, 0xec, 0xf0, 0x50, 0xe6,
+ 0x1a, 0x10, 0x6d, 0x16, 0x88, 0x42, 0x63, 0x37, 0x21, 0x30, 0x5f, 0x4a,
+ 0xbd, 0xe8, 0x8e, 0x5b, 0x37, 0x21, 0x68, 0x86, 0x44, 0x42, 0x52, 0x2f,
+ 0x10, 0x27, 0x3a, 0x46, 0x8c, 0xe2, 0x87, 0x10, 0x4a, 0x3b, 0x64, 0x54,
+ 0x66, 0x42, 0x74, 0x2f, 0x1e, 0x18, 0x48, 0x07, 0x6b, 0x31, 0xe9, 0xa9,
+ 0x4b, 0x3a, 0x42, 0xf4, 0x2f, 0x46, 0x64, 0x66, 0x05, 0x13, 0x23, 0x57,
+ 0x66, 0xd6, 0x34, 0xc4, 0x38, 0x22, 0x33, 0x74, 0x2f, 0x46, 0x66, 0x84,
+ 0x43, 0x4e, 0x5c, 0x2b, 0xbd, 0xee, 0x59, 0xb4, 0x1f, 0x2b, 0x12, 0xf2,
+ 0x25, 0x44, 0x46, 0x88, 0x57, 0x44, 0x55, 0x45, 0x44, 0x2b, 0xa9, 0x01,
+ 0x0b, 0x1b, 0x12, 0xf2, 0x25, 0x44, 0x04, 0x89, 0x9a, 0x48, 0x41, 0x2e,
+ 0x00, 0x31, 0xf0, 0xc5, 0x10, 0x19, 0x6d, 0x24, 0x48, 0x22, 0x59, 0x77,
+ 0x6c, 0x7c, 0x9e, 0x4a, 0xfb, 0xf2, 0xd8, 0x58, 0x32, 0x22, 0x6d, 0x24,
+ 0x88, 0x22, 0x51, 0x77, 0x18, 0x20, 0x4a, 0x27, 0x6b, 0x90, 0x0e, 0x35,
+ 0x59, 0x42, 0x44, 0x02, 0x25, 0x12, 0xe9, 0x77, 0x00, 0x0b, 0x29, 0x2f,
+ 0xcc, 0x29, 0xf0, 0x87, 0x8c, 0x32, 0x68, 0x54, 0x66, 0x42, 0xf3, 0x37,
+ 0x03, 0x10, 0x2f, 0x26, 0x76, 0x48, 0x29, 0x19, 0x96, 0x4a, 0x42, 0xf4,
+ 0x2e, 0x46, 0x66, 0x45, 0x33, 0x18, 0x40, 0x26, 0x06, 0x76, 0x2e, 0x3e,
+ 0x71, 0x31, 0x12, 0xf2, 0x25, 0x44, 0x46, 0x88, 0xb9, 0x06, 0x32, 0x2b,
+ 0x02, 0x13, 0x10, 0x03, 0x38, 0x22, 0x9b, 0xf1, 0x2e, 0x44, 0x46, 0x91,
+ 0x49, 0x15, 0xd0, 0x06, 0xcc, 0xe9, 0x02, 0x33, 0x15, 0x11, 0x97, 0x70,
+ 0x25, 0x44, 0x06, 0x91, 0x6a, 0x06, 0x6b, 0x33, 0xf1, 0x05, 0x01, 0xff,
+ 0x15, 0x17, 0x6d, 0xb4, 0x49, 0x12, 0x4d, 0xff, 0x74, 0x95, 0xa6, 0x2c,
+ 0x70, 0xf0, 0xbe, 0x5c, 0x40, 0x24, 0x6d, 0xb4, 0x49, 0x12, 0x4d, 0xbf,
+ 0x1d, 0x1d, 0x32, 0x4e, 0xfe, 0xf6, 0x4c, 0xe8, 0x7f, 0x4b, 0x69, 0x22,
+ 0x00, 0x92, 0xdb, 0xbf, 0x00, 0x01, 0x37, 0x2a, 0x0c, 0x63, 0x0c, 0x6b,
+ 0xc7, 0x32, 0x68, 0x94, 0x24, 0x13, 0x69, 0xbf, 0x23, 0x28, 0x43, 0x26,
+ 0x03, 0x11, 0xea, 0xd1, 0xd9, 0x32, 0x33, 0x73, 0x2e, 0x42, 0x46, 0x89,
+ 0x63, 0x30, 0x66, 0x46, 0x05, 0x23, 0x5b, 0xa1, 0x95, 0x4b, 0xbb, 0xf1,
+ 0x2d, 0x24, 0x06, 0x92, 0xf3, 0x12, 0x93, 0x46, 0x0b, 0x57, 0x06, 0xa8,
+ 0x4b, 0x3a, 0xdb, 0xf9, 0x2d, 0x20, 0x04, 0x92, 0x60, 0x86, 0x04, 0xf6,
+ 0x18, 0x46, 0x80, 0x00, 0x1c, 0x12, 0xdf, 0xf9, 0x2d, 0x44, 0x96, 0xdb,
+ 0x72, 0xa6, 0x0d, 0x73, 0x8b, 0x2f, 0x64, 0x48, 0x15, 0x17, 0x6d, 0xb2,
+ 0x52, 0x90, 0x0f, 0xf5, 0x50, 0x6c, 0x85, 0x6b, 0xec, 0x00, 0xc0, 0x1f,
+ 0x3d, 0x21, 0x49, 0xb0, 0x09, 0x92, 0x0f, 0xb5, 0x31, 0x40, 0x63, 0x6c,
+ 0x71, 0xfc, 0x2d, 0x09, 0x7d, 0x34, 0x49, 0xb0, 0x0a, 0xb2, 0x0f, 0xf4,
+ 0x07, 0x01, 0x33, 0x6b, 0x6f, 0x73, 0xa1, 0x33, 0xbb, 0x5a, 0x00, 0xab,
+ 0x01, 0xd6, 0x0f, 0xa8, 0xeb, 0x35, 0x53, 0x5a, 0x02, 0x7f, 0x31, 0x83,
+ 0xc7, 0x32, 0xfa, 0x1f, 0xa1, 0xd4, 0x28, 0x13, 0x7b, 0x55, 0x67, 0x27,
+ 0x84, 0x6f, 0x61, 0x29, 0x91, 0x4b, 0xfa, 0xcb, 0x20, 0x00, 0xa4, 0x9b,
+ 0x51, 0x05, 0x68, 0x8b, 0xfe, 0x00, 0xfe, 0x21, 0x4a, 0x21, 0xff, 0x5b,
+ 0x20, 0x00, 0x94, 0x9b, 0xe0, 0x01, 0x09, 0x22, 0x0c, 0x1f, 0x70, 0x03,
+ 0x1b, 0x12, 0xff, 0xeb, 0x60, 0x25, 0x26, 0xdb, 0x72, 0x9e, 0x0c, 0x7a,
+ 0xa1, 0x2f, 0x43, 0x87, 0x0d, 0x19, 0x29, 0x20, 0x09, 0xb0, 0x0f, 0xac,
+ 0x77, 0x6d, 0x8f, 0x4a, 0xff, 0x70, 0x36, 0x3e, 0x2f, 0x21, 0x29, 0xb0,
+ 0x4a, 0x80, 0x1d, 0x60, 0x0e, 0x15, 0x43, 0x67, 0x13, 0x33, 0x62, 0xfc,
+ 0x59, 0x49, 0x05, 0x38, 0x0a, 0xb0, 0x1d, 0x60, 0xb8, 0x04, 0xb1, 0xb3,
+ 0x31, 0xcf, 0x01, 0x11, 0x7d, 0x34, 0x81, 0x3d, 0x0b, 0xf4, 0x2f, 0x42,
+ 0x83, 0x44, 0x64, 0x47, 0x96, 0x18, 0x80, 0x5c, 0x84, 0x37, 0xf4, 0x3f,
+ 0x0b, 0xd0, 0xba, 0x13, 0x58, 0x14, 0xc9, 0x1a, 0x01, 0x77, 0x72, 0x08,
+ 0x63, 0x4b, 0xf6, 0x0d, 0x01, 0x80, 0xa0, 0x53, 0xd9, 0x0f, 0x08, 0x42,
+ 0xef, 0xef, 0x89, 0x03, 0x37, 0x22, 0xfa, 0x0b, 0x02, 0x05, 0x34, 0x9b,
+ 0x74, 0x80, 0x04, 0xf7, 0x14, 0x3f, 0x00, 0x42, 0x15, 0x11, 0xd6, 0x08,
+ 0x01, 0x05, 0x24, 0x9b, 0x74, 0x9c, 0x07, 0xf7, 0x9b, 0x2f, 0x43, 0x47,
+ 0x0a, 0x12, 0x49, 0x22, 0x52, 0x04, 0xa8, 0x01, 0x98, 0x84, 0xa5, 0x0e,
+ 0xf1, 0xd2, 0x10, 0xec, 0x14, 0x11, 0x05, 0x38, 0x0a, 0xb0, 0x1f, 0x60,
+ 0xb8, 0xbc, 0xfa, 0xc2, 0x10, 0x85, 0xc8, 0xd2, 0x2f, 0x21, 0x05, 0x38,
+ 0x0b, 0xa0, 0xad, 0x01, 0x51, 0x05, 0x41, 0x2a, 0x01, 0x11, 0x30, 0x6f,
+ 0x39, 0x3b, 0xb0, 0xad, 0x02, 0xf4, 0x1f, 0x41, 0xb3, 0x10, 0x10, 0x03,
+ 0x24, 0x57, 0x8b, 0x3a, 0x3d, 0x21, 0xf0, 0x2f, 0x02, 0xd0, 0x2d, 0x0b,
+ 0xca, 0x08, 0x10, 0x22, 0x73, 0x33, 0x9f, 0x89, 0x30, 0x22, 0xf4, 0x1d,
+ 0x02, 0xa0, 0xa8, 0x53, 0x6c, 0x80, 0x05, 0x72, 0x04, 0x0e, 0xe2, 0x46,
+ 0x1f, 0x2b, 0xb0, 0x18, 0x0a, 0x05, 0x32, 0x9b, 0x70, 0x80, 0x04, 0x76,
+ 0x1c, 0x56, 0xe2, 0x03, 0x0b, 0x12, 0xb0, 0x18, 0x09, 0x05, 0x22, 0x92,
+ 0x74, 0xa6, 0x0c, 0xfa, 0xa5, 0x37, 0x0a, 0x50, 0x04, 0x1d, 0x4d, 0xb4,
+ 0x9b, 0x29, 0x30, 0x52, 0xdf, 0x94, 0x8d, 0x4a, 0x73, 0x31, 0xb9, 0x9c,
+ 0x0f, 0x11, 0x4d, 0xb2, 0x9b, 0x29, 0x30, 0x53, 0xd2, 0x53, 0x53, 0x47,
+ 0x77, 0x77, 0x99, 0x88, 0x0d, 0x19, 0x80, 0xaa, 0x0a, 0xd0, 0x2f, 0x41,
+ 0x64, 0xae, 0x0d, 0xe6, 0x26, 0x5f, 0xf1, 0xe4, 0x11, 0x12, 0xd0, 0xaf,
+ 0x42, 0xf4, 0x2f, 0x82, 0x6a, 0xa0, 0x0c, 0xf2, 0x1e, 0x47, 0x71, 0xe3,
+ 0x19, 0x10, 0xa1, 0x3a, 0x13, 0xa1, 0x38, 0x53, 0x72, 0xa2, 0x0c, 0xf3,
+ 0x18, 0x4f, 0x71, 0xa0, 0x10, 0x19, 0xf0, 0x2d, 0x0a, 0xa0, 0xb8, 0x53,
+ 0x70, 0x9c, 0x0c, 0x72, 0x1c, 0x47, 0x90, 0xa2, 0x0b, 0x1b, 0xa0, 0xa8,
+ 0x0a, 0x05, 0x32, 0x93, 0x6e, 0x9a, 0x0c, 0x72, 0x3c, 0x6f, 0x70, 0x61,
+ 0x04, 0x1d, 0xa0, 0xa0, 0x52, 0x29, 0x34, 0x9b, 0x70, 0x54, 0x15, 0x73,
+ 0xa7, 0x3f, 0x72, 0x22,
+ ]),
+ decompressed: new Uint8Array([
+ 0xa9, 0xb9, 0xd2, 0x00, 0xa9, 0xb9, 0xd2, 0x00, 0x90, 0xa1, 0xc2, 0x01,
+ 0x7c, 0x8d, 0xae, 0x01, 0x80, 0x90, 0xb1, 0x03, 0x6c, 0x7c, 0x9d, 0x03,
+ 0x80, 0x90, 0xb1, 0x03, 0x80, 0x90, 0xb1, 0x06, 0x7c, 0x8d, 0xaf, 0x08,
+ 0x7c, 0x8d, 0xaf, 0x08, 0x88, 0x99, 0xbb, 0x0b, 0x66, 0x77, 0x99, 0x0b,
+ 0x6f, 0x80, 0x91, 0x0e, 0x83, 0x94, 0xa5, 0x0e, 0x83, 0x94, 0xa5, 0x0e,
+ 0x6f, 0x80, 0x91, 0x0e, 0x80, 0x90, 0x98, 0x10, 0x6c, 0x7c, 0x84, 0x10,
+ 0x6c, 0x7c, 0x84, 0x10, 0x6c, 0x7c, 0x84, 0x10, 0x72, 0x72, 0x83, 0x0e,
+ 0x7c, 0x7c, 0x8d, 0x0b, 0x72, 0x72, 0x83, 0x0b, 0x88, 0x88, 0x99, 0x08,
+ 0x88, 0x88, 0x99, 0x06, 0x88, 0x88, 0x99, 0x06, 0x88, 0x88, 0x99, 0x04,
+ 0x88, 0x88, 0x99, 0x04, 0x7d, 0x7e, 0x82, 0x02, 0x8f, 0x8d, 0x8f, 0x01,
+ 0xa0, 0x9d, 0x9c, 0x01, 0xb2, 0xac, 0xa9, 0x00, 0xa9, 0xb9, 0xd2, 0x00,
+ 0x95, 0xa5, 0xbe, 0x01, 0x90, 0xa1, 0xc2, 0x01, 0x7c, 0x8d, 0xae, 0x02,
+ 0x5a, 0x6a, 0x8b, 0x03, 0x5a, 0x6a, 0x8b, 0x03, 0x5a, 0x6a, 0x8b, 0x06,
+ 0x5a, 0x6a, 0x8b, 0x09, 0x66, 0x77, 0x99, 0x0b, 0x72, 0x83, 0xa5, 0x0b,
+ 0x66, 0x77, 0x99, 0x0e, 0x66, 0x77, 0x99, 0x12, 0x49, 0x5a, 0x6b, 0x13,
+ 0x49, 0x5a, 0x6b, 0x13, 0x5d, 0x6e, 0x7f, 0x16, 0x5d, 0x6e, 0x7f, 0x16,
+ 0x5a, 0x6a, 0x72, 0x18, 0x6c, 0x7c, 0x84, 0x15, 0x6c, 0x7c, 0x84, 0x15,
+ 0x46, 0x56, 0x5e, 0x15, 0x66, 0x66, 0x77, 0x12, 0x66, 0x66, 0x77, 0x12,
+ 0x66, 0x66, 0x77, 0x0e, 0x66, 0x66, 0x77, 0x0b, 0x72, 0x72, 0x83, 0x09,
+ 0x72, 0x72, 0x83, 0x09, 0x72, 0x72, 0x83, 0x06, 0x66, 0x66, 0x77, 0x04,
+ 0x82, 0x6c, 0x71, 0x03, 0x94, 0x7b, 0x7e, 0x02, 0xa5, 0x8b, 0x8b, 0x01,
+ 0xb7, 0x9a, 0x98, 0x01, 0xa9, 0xb9, 0xd2, 0x01, 0x95, 0xa5, 0xbe, 0x01,
+ 0x6a, 0x7b, 0x9c, 0x02, 0x6a, 0x7b, 0x9c, 0x03, 0x5f, 0x6f, 0x98, 0x06,
+ 0x4b, 0x5b, 0x84, 0x06, 0x39, 0x49, 0x72, 0x09, 0x4b, 0x5b, 0x84, 0x0c,
+ 0x3f, 0x50, 0x72, 0x0e, 0x55, 0x66, 0x88, 0x12, 0x55, 0x66, 0x88, 0x12,
+ 0x33, 0x44, 0x66, 0x17, 0x4d, 0x4d, 0x5e, 0x19, 0x3b, 0x3b, 0x4c, 0x1c,
+ 0x3b, 0x3b, 0x4c, 0x1f, 0x4d, 0x4d, 0x5e, 0x1f, 0x4b, 0x5b, 0x63, 0x1e,
+ 0x4b, 0x5b, 0x63, 0x1e, 0x5f, 0x6f, 0x77, 0x1e, 0x4b, 0x5b, 0x63, 0x1b,
+ 0x3c, 0x3c, 0x5e, 0x1b, 0x3c, 0x3c, 0x5e, 0x17, 0x50, 0x50, 0x72, 0x12,
+ 0x3c, 0x3c, 0x5e, 0x12, 0x50, 0x3f, 0x61, 0x0f, 0x50, 0x3f, 0x61, 0x0c,
+ 0x5a, 0x49, 0x6b, 0x09, 0x66, 0x55, 0x77, 0x06, 0x88, 0x5a, 0x5f, 0x05,
+ 0x99, 0x69, 0x6c, 0x03, 0xab, 0x79, 0x79, 0x02, 0xbc, 0x88, 0x86, 0x01,
+ 0x95, 0xa5, 0xbe, 0x01, 0x6f, 0x7f, 0x98, 0x02, 0x7c, 0x8d, 0xae, 0x03,
+ 0x56, 0x67, 0x88, 0x05, 0x4b, 0x5b, 0x84, 0x06, 0x39, 0x49, 0x72, 0x09,
+ 0x39, 0x49, 0x72, 0x0c, 0x25, 0x35, 0x5e, 0x0f, 0x49, 0x5a, 0x7c, 0x12,
+ 0x3f, 0x50, 0x72, 0x17, 0x33, 0x44, 0x66, 0x1b, 0x33, 0x44, 0x66, 0x1e,
+ 0x27, 0x27, 0x38, 0x22, 0x27, 0x27, 0x38, 0x27, 0x27, 0x27, 0x38, 0x27,
+ 0x27, 0x27, 0x38, 0x27, 0x39, 0x49, 0x51, 0x29, 0x25, 0x35, 0x3d, 0x29,
+ 0x39, 0x49, 0x51, 0x29, 0x25, 0x35, 0x3d, 0x24, 0x50, 0x50, 0x72, 0x21,
+ 0x2a, 0x2a, 0x4c, 0x1e, 0x16, 0x16, 0x38, 0x1b, 0x2a, 0x2a, 0x4c, 0x17,
+ 0x50, 0x3f, 0x61, 0x14, 0x5a, 0x49, 0x6b, 0x0f, 0x50, 0x3f, 0x61, 0x0c,
+ 0x50, 0x3f, 0x61, 0x09, 0x8d, 0x48, 0x4e, 0x06, 0x9e, 0x57, 0x5b, 0x05,
+ 0xb0, 0x67, 0x68, 0x03, 0xc1, 0x76, 0x75, 0x02, 0x80, 0x80, 0xa2, 0x01,
+ 0x6e, 0x6e, 0x90, 0x04, 0x4d, 0x4d, 0x80, 0x04, 0x61, 0x61, 0x94, 0x06,
+ 0x3e, 0x4e, 0x77, 0x0b, 0x3e, 0x4e, 0x77, 0x0b, 0x20, 0x28, 0x49, 0x11,
+ 0x20, 0x28, 0x49, 0x14, 0x19, 0x2a, 0x42, 0x1d, 0x2d, 0x3e, 0x56, 0x1d,
+ 0x21, 0x29, 0x5b, 0x23, 0x15, 0x1d, 0x4f, 0x29, 0x10, 0x10, 0x42, 0x2c,
+ 0x16, 0x16, 0x48, 0x35, 0x10, 0x10, 0x42, 0x35, 0x1a, 0x1a, 0x4c, 0x35,
+ 0x11, 0x11, 0x33, 0x33, 0x22, 0x33, 0x55, 0x33, 0x11, 0x11, 0x33, 0x33,
+ 0x32, 0x43, 0x65, 0x33, 0x47, 0x4f, 0x5f, 0x2e, 0x53, 0x5b, 0x6b, 0x28,
+ 0x31, 0x39, 0x49, 0x28, 0x31, 0x39, 0x49, 0x1e, 0x38, 0x27, 0x38, 0x1b,
+ 0x5e, 0x4d, 0x5e, 0x15, 0x72, 0x61, 0x72, 0x11, 0x5e, 0x4d, 0x5e, 0x0b,
+ 0x8b, 0x39, 0x31, 0x09, 0x97, 0x45, 0x3d, 0x06, 0xba, 0x57, 0x57, 0x04,
+ 0xd7, 0x74, 0x74, 0x04, 0x94, 0x94, 0xb6, 0x01, 0x5a, 0x5a, 0x7c, 0x04,
+ 0x4d, 0x4d, 0x80, 0x06, 0x3b, 0x3b, 0x6e, 0x09, 0x3e, 0x4e, 0x77, 0x0b,
+ 0x18, 0x28, 0x51, 0x11, 0x46, 0x4e, 0x6f, 0x17, 0x20, 0x28, 0x49, 0x1c,
+ 0x07, 0x18, 0x30, 0x23, 0x07, 0x18, 0x30, 0x29, 0x21, 0x29, 0x5b, 0x31,
+ 0x15, 0x1d, 0x4f, 0x31, 0x1a, 0x1a, 0x4c, 0x3b, 0x10, 0x10, 0x42, 0x3b,
+ 0x16, 0x16, 0x48, 0x44, 0x10, 0x10, 0x42, 0x44, 0x22, 0x33, 0x55, 0x45,
+ 0x11, 0x11, 0x33, 0x45, 0x22, 0x33, 0x55, 0x3f, 0x12, 0x23, 0x45, 0x3f,
+ 0x3d, 0x45, 0x55, 0x3a, 0x31, 0x39, 0x49, 0x34, 0x47, 0x4f, 0x5f, 0x2e,
+ 0x3d, 0x45, 0x55, 0x28, 0x4c, 0x3b, 0x4c, 0x21, 0x4c, 0x3b, 0x4c, 0x1b,
+ 0x5e, 0x4d, 0x5e, 0x15, 0x72, 0x61, 0x72, 0x11, 0xa1, 0x4f, 0x47, 0x0c,
+ 0x97, 0x45, 0x3d, 0x09, 0xba, 0x57, 0x57, 0x06, 0xd7, 0x74, 0x74, 0x04,
+ 0x94, 0x94, 0xb6, 0x04, 0x5a, 0x5a, 0x7c, 0x06, 0x3b, 0x3b, 0x6e, 0x09,
+ 0x27, 0x27, 0x5a, 0x0c, 0x2a, 0x3a, 0x63, 0x11, 0x04, 0x14, 0x3d, 0x14,
+ 0x0c, 0x14, 0x35, 0x1c, 0x32, 0x3a, 0x5b, 0x22, 0x19, 0x2a, 0x42, 0x29,
+ 0x07, 0x18, 0x30, 0x31, 0x00, 0x07, 0x39, 0x3b, 0x15, 0x1d, 0x4f, 0x43,
+ 0x0d, 0x1d, 0x4f, 0x44, 0x0d, 0x1d, 0x4f, 0x4d, 0x0d, 0x1d, 0x4f, 0x4d,
+ 0x00, 0x07, 0x39, 0x56, 0x12, 0x23, 0x45, 0x54, 0x12, 0x23, 0x45, 0x54,
+ 0x12, 0x23, 0x45, 0x4e, 0x22, 0x33, 0x55, 0x4e, 0x3d, 0x1c, 0x1c, 0x46,
+ 0x51, 0x30, 0x30, 0x40, 0x51, 0x30, 0x30, 0x3a, 0x77, 0x56, 0x56, 0x34,
+ 0x7c, 0x49, 0x5a, 0x27, 0x7c, 0x49, 0x5a, 0x21, 0x72, 0x3f, 0x50, 0x1b,
+ 0x72, 0x3f, 0x50, 0x15, 0xad, 0x5b, 0x53, 0x0f, 0xad, 0x5b, 0x53, 0x0c,
+ 0xba, 0x57, 0x57, 0x09, 0xd7, 0x74, 0x74, 0x06, 0x80, 0x80, 0xa2, 0x04,
+ 0x5a, 0x5a, 0x7c, 0x06, 0x3b, 0x3b, 0x6e, 0x09, 0x3b, 0x3b, 0x6e, 0x0f,
+ 0x04, 0x14, 0x3d, 0x14, 0x18, 0x28, 0x51, 0x17, 0x0c, 0x14, 0x35, 0x22,
+ 0x0c, 0x14, 0x35, 0x28, 0x19, 0x2a, 0x42, 0x31, 0x07, 0x18, 0x30, 0x3b,
+ 0x0b, 0x13, 0x45, 0x43, 0x00, 0x07, 0x39, 0x4f, 0x19, 0x29, 0x5b, 0x56,
+ 0x19, 0x29, 0x5b, 0x5c, 0x00, 0x07, 0x39, 0x65, 0x19, 0x29, 0x5b, 0x65,
+ 0x11, 0x11, 0x33, 0x66, 0x12, 0x23, 0x45, 0x66, 0x11, 0x11, 0x33, 0x60,
+ 0x11, 0x11, 0x33, 0x60, 0x51, 0x30, 0x30, 0x50, 0x3d, 0x1c, 0x1c, 0x50,
+ 0x3d, 0x1c, 0x1c, 0x46, 0x51, 0x30, 0x30, 0x3a, 0x72, 0x3f, 0x50, 0x31,
+ 0x7c, 0x49, 0x5a, 0x27, 0x88, 0x55, 0x66, 0x21, 0x88, 0x55, 0x66, 0x1b,
+ 0xa1, 0x4f, 0x47, 0x14, 0xad, 0x5b, 0x53, 0x0f, 0xba, 0x57, 0x57, 0x09,
+ 0xd7, 0x74, 0x74, 0x06, 0x74, 0x84, 0xa5, 0x06, 0x4e, 0x5e, 0x7f, 0x08,
+ 0x41, 0x51, 0x83, 0x0b, 0x2d, 0x3d, 0x6f, 0x11, 0x29, 0x32, 0x5b, 0x18,
+ 0x07, 0x10, 0x39, 0x22, 0x13, 0x1c, 0x45, 0x28, 0x1d, 0x26, 0x4f, 0x2e,
+ 0x00, 0x00, 0x18, 0x39, 0x05, 0x0d, 0x2e, 0x45, 0x05, 0x0d, 0x2e, 0x51,
+ 0x11, 0x19, 0x3a, 0x5d, 0x11, 0x21, 0x3a, 0x65, 0x11, 0x21, 0x3a, 0x74,
+ 0x29, 0x21, 0x32, 0x74, 0x13, 0x0b, 0x1c, 0x7d, 0x36, 0x1d, 0x47, 0x76,
+ 0x20, 0x07, 0x31, 0x76, 0x4f, 0x1d, 0x47, 0x76, 0x4f, 0x1d, 0x47, 0x6e,
+ 0x56, 0x34, 0x45, 0x68, 0x76, 0x54, 0x65, 0x5c, 0x87, 0x32, 0x54, 0x53,
+ 0x67, 0x12, 0x34, 0x4a, 0x93, 0x00, 0x00, 0x3a, 0x82, 0x1c, 0x1c, 0x34,
+ 0xb0, 0x4a, 0x4a, 0x28, 0xb0, 0x4a, 0x4a, 0x1e, 0xd2, 0x5b, 0x5b, 0x17,
+ 0xd2, 0x39, 0x39, 0x12, 0xd2, 0x5b, 0x5b, 0x0b, 0xe8, 0x71, 0x71, 0x08,
+ 0x62, 0x72, 0x93, 0x06, 0x62, 0x72, 0x93, 0x0b, 0x41, 0x51, 0x83, 0x0e,
+ 0x41, 0x51, 0x83, 0x14, 0x1d, 0x26, 0x4f, 0x18, 0x29, 0x32, 0x5b, 0x22,
+ 0x07, 0x10, 0x39, 0x2e, 0x13, 0x1c, 0x45, 0x3a, 0x11, 0x19, 0x3a, 0x45,
+ 0x00, 0x03, 0x24, 0x51, 0x05, 0x0d, 0x2e, 0x5d, 0x11, 0x19, 0x3a, 0x69,
+ 0x05, 0x15, 0x2e, 0x74, 0x05, 0x15, 0x2e, 0x7d, 0x13, 0x0b, 0x1c, 0x86,
+ 0x07, 0x00, 0x10, 0x8f, 0x20, 0x07, 0x31, 0x8e, 0x20, 0x07, 0x31, 0x8e,
+ 0x39, 0x07, 0x31, 0x86, 0x5b, 0x29, 0x53, 0x86, 0x56, 0x34, 0x45, 0x77,
+ 0x87, 0x32, 0x54, 0x68, 0x76, 0x54, 0x65, 0x5c, 0x87, 0x32, 0x54, 0x53,
+ 0x82, 0x1c, 0x1c, 0x46, 0x93, 0x00, 0x00, 0x3a, 0x82, 0x1c, 0x1c, 0x2e,
+ 0xb0, 0x4a, 0x4a, 0x28, 0xd2, 0x39, 0x39, 0x1b, 0xd2, 0x39, 0x39, 0x12,
+ 0xe8, 0x4f, 0x4f, 0x0e, 0xe8, 0x71, 0x71, 0x0b, 0x74, 0x84, 0xa5, 0x08,
+ 0x4e, 0x5e, 0x7f, 0x0b, 0x53, 0x63, 0x95, 0x11, 0x2d, 0x3d, 0x6f, 0x17,
+ 0x29, 0x32, 0x6b, 0x22, 0x1d, 0x26, 0x5f, 0x28, 0x29, 0x32, 0x6b, 0x34,
+ 0x13, 0x1c, 0x55, 0x40, 0x2a, 0x4b, 0x5b, 0x51, 0x0d, 0x2e, 0x3e, 0x5d,
+ 0x00, 0x14, 0x24, 0x69, 0x00, 0x00, 0x07, 0x75, 0x05, 0x15, 0x2e, 0x86,
+ 0x00, 0x0b, 0x24, 0x8f, 0x13, 0x0b, 0x1c, 0x98, 0x13, 0x0b, 0x1c, 0xa1,
+ 0x20, 0x07, 0x31, 0xa2, 0x2c, 0x13, 0x3d, 0xa2, 0x39, 0x07, 0x31, 0x9a,
+ 0x4f, 0x1d, 0x47, 0x8e, 0x87, 0x32, 0x54, 0x83, 0x87, 0x32, 0x54, 0x77,
+ 0x87, 0x32, 0x54, 0x68, 0x87, 0x32, 0x54, 0x5c, 0xb0, 0x4a, 0x4a, 0x50,
+ 0xc1, 0x17, 0x17, 0x40, 0xc1, 0x17, 0x17, 0x34, 0xc1, 0x17, 0x17, 0x28,
+ 0xd2, 0x5b, 0x5b, 0x1e, 0xd2, 0x39, 0x39, 0x17, 0xe8, 0x4f, 0x4f, 0x12,
+ 0xe8, 0x71, 0x71, 0x0b, 0x88, 0x98, 0xb9, 0x08, 0x62, 0x72, 0x93, 0x0e,
+ 0x2d, 0x3d, 0x6f, 0x14, 0x2d, 0x3d, 0x6f, 0x19, 0x1d, 0x26, 0x5f, 0x22,
+ 0x13, 0x1c, 0x55, 0x2e, 0x07, 0x10, 0x49, 0x3a, 0x1d, 0x26, 0x5f, 0x4a,
+ 0x00, 0x14, 0x24, 0x51, 0x2a, 0x4b, 0x5b, 0x69, 0x00, 0x14, 0x24, 0x75,
+ 0x00, 0x00, 0x07, 0x89, 0x00, 0x00, 0x18, 0x98, 0x05, 0x15, 0x2e, 0xa1,
+ 0x29, 0x21, 0x32, 0xb0, 0x1d, 0x15, 0x26, 0xb0, 0x42, 0x29, 0x53, 0xba,
+ 0x36, 0x1d, 0x47, 0xb2, 0x5b, 0x29, 0x53, 0xb2, 0x4f, 0x1d, 0x47, 0xa2,
+ 0x87, 0x32, 0x54, 0x95, 0x87, 0x32, 0x54, 0x83, 0x87, 0x32, 0x54, 0x77,
+ 0x87, 0x32, 0x54, 0x68, 0xc1, 0x17, 0x17, 0x50, 0xc1, 0x17, 0x17, 0x46,
+ 0xc1, 0x17, 0x17, 0x3a, 0xc1, 0x17, 0x17, 0x2e, 0xd2, 0x39, 0x39, 0x21,
+ 0xd2, 0x39, 0x39, 0x1b, 0xe8, 0x4f, 0x4f, 0x12, 0xe8, 0x71, 0x71, 0x0e,
+ 0x7c, 0x9e, 0xaf, 0x0a, 0x66, 0x88, 0x99, 0x0d, 0x51, 0x62, 0x73, 0x12,
+ 0x1a, 0x2b, 0x3c, 0x1c, 0x21, 0x21, 0x3a, 0x28, 0x0f, 0x0f, 0x28, 0x30,
+ 0x0d, 0x0d, 0x4f, 0x3a, 0x00, 0x00, 0x35, 0x4e, 0x00, 0x00, 0x20, 0x57,
+ 0x05, 0x05, 0x36, 0x6b, 0x09, 0x11, 0x32, 0x83, 0x09, 0x11, 0x32, 0x8f,
+ 0x10, 0x18, 0x31, 0xa0, 0x10, 0x18, 0x31, 0xaf, 0x34, 0x24, 0x55, 0xc1,
+ 0x3e, 0x2e, 0x5f, 0xca, 0x46, 0x14, 0x46, 0xca, 0x6c, 0x3a, 0x6c, 0xca,
+ 0x6a, 0x20, 0x41, 0xc1, 0x8c, 0x42, 0x63, 0xb2, 0x99, 0x33, 0x44, 0xa5,
+ 0x99, 0x33, 0x44, 0x8d, 0x99, 0x33, 0x44, 0x81, 0xbb, 0x11, 0x22, 0x6d,
+ 0xc3, 0x06, 0x04, 0x60, 0xcd, 0x0b, 0x0b, 0x4e, 0xd7, 0x0f, 0x12, 0x3f,
+ 0xe1, 0x14, 0x19, 0x33, 0xe7, 0x26, 0x28, 0x23, 0xe7, 0x3f, 0x44, 0x1d,
+ 0xe7, 0x59, 0x5f, 0x14, 0xe7, 0x72, 0x7b, 0x0f, 0x7c, 0x9e, 0xaf, 0x0a,
+ 0x72, 0x94, 0xa5, 0x10, 0x6e, 0x7f, 0x90, 0x17, 0x1a, 0x2b, 0x3c, 0x1f,
+ 0x0f, 0x0f, 0x28, 0x28, 0x00, 0x00, 0x14, 0x34, 0x00, 0x00, 0x35, 0x44,
+ 0x00, 0x00, 0x35, 0x4e, 0x00, 0x00, 0x20, 0x63, 0x00, 0x00, 0x20, 0x77,
+ 0x09, 0x11, 0x32, 0x83, 0x09, 0x11, 0x32, 0x97, 0x26, 0x2e, 0x47, 0xaf,
+ 0x26, 0x2e, 0x47, 0xc1, 0x28, 0x18, 0x49, 0xca, 0x4a, 0x3a, 0x6b, 0xdc,
+ 0x5a, 0x28, 0x5a, 0xdc, 0x46, 0x14, 0x46, 0xdc, 0x8c, 0x42, 0x63, 0xd3,
+ 0x80, 0x36, 0x57, 0xc1, 0x99, 0x33, 0x44, 0xad, 0xa4, 0x3e, 0x4f, 0x99,
+ 0x8e, 0x28, 0x39, 0x81, 0xbb, 0x11, 0x22, 0x79, 0xc7, 0x05, 0x03, 0x60,
+ 0xd1, 0x09, 0x0a, 0x4e, 0xdb, 0x0e, 0x11, 0x45, 0xe5, 0x12, 0x18, 0x33,
+ 0xe9, 0x25, 0x26, 0x28, 0xe9, 0x3e, 0x42, 0x1d, 0xe9, 0x58, 0x5d, 0x17,
+ 0xe9, 0x71, 0x79, 0x0f, 0x88, 0xaa, 0xbb, 0x0a, 0x66, 0x88, 0x99, 0x10,
+ 0x6e, 0x7f, 0x90, 0x17, 0x37, 0x48, 0x59, 0x1f, 0x0f, 0x0f, 0x28, 0x28,
+ 0x00, 0x00, 0x14, 0x34, 0x00, 0x00, 0x18, 0x44, 0x00, 0x00, 0x18, 0x56,
+ 0x05, 0x05, 0x36, 0x63, 0x00, 0x00, 0x20, 0x77, 0x00, 0x00, 0x0c, 0x8f,
+ 0x09, 0x11, 0x32, 0xa3, 0x26, 0x2e, 0x47, 0xb8, 0x32, 0x3a, 0x53, 0xca,
+ 0x3e, 0x2e, 0x5f, 0xdc, 0x4a, 0x3a, 0x6b, 0xeb, 0x6c, 0x3a, 0x6c, 0xee,
+ 0x6c, 0x3a, 0x6c, 0xe5, 0x76, 0x2c, 0x4d, 0xdc, 0x8c, 0x42, 0x63, 0xca,
+ 0x99, 0x33, 0x44, 0xb9, 0x99, 0x33, 0x44, 0xa5, 0xa4, 0x3e, 0x4f, 0x8d,
+ 0xbb, 0x11, 0x22, 0x79, 0xcb, 0x03, 0x02, 0x66, 0xd5, 0x08, 0x09, 0x54,
+ 0xdf, 0x0c, 0x10, 0x45, 0xe9, 0x11, 0x17, 0x33, 0xeb, 0x24, 0x24, 0x28,
+ 0xeb, 0x3d, 0x40, 0x20, 0xeb, 0x57, 0x5b, 0x17, 0xeb, 0x70, 0x77, 0x0f,
+ 0x88, 0xaa, 0xbb, 0x0a, 0x72, 0x94, 0xa5, 0x10, 0x6e, 0x7f, 0x90, 0x17,
+ 0x6e, 0x7f, 0x90, 0x1f, 0x35, 0x35, 0x4e, 0x28, 0x00, 0x00, 0x14, 0x34,
+ 0x00, 0x00, 0x18, 0x44, 0x00, 0x00, 0x35, 0x56, 0x11, 0x11, 0x42, 0x63,
+ 0x05, 0x05, 0x36, 0x77, 0x00, 0x00, 0x0c, 0x8f, 0x09, 0x11, 0x32, 0xa3,
+ 0x26, 0x2e, 0x47, 0xb8, 0x32, 0x3a, 0x53, 0xca, 0x4a, 0x3a, 0x6b, 0xdc,
+ 0x4a, 0x3a, 0x6b, 0xeb, 0x6c, 0x3a, 0x6c, 0xfd, 0x80, 0x4e, 0x80, 0xee,
+ 0x8c, 0x42, 0x63, 0xdc, 0x80, 0x36, 0x57, 0xca, 0xa4, 0x3e, 0x4f, 0xb9,
+ 0xa4, 0x3e, 0x4f, 0xa5, 0x99, 0x33, 0x44, 0x8d, 0xbb, 0x11, 0x22, 0x79,
+ 0xcf, 0x02, 0x01, 0x66, 0xd9, 0x06, 0x08, 0x54, 0xe3, 0x0b, 0x0f, 0x45,
+ 0xed, 0x0f, 0x16, 0x33, 0xed, 0x23, 0x22, 0x28, 0xed, 0x3c, 0x3e, 0x20,
+ 0xed, 0x56, 0x59, 0x17, 0xed, 0x6f, 0x75, 0x0f, 0x7c, 0x95, 0xae, 0x0a,
+ 0x7c, 0x95, 0xae, 0x10, 0x5f, 0x78, 0x91, 0x17, 0x5f, 0x78, 0x91, 0x1f,
+ 0x5d, 0x6e, 0x90, 0x29, 0x26, 0x37, 0x59, 0x37, 0x00, 0x00, 0x09, 0x41,
+ 0x04, 0x00, 0x26, 0x55, 0x13, 0x13, 0x46, 0x65, 0x13, 0x13, 0x46, 0x74,
+ 0x13, 0x13, 0x46, 0x8c, 0x33, 0x00, 0x11, 0x9e, 0x3e, 0x1c, 0x3e, 0xb1,
+ 0x55, 0x33, 0x55, 0xca, 0x6c, 0x4a, 0x6c, 0xde, 0x6c, 0x4a, 0x6c, 0xe8,
+ 0x6a, 0x41, 0x52, 0xeb, 0x80, 0x57, 0x68, 0xeb, 0x8c, 0x63, 0x74, 0xdc,
+ 0x80, 0x57, 0x68, 0xca, 0x9f, 0x17, 0x17, 0xb5, 0xb5, 0x2d, 0x2d, 0xa1,
+ 0xb5, 0x2d, 0x2d, 0x89, 0xd2, 0x06, 0x06, 0x75, 0xd6, 0x00, 0x00, 0x62,
+ 0xe2, 0x00, 0x03, 0x56, 0xe9, 0x0a, 0x12, 0x44, 0xef, 0x10, 0x18, 0x36,
+ 0xe7, 0x1e, 0x20, 0x27, 0xea, 0x3f, 0x3e, 0x1f, 0xed, 0x60, 0x5b, 0x16,
+ 0xf0, 0x80, 0x79, 0x0e, 0x7c, 0x95, 0xae, 0x0a, 0x5f, 0x78, 0x91, 0x10,
+ 0x5f, 0x78, 0x91, 0x17, 0x45, 0x5e, 0x77, 0x1f, 0x40, 0x51, 0x73, 0x29,
+ 0x26, 0x37, 0x59, 0x37, 0x1e, 0x0d, 0x40, 0x41, 0x00, 0x00, 0x09, 0x4f,
+ 0x13, 0x13, 0x46, 0x65, 0x13, 0x13, 0x46, 0x74, 0x33, 0x33, 0x66, 0x83,
+ 0x13, 0x13, 0x46, 0x9e, 0x3e, 0x1c, 0x3e, 0xb1, 0x55, 0x33, 0x55, 0xc0,
+ 0x55, 0x33, 0x55, 0xca, 0x6c, 0x4a, 0x6c, 0xde, 0x76, 0x4d, 0x5e, 0xdc,
+ 0x6a, 0x41, 0x52, 0xdc, 0x80, 0x57, 0x68, 0xd3, 0x8c, 0x63, 0x74, 0xc1,
+ 0xb5, 0x2d, 0x2d, 0xa9, 0x9f, 0x17, 0x17, 0x95, 0xd2, 0x06, 0x06, 0x89,
+ 0xd2, 0x06, 0x06, 0x75, 0xd6, 0x00, 0x00, 0x62, 0xec, 0x05, 0x0d, 0x4e,
+ 0xe9, 0x0a, 0x12, 0x44, 0xef, 0x10, 0x18, 0x36, 0xe8, 0x1e, 0x1f, 0x27,
+ 0xeb, 0x3e, 0x3d, 0x1f, 0xee, 0x5f, 0x5a, 0x16, 0xf1, 0x80, 0x78, 0x0e,
+ 0x6f, 0x67, 0x88, 0x0a, 0x5b, 0x53, 0x74, 0x0d, 0x49, 0x41, 0x62, 0x12,
+ 0x35, 0x2d, 0x4e, 0x1c, 0x26, 0x37, 0x59, 0x23, 0x26, 0x37, 0x59, 0x2f,
+ 0x3b, 0x2a, 0x5d, 0x41, 0x04, 0x00, 0x26, 0x4f, 0x33, 0x00, 0x11, 0x59,
+ 0x33, 0x33, 0x66, 0x6b, 0x33, 0x33, 0x66, 0x83, 0x33, 0x33, 0x66, 0x92,
+ 0x55, 0x33, 0x55, 0xa7, 0x55, 0x33, 0x55, 0xb1, 0x77, 0x33, 0x55, 0xc0,
+ 0x77, 0x33, 0x55, 0xca, 0x8f, 0x34, 0x55, 0xca, 0x8f, 0x34, 0x55, 0xca,
+ 0x8f, 0x34, 0x55, 0xc1, 0xa5, 0x4a, 0x6b, 0xaf, 0xb5, 0x2d, 0x2d, 0xa1,
+ 0xb5, 0x2d, 0x2d, 0x95, 0xd2, 0x06, 0x06, 0x7d, 0xd2, 0x06, 0x06, 0x69,
+ 0xe2, 0x00, 0x03, 0x5c, 0xec, 0x05, 0x0d, 0x4e, 0xe5, 0x06, 0x0e, 0x3c,
+ 0xef, 0x10, 0x18, 0x30, 0xe9, 0x1d, 0x1e, 0x27, 0xec, 0x3e, 0x3c, 0x1c,
+ 0xef, 0x5f, 0x59, 0x13, 0xf2, 0x7f, 0x77, 0x0e, 0x6f, 0x67, 0x88, 0x0a,
+ 0x5b, 0x53, 0x74, 0x0d, 0x49, 0x41, 0x62, 0x12, 0x35, 0x2d, 0x4e, 0x19,
+ 0x09, 0x1a, 0x3c, 0x23, 0x26, 0x37, 0x59, 0x2f, 0x3b, 0x2a, 0x5d, 0x37,
+ 0x1e, 0x0d, 0x40, 0x49, 0x33, 0x00, 0x11, 0x59, 0x33, 0x00, 0x11, 0x65,
+ 0x33, 0x33, 0x66, 0x74, 0x53, 0x53, 0x86, 0x83, 0x55, 0x33, 0x55, 0x93,
+ 0x6c, 0x4a, 0x6c, 0xa7, 0x77, 0x33, 0x55, 0xb1, 0x77, 0x33, 0x55, 0xb1,
+ 0x83, 0x28, 0x49, 0xb8, 0x99, 0x3e, 0x5f, 0xb8, 0x99, 0x3e, 0x5f, 0xaf,
+ 0x8f, 0x34, 0x55, 0xa0, 0xb5, 0x2d, 0x2d, 0x95, 0xb5, 0x2d, 0x2d, 0x89,
+ 0xd2, 0x06, 0x06, 0x75, 0xd2, 0x06, 0x06, 0x69, 0xe2, 0x00, 0x03, 0x56,
+ 0xec, 0x05, 0x0d, 0x44, 0xe5, 0x06, 0x0e, 0x3c, 0xe9, 0x0a, 0x12, 0x30,
+ 0xea, 0x1d, 0x1d, 0x22, 0xed, 0x3d, 0x3b, 0x19, 0xf0, 0x5e, 0x58, 0x13,
+ 0xf3, 0x7f, 0x76, 0x0e, 0x7c, 0x74, 0x95, 0x08, 0x56, 0x4e, 0x6f, 0x0b,
+ 0x62, 0x49, 0x7b, 0x11, 0x4e, 0x35, 0x67, 0x16, 0x44, 0x33, 0x66, 0x21,
+ 0x34, 0x23, 0x56, 0x29, 0x44, 0x33, 0x66, 0x33, 0x44, 0x33, 0x66, 0x41,
+ 0x56, 0x23, 0x56, 0x51, 0x67, 0x00, 0x01, 0x5d, 0x56, 0x23, 0x56, 0x69,
+ 0x76, 0x43, 0x76, 0x75, 0x8d, 0x4b, 0x6c, 0x83, 0x67, 0x25, 0x46, 0x92,
+ 0x8d, 0x4b, 0x6c, 0x9e, 0x7b, 0x39, 0x5a, 0x9e, 0x9f, 0x28, 0x39, 0xa2,
+ 0x9f, 0x28, 0x39, 0xa2, 0x9f, 0x28, 0x39, 0x99, 0xb5, 0x0b, 0x0b, 0x90,
+ 0xc1, 0x00, 0x00, 0x87, 0xe7, 0x11, 0x11, 0x7b, 0xdf, 0x00, 0x00, 0x67,
+ 0xe9, 0x02, 0x0a, 0x5b, 0xeb, 0x00, 0x04, 0x4f, 0xec, 0x05, 0x0a, 0x3f,
+ 0xed, 0x0a, 0x10, 0x33, 0xee, 0x0f, 0x16, 0x27, 0xeb, 0x1c, 0x1c, 0x1e,
+ 0xec, 0x3c, 0x3b, 0x17, 0xed, 0x5c, 0x59, 0x12, 0xee, 0x7b, 0x78, 0x0b,
+ 0x90, 0x88, 0xa9, 0x05, 0x56, 0x4e, 0x6f, 0x0b, 0x4e, 0x35, 0x67, 0x0e,
+ 0x4e, 0x35, 0x67, 0x14, 0x44, 0x33, 0x66, 0x1b, 0x34, 0x23, 0x56, 0x21,
+ 0x34, 0x23, 0x56, 0x29, 0x54, 0x43, 0x76, 0x3b, 0x76, 0x43, 0x76, 0x45,
+ 0x87, 0x10, 0x21, 0x51, 0x87, 0x10, 0x21, 0x5d, 0x76, 0x43, 0x76, 0x69,
+ 0x8d, 0x4b, 0x6c, 0x74, 0x8d, 0x4b, 0x6c, 0x83, 0x7b, 0x39, 0x5a, 0x8c,
+ 0x8d, 0x4b, 0x6c, 0x8c, 0x9f, 0x28, 0x39, 0x90, 0x9f, 0x28, 0x39, 0x8a,
+ 0xb5, 0x0b, 0x0b, 0x8a, 0xb5, 0x0b, 0x0b, 0x7b, 0xc1, 0x00, 0x00, 0x73,
+ 0xd5, 0x00, 0x00, 0x67, 0xe5, 0x00, 0x06, 0x5b, 0xe5, 0x00, 0x06, 0x4f,
+ 0xe9, 0x01, 0x05, 0x45, 0xea, 0x06, 0x0b, 0x39, 0xeb, 0x0b, 0x11, 0x2d,
+ 0xec, 0x10, 0x17, 0x27, 0xeb, 0x1c, 0x1c, 0x1b, 0xec, 0x3b, 0x3b, 0x12,
+ 0xed, 0x5b, 0x59, 0x0e, 0xee, 0x7b, 0x78, 0x0b, 0x90, 0x88, 0xa9, 0x05,
+ 0x6a, 0x62, 0x83, 0x08, 0x4e, 0x35, 0x67, 0x0b, 0x62, 0x49, 0x7b, 0x11,
+ 0x54, 0x43, 0x76, 0x15, 0x54, 0x43, 0x76, 0x21, 0x66, 0x11, 0x55, 0x29,
+ 0x54, 0x43, 0x76, 0x33, 0x76, 0x43, 0x76, 0x39, 0x76, 0x43, 0x76, 0x45,
+ 0x87, 0x10, 0x21, 0x51, 0x87, 0x10, 0x21, 0x5d, 0xad, 0x32, 0x53, 0x65,
+ 0xad, 0x32, 0x53, 0x6b, 0x97, 0x1c, 0x3d, 0x74, 0xa1, 0x26, 0x47, 0x74,
+ 0x9f, 0x28, 0x39, 0x7b, 0x9f, 0x28, 0x39, 0x75, 0xc1, 0x17, 0x17, 0x75,
+ 0xb5, 0x0b, 0x0b, 0x6c, 0xd5, 0x00, 0x00, 0x67, 0xd5, 0x00, 0x00, 0x5b,
+ 0xe5, 0x00, 0x06, 0x4f, 0xe5, 0x00, 0x06, 0x47, 0xe7, 0x01, 0x06, 0x39,
+ 0xe8, 0x06, 0x0c, 0x33, 0xe9, 0x0b, 0x12, 0x27, 0xea, 0x10, 0x18, 0x1d,
+ 0xeb, 0x1b, 0x1c, 0x17, 0xec, 0x3b, 0x3b, 0x12, 0xed, 0x5b, 0x59, 0x0b,
+ 0xee, 0x7a, 0x78, 0x08, 0x90, 0x88, 0xa9, 0x05, 0x7c, 0x74, 0x95, 0x08,
+ 0x62, 0x49, 0x7b, 0x0b, 0x62, 0x49, 0x7b, 0x0e, 0x54, 0x43, 0x76, 0x15,
+ 0x54, 0x43, 0x76, 0x1b, 0x66, 0x11, 0x55, 0x21, 0x66, 0x11, 0x55, 0x29,
+ 0x76, 0x43, 0x76, 0x31, 0x76, 0x43, 0x76, 0x39, 0x87, 0x10, 0x21, 0x45,
+ 0x87, 0x10, 0x21, 0x51, 0x8b, 0x10, 0x31, 0x59, 0xa1, 0x26, 0x47, 0x59,
+ 0xa1, 0x26, 0x47, 0x65, 0x8b, 0x10, 0x31, 0x65, 0xb5, 0x0b, 0x0b, 0x63,
+ 0xc1, 0x17, 0x17, 0x63, 0xc1, 0x17, 0x17, 0x63, 0xc1, 0x17, 0x17, 0x63,
+ 0xd5, 0x00, 0x00, 0x5b, 0xd5, 0x00, 0x00, 0x4f, 0xdf, 0x00, 0x00, 0x47,
+ 0xdf, 0x00, 0x00, 0x3b, 0xe5, 0x02, 0x07, 0x33, 0xe6, 0x07, 0x0d, 0x27,
+ 0xe7, 0x0c, 0x13, 0x1d, 0xe8, 0x11, 0x19, 0x1d, 0xeb, 0x1b, 0x1c, 0x12,
+ 0xec, 0x3a, 0x3b, 0x0e, 0xed, 0x5a, 0x59, 0x0b, 0xee, 0x7a, 0x78, 0x08,
+ 0x9e, 0x86, 0xa7, 0x02, 0x9a, 0x82, 0xa3, 0x05, 0x8f, 0x56, 0x7f, 0x08,
+ 0x72, 0x39, 0x62, 0x0b, 0x71, 0x3c, 0x75, 0x11, 0x75, 0x31, 0x68, 0x16,
+ 0x7a, 0x26, 0x5b, 0x1a, 0x7e, 0x1b, 0x4e, 0x20, 0x82, 0x1c, 0x4f, 0x29,
+ 0x8e, 0x28, 0x5b, 0x33, 0x8e, 0x28, 0x5b, 0x3b, 0xa4, 0x1c, 0x1c, 0x41,
+ 0xb3, 0x0e, 0x0e, 0x45, 0xad, 0x08, 0x08, 0x4b, 0xbd, 0x18, 0x18, 0x54,
+ 0xb7, 0x12, 0x12, 0x54, 0xbd, 0x00, 0x00, 0x55, 0xc9, 0x03, 0x0b, 0x55,
+ 0xd6, 0x00, 0x08, 0x4f, 0xd6, 0x00, 0x08, 0x4f, 0xdb, 0x00, 0x08, 0x48,
+ 0xdd, 0x01, 0x07, 0x3e, 0xdf, 0x02, 0x06, 0x38, 0xe1, 0x03, 0x05, 0x32,
+ 0xe3, 0x00, 0x00, 0x27, 0xe5, 0x07, 0x0a, 0x21, 0xe7, 0x0e, 0x14, 0x1b,
+ 0xe9, 0x15, 0x1e, 0x15, 0xeb, 0x26, 0x24, 0x0f, 0xed, 0x46, 0x42, 0x0c,
+ 0xef, 0x66, 0x5f, 0x09, 0xf1, 0x85, 0x7d, 0x06, 0x9a, 0x82, 0xa3, 0x02,
+ 0xa4, 0x8c, 0xad, 0x05, 0xa9, 0x70, 0x99, 0x05, 0x8f, 0x56, 0x7f, 0x08,
+ 0x83, 0x3f, 0x6a, 0x0d, 0x88, 0x34, 0x5d, 0x11, 0x8c, 0x29, 0x50, 0x16,
+ 0x90, 0x1e, 0x43, 0x1a, 0xa4, 0x1c, 0x1c, 0x21, 0xa4, 0x1c, 0x1c, 0x29,
+ 0xb0, 0x28, 0x28, 0x29, 0xa4, 0x1c, 0x1c, 0x33, 0xad, 0x08, 0x08, 0x3c,
+ 0xbd, 0x18, 0x18, 0x3c, 0xbd, 0x18, 0x18, 0x45, 0xb3, 0x0e, 0x0e, 0x45,
+ 0xc9, 0x03, 0x0b, 0x41, 0xc9, 0x03, 0x0b, 0x41, 0xd6, 0x00, 0x08, 0x41,
+ 0xdc, 0x06, 0x0e, 0x41, 0xdc, 0x05, 0x0c, 0x38, 0xde, 0x06, 0x0b, 0x32,
+ 0xe0, 0x07, 0x0a, 0x2c, 0xe2, 0x08, 0x09, 0x26, 0xe2, 0x04, 0x03, 0x21,
+ 0xe4, 0x0b, 0x0d, 0x1b, 0xe6, 0x12, 0x17, 0x15, 0xe8, 0x19, 0x21, 0x11,
+ 0xe9, 0x31, 0x2b, 0x0c, 0xeb, 0x51, 0x49, 0x09, 0xed, 0x71, 0x66, 0x06,
+ 0xef, 0x90, 0x84, 0x03, 0xa4, 0x8c, 0xad, 0x02, 0x94, 0x7c, 0x9d, 0x02,
+ 0xa9, 0x70, 0x99, 0x05, 0x8f, 0x56, 0x7f, 0x08, 0x96, 0x41, 0x5f, 0x0a,
+ 0x9a, 0x36, 0x52, 0x0d, 0x9e, 0x2b, 0x45, 0x11, 0xa2, 0x20, 0x38, 0x16,
+ 0xa4, 0x1c, 0x1c, 0x1b, 0xa4, 0x1c, 0x1c, 0x21, 0xb0, 0x28, 0x28, 0x21,
+ 0xb0, 0x28, 0x28, 0x29, 0xcc, 0x0e, 0x0e, 0x2a, 0xcc, 0x0e, 0x0e, 0x33,
+ 0xcc, 0x0e, 0x0e, 0x33, 0xd0, 0x12, 0x12, 0x33, 0xd3, 0x0d, 0x15, 0x37,
+ 0xd3, 0x0d, 0x15, 0x37, 0xe6, 0x10, 0x18, 0x37, 0xdc, 0x06, 0x0e, 0x2f,
+ 0xdd, 0x09, 0x10, 0x2c, 0xdf, 0x0a, 0x0f, 0x2c, 0xe1, 0x0b, 0x0e, 0x26,
+ 0xe3, 0x0c, 0x0d, 0x20, 0xe1, 0x08, 0x06, 0x1b, 0xe3, 0x0f, 0x10, 0x15,
+ 0xe5, 0x16, 0x1a, 0x11, 0xe7, 0x1d, 0x24, 0x0b, 0xe7, 0x3c, 0x33, 0x09,
+ 0xe9, 0x5c, 0x50, 0x06, 0xeb, 0x7c, 0x6e, 0x03, 0xed, 0x9b, 0x8b, 0x03,
+ 0xa4, 0x8c, 0xad, 0x02, 0x94, 0x7c, 0x9d, 0x02, 0xa9, 0x70, 0x99, 0x02,
+ 0x8f, 0x56, 0x7f, 0x05, 0xa8, 0x44, 0x54, 0x07, 0xac, 0x39, 0x47, 0x0a,
+ 0xb0, 0x2e, 0x3a, 0x0d, 0xb5, 0x23, 0x2d, 0x11, 0xa4, 0x1c, 0x1c, 0x15,
+ 0xb0, 0x28, 0x28, 0x15, 0xb0, 0x28, 0x28, 0x1b, 0xb0, 0x28, 0x28, 0x21,
+ 0xd6, 0x18, 0x18, 0x24, 0xd0, 0x12, 0x12, 0x24, 0xd6, 0x18, 0x18, 0x2a,
+ 0xd6, 0x18, 0x18, 0x2a, 0xdf, 0x19, 0x21, 0x29, 0xdf, 0x19, 0x21, 0x29,
+ 0xe6, 0x10, 0x18, 0x29, 0xe6, 0x10, 0x18, 0x23, 0xde, 0x0e, 0x14, 0x26,
+ 0xe0, 0x0f, 0x13, 0x20, 0xe2, 0x10, 0x12, 0x20, 0xe4, 0x11, 0x11, 0x16,
+ 0xe0, 0x0c, 0x09, 0x15, 0xe2, 0x13, 0x13, 0x11, 0xe4, 0x1a, 0x1d, 0x0b,
+ 0xe6, 0x21, 0x27, 0x0b, 0xe5, 0x47, 0x3a, 0x06, 0xe7, 0x67, 0x57, 0x06,
+ 0xe9, 0x87, 0x75, 0x03, 0xeb, 0xa6, 0x92, 0x03, 0xd5, 0x8b, 0x83, 0x01,
+ 0xc1, 0x77, 0x6f, 0x01, 0xb9, 0x56, 0x56, 0x02, 0xb9, 0x56, 0x56, 0x03,
+ 0xcd, 0x49, 0x49, 0x05, 0xcd, 0x49, 0x49, 0x08, 0xb9, 0x35, 0x35, 0x08,
+ 0xb9, 0x35, 0x35, 0x0c, 0xcb, 0x2e, 0x2c, 0x0e, 0xcb, 0x2c, 0x2c, 0x11,
+ 0xcb, 0x2a, 0x2c, 0x14, 0xcb, 0x28, 0x2c, 0x16, 0xd7, 0x20, 0x24, 0x18,
+ 0xda, 0x20, 0x23, 0x1d, 0xdd, 0x1f, 0x22, 0x1d, 0xe0, 0x1f, 0x21, 0x1d,
+ 0xe7, 0x22, 0x24, 0x1e, 0xe7, 0x20, 0x24, 0x1e, 0xe7, 0x1d, 0x24, 0x1e,
+ 0xe7, 0x1b, 0x24, 0x1b, 0xe3, 0x1c, 0x20, 0x19, 0xe3, 0x1c, 0x20, 0x17,
+ 0xe3, 0x1c, 0x20, 0x14, 0xe3, 0x1c, 0x20, 0x11, 0xdf, 0x1a, 0x20, 0x0f,
+ 0xe0, 0x23, 0x25, 0x0c, 0xe1, 0x2b, 0x2a, 0x09, 0xe2, 0x34, 0x2f, 0x06,
+ 0xe3, 0x54, 0x49, 0x05, 0xe4, 0x69, 0x5e, 0x03, 0xe5, 0x7e, 0x74, 0x02,
+ 0xe6, 0x92, 0x89, 0x01, 0xe7, 0x9d, 0x95, 0x00, 0xd5, 0x8b, 0x83, 0x01,
+ 0xcd, 0x6a, 0x6a, 0x01, 0xb9, 0x56, 0x56, 0x02, 0xcd, 0x49, 0x49, 0x02,
+ 0xcd, 0x49, 0x49, 0x05, 0xcd, 0x49, 0x49, 0x05, 0xcd, 0x49, 0x49, 0x08,
+ 0xd8, 0x46, 0x46, 0x0b, 0xd8, 0x44, 0x46, 0x0b, 0xd8, 0x42, 0x46, 0x0e,
+ 0xd8, 0x40, 0x46, 0x11, 0xdd, 0x3c, 0x3f, 0x12, 0xe0, 0x3b, 0x3e, 0x15,
+ 0xe3, 0x3b, 0x3d, 0x15, 0xe6, 0x3a, 0x3c, 0x18, 0xe9, 0x3d, 0x3c, 0x16,
+ 0xe9, 0x3a, 0x3c, 0x16, 0xe9, 0x38, 0x3c, 0x16, 0xe9, 0x35, 0x3c, 0x13,
+ 0xe7, 0x36, 0x3b, 0x11, 0xe7, 0x36, 0x3b, 0x11, 0xe7, 0x36, 0x3b, 0x0e,
+ 0xe7, 0x36, 0x3b, 0x0b, 0xe3, 0x34, 0x3a, 0x09, 0xe4, 0x3d, 0x3f, 0x09,
+ 0xe5, 0x45, 0x44, 0x06, 0xe6, 0x4e, 0x49, 0x04, 0xe6, 0x63, 0x59, 0x03,
+ 0xe7, 0x78, 0x6f, 0x02, 0xe8, 0x8d, 0x84, 0x01, 0xe9, 0xa2, 0x99, 0x01,
+ 0xfb, 0xb1, 0xa9, 0x00, 0xe7, 0x9d, 0x95, 0x00, 0xdf, 0x7c, 0x7c, 0x01,
+ 0xcd, 0x6a, 0x6a, 0x01, 0xe2, 0x66, 0x66, 0x02, 0xe2, 0x66, 0x66, 0x02,
+ 0xe2, 0x66, 0x66, 0x05, 0xe2, 0x66, 0x66, 0x05, 0xe5, 0x5f, 0x5f, 0x08,
+ 0xe5, 0x5d, 0x5f, 0x08, 0xe5, 0x5b, 0x5f, 0x0b, 0xe5, 0x59, 0x5f, 0x0b,
+ 0xe3, 0x58, 0x59, 0x0c, 0xe6, 0x57, 0x58, 0x0f, 0xe9, 0x57, 0x57, 0x0f,
+ 0xec, 0x56, 0x56, 0x0f, 0xeb, 0x58, 0x53, 0x10, 0xeb, 0x55, 0x53, 0x10,
+ 0xeb, 0x53, 0x53, 0x10, 0xeb, 0x50, 0x53, 0x10, 0xeb, 0x51, 0x55, 0x0e,
+ 0xeb, 0x51, 0x55, 0x0b, 0xeb, 0x51, 0x55, 0x0b, 0xeb, 0x51, 0x55, 0x08,
+ 0xe7, 0x4f, 0x53, 0x06, 0xe8, 0x57, 0x58, 0x06, 0xe9, 0x60, 0x5d, 0x04,
+ 0xea, 0x68, 0x62, 0x04, 0xe9, 0x73, 0x6a, 0x02, 0xea, 0x87, 0x7f, 0x01,
+ 0xeb, 0x9c, 0x94, 0x01, 0xec, 0xb1, 0xa9, 0x00, 0xfb, 0xb1, 0xa9, 0x00,
+ 0xfb, 0xb1, 0xa9, 0x00, 0xf3, 0x90, 0x90, 0x00, 0xf3, 0x90, 0x90, 0x01,
+ 0xf8, 0x7c, 0x7c, 0x02, 0xf8, 0x7c, 0x7c, 0x02, 0xf8, 0x7c, 0x7c, 0x02,
+ 0xf8, 0x7c, 0x7c, 0x02, 0xf2, 0x77, 0x79, 0x05, 0xf2, 0x75, 0x79, 0x05,
+ 0xf2, 0x73, 0x79, 0x05, 0xf2, 0x71, 0x79, 0x08, 0xe9, 0x73, 0x74, 0x09,
+ 0xec, 0x73, 0x73, 0x09, 0xef, 0x72, 0x72, 0x09, 0xf2, 0x72, 0x71, 0x09,
+ 0xed, 0x72, 0x6b, 0x0a, 0xed, 0x70, 0x6b, 0x0a, 0xed, 0x6d, 0x6b, 0x0a,
+ 0xed, 0x6b, 0x6b, 0x0a, 0xef, 0x6b, 0x70, 0x08, 0xef, 0x6b, 0x70, 0x08,
+ 0xef, 0x6b, 0x70, 0x06, 0xef, 0x6b, 0x70, 0x06, 0xeb, 0x69, 0x6d, 0x04,
+ 0xec, 0x71, 0x72, 0x04, 0xed, 0x7a, 0x77, 0x01, 0xee, 0x82, 0x7c, 0x01,
+ 0xec, 0x82, 0x7a, 0x01, 0xed, 0x97, 0x8f, 0x01, 0xee, 0xab, 0xa4, 0x00,
+ 0xef, 0xc0, 0xba, 0x00,
+ ]),
+};
diff --git a/dom/canvas/test/webgl-mochitest/mochi-to-testcase.py b/dom/canvas/test/webgl-mochitest/mochi-to-testcase.py
new file mode 100644
index 0000000000..bff3b675b0
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/mochi-to-testcase.py
@@ -0,0 +1,119 @@
+#! /usr/bin/env python3
+import pathlib
+import re
+import sys
+
+assert len(sys.argv) == 2
+MOCHI_PATH = pathlib.Path(sys.argv[1])
+assert MOCHI_PATH.suffix == ".html"
+
+TEST_PATH = MOCHI_PATH.with_suffix(".solo.html")
+
+
+def read_local_file(include):
+ inc_path = MOCHI_PATH.parent
+ file_path = inc_path / include
+
+ try:
+ return file_path.read_bytes()
+ except IOError:
+ return b""
+
+
+SIMPLETEST_REPLACEMENT = b"""
+
+<script>
+// SimpleTest.js replacement
+
+function debug(text) {
+ var elem = document.getElementById('mochi-to-testcase-output');
+ elem.innerHTML += '\\n<br/>\\n' + text;
+}
+
+function ok(val, text) {
+ var status = val ? 'Test <font color=\\'green\\'>passed</font>: '
+ : 'Test <font color=\\'red\\' >FAILED</font>: ';
+ debug(status + text);
+}
+
+function todo(val, text) {
+ var status = val ? 'Test <font color=\\'orange\\'>UNEXPECTED PASS</font>: '
+ : 'Test <font color=\\'blue\\' >todo</font>: ';
+ debug(status + text);
+}
+
+function addLoadEvent(func) {
+ window.addEventListener('load', func);
+}
+
+SimpleTest = {
+ waitForExplicitFinish: () => {},
+ finish: () => {},
+ requestFlakyTimeout: () => {},
+};
+
+SpecialPowers = {
+ pushPrefEnv: async (env, callback = null) => {
+ console.log(`SpecialPowers.pushPrefEnv(${JSON.stringify(env)})`);
+ await new Promise(res => {
+ setTimeout(res, 0);
+ });
+ if (callback) {
+ await callback();
+ }
+ },
+ popPrefEnv: async (callback = null) => {
+ console.log('SpecialPowers.popPrefEnv()');
+ await new Promise(res => {
+ setTimeout(res, 0);
+ });
+ if (callback) {
+ await callback();
+ }
+ },
+};
+</script>
+<div id='mochi-to-testcase-output'></div>
+
+"""
+
+INCLUDE_PATTERN = re.compile(b"<script\\s*src=['\"](.*)\\.js['\"]>\\s*</script>")
+CSS_PATTERN = re.compile(
+ b"<link\\s*rel=['\"]stylesheet['\"]\\s*href=['\"]([^=>]*)['\"]>"
+)
+
+with open(TEST_PATH, "wb") as fout:
+ with open(MOCHI_PATH, "rb") as fin:
+ for line in fin:
+ skip_line = False
+ for css in CSS_PATTERN.findall(line):
+ skip_line = True
+ print("Ignoring stylesheet: " + css.decode())
+
+ for inc in INCLUDE_PATTERN.findall(line):
+ skip_line = True
+ if inc == b"/MochiKit/MochiKit":
+ continue
+
+ if inc == b"/tests/SimpleTest/SimpleTest":
+ print("Injecting SimpleTest replacement")
+ fout.write(SIMPLETEST_REPLACEMENT)
+ continue
+
+ inc_js = inc.decode() + ".js"
+ inc_data = read_local_file(inc_js)
+ if not inc_data:
+ print("Warning: Unknown JS file ignored: " + inc_js)
+ continue
+
+ print("Injecting include: " + inc_js)
+ fout.write(b"\n<script>\n// Imported from: " + inc_js.encode() + b"\n")
+ fout.write(inc_data)
+ fout.write(b"\n</script>\n")
+ continue
+
+ if skip_line:
+ continue
+
+ fout.write(line)
+ continue
diff --git a/dom/canvas/test/webgl-mochitest/mochitest.ini b/dom/canvas/test/webgl-mochitest/mochitest.ini
new file mode 100644
index 0000000000..22e09f9bb5
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/mochitest.ini
@@ -0,0 +1,131 @@
+[DEFAULT]
+subsuite = webgl1-core
+
+support-files =
+ ensure-exts/ensure-ext.js
+ driver-info.js
+ es3-data.js
+ webgl-util.js
+ test_video_fastpath.js
+ red-green.mp4
+ red-green.theora.ogv
+ red-green.webmvp8.webm
+ red-green.webmvp9.webm
+
+[ensure-exts/test_ANGLE_instanced_arrays.html]
+[ensure-exts/test_EXT_blend_minmax.html]
+[ensure-exts/test_EXT_color_buffer_half_float.html]
+[ensure-exts/test_EXT_disjoint_timer_query.html]
+fail-if = 1
+[ensure-exts/test_EXT_float_blend.html]
+[ensure-exts/test_EXT_frag_depth.html]
+fail-if = (os == 'android')
+[ensure-exts/test_EXT_sRGB.html]
+[ensure-exts/test_EXT_shader_texture_lod.html]
+fail-if = (os == 'android')
+[ensure-exts/test_EXT_texture_compression_bptc.html]
+fail-if = (os == 'android') || (os == 'linux' && os_version == '16.04') || (os == 'mac')
+[ensure-exts/test_EXT_texture_compression_rgtc.html]
+fail-if = (os == 'android')
+[ensure-exts/test_EXT_texture_filter_anisotropic.html]
+fail-if = (os == 'linux')
+[ensure-exts/test_OES_draw_buffers_indexed.html]
+[ensure-exts/test_OES_fbo_render_mipmap.html]
+[ensure-exts/test_OES_standard_derivatives.html]
+[ensure-exts/test_OVR_multiview2.html]
+fail-if = (os == 'linux') || (os == 'mac')
+[ensure-exts/test_WEBGL_color_buffer_float.html]
+[ensure-exts/test_WEBGL_compressed_texture_astc.html]
+fail-if = (os == 'linux' && os_version == '16.04') || (os == 'mac') || (os == 'win')
+[ensure-exts/test_WEBGL_compressed_texture_etc.html]
+fail-if = (os == 'mac') || (os == 'win')
+[ensure-exts/test_WEBGL_compressed_texture_etc1.html]
+fail-if = (os == 'linux') || (os == 'mac') || (os == 'win')
+[ensure-exts/test_WEBGL_compressed_texture_pvrtc.html]
+fail-if = (os == 'android') || (os == 'linux') || (os == 'mac') || (os == 'win')
+[ensure-exts/test_WEBGL_compressed_texture_s3tc.html]
+fail-if = (os == 'android')
+[ensure-exts/test_WEBGL_depth_texture.html]
+[ensure-exts/test_WEBGL_draw_buffers.html]
+fail-if = (os == 'android')
+[ensure-exts/test_WEBGL_provoking_vertex.html]
+fail-if = (os == 'android') || (os == 'linux')
+
+[ensure-exts/test_common.html]
+[ensure-exts/test_implicit.html]
+
+
+[regress/test_bug_1268096.html]
+
+
+[test_backends.html]
+[test_backbuffer_channels.html]
+[test_depth_readpixels.html]
+[test_canvas_size.html]
+[test_capture.html]
+skip-if = os == 'win' && debug # Bug 1388624
+support-files = ../captureStream_common.js
+# Even though we use ../ here, in the test HTML, we need to omit this. Sub-CWD relative
+# paths are fine, but they locate the file and dump it in the current directory.
+[test_cubemap_must_be_square.html]
+[test_depth_tex_lazy_clear.html]
+[test_draw.html]
+[test_draw_fakevert_large_offset.html]
+[test_fb_param.html]
+[test_fb_param_crash.html]
+[test_has_rbab.html]
+fail-if = (os == 'android' && android_version == "26") || (os == 'linux') || (os == 'mac')
+[test_hidden_alpha.html]
+[test_hidden_depth_stencil.html]
+[test_imagedata_transfered_arraybuffer.html]
+[test_implicit_color_buffer_float.html]
+[test_highp_fs.html]
+[test_no_arr_points.html]
+[test_noprog_draw.html]
+[test_pixel_pack_buffer.html]
+# skip-if = os == "win" && os_version == "10.0" # Bug 1302199
+skip-if =
+ (os == "win") # Unofficial DXGL support regressed by bug 1632249
+ apple_silicon
+[test_privileged_exts.html]
+[test_read_pixels_no_format.html]
+[test_renderer_strings.html]
+[test_sab_with_webgl.html]
+[test_tex_large_uploads.html]
+skip-if =
+ (os == "win") && debug && (bits == 32) # bug 1705863
+support-files = blank_15000x10000.png
+[test_tex_pbo.html]
+[test_tex_unit_different_sampler_types.html]
+[test_texsubimage_float.html]
+[test_uninit_data.html]
+[test_webgl_available.html]
+[test_webgl_compressed_texture_es3.html]
+skip-if = (os == 'android')
+# 2020-01-07 00:00:11.839 F/MOZ_Assert( 6742): Assertion failure: [GFX1]: void mozilla::gl::GLContext::raw_fClear(GLbitfield): Generated unexpected GL_OUT_OF_MEMORY error, at /builds/worker/workspace/build/src/gfx/2d/Logging.h:746
+# 2020-01-07 00:01:28.281 F/MOZ_Assert( 8333): Assertion failure: [GFX1]: Unexpected error from driver: DoCompressedTexSubImage(0x0de1, 0, 0,4,0, 4,4,1, 0x9270, 8) -> 0x0501, at /builds/worker/workspace/build/src/gfx/2d/Logging.h:746
+[test_webgl_force_enable.html]
+[test_webgl_request_context.html]
+skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
+[test_webgl_request_mismatch.html]
+skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
+[test_webgl2_not_exposed.html]
+skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
+[test_webgl2_invalidate_framebuffer.html]
+skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
+[test_webgl2_alpha_luminance.html]
+skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
+[test_webgl2_uniform_block.html]
+[test_fuzzing_bugs.html]
+[test_video_fastpath_mp4.html]
+skip-if = (os == 'win') && (bits == 32) # No fast video path for h264 decoder (done in RDD, can't be read in content)
+[test_video_fastpath_theora.html]
+skip-if = (os == 'linux') || (os == "mac") || ((os == 'win') && (bits == 32)) # No fast video path for theora decoder (done in RDD, can't be read in content)
+[test_video_fastpath_vp8.html]
+skip-if = (os == 'linux') || (os == "mac") || ((os == 'win') && (bits == 32)) # No fast video path for vp8 decoder (done in RDD, can't be read in content)
+[test_video_fastpath_vp9.html]
+skip-if = (os == 'linux') || (os == "mac") || ((os == 'win') && (bits == 32)) # No fast video path for vp9 decoder (done in RDD, can't be read in content)
+[test_webglcontextcreationerror.html]
+[test_webgl_fingerprinting_resistance.html]
+[test_without_index_validation.html]
+[test_vertexattrib4f_update.html]
diff --git a/dom/canvas/test/webgl-mochitest/red-green.mp4 b/dom/canvas/test/webgl-mochitest/red-green.mp4
new file mode 100644
index 0000000000..4bd6d59658
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/red-green.mp4
Binary files differ
diff --git a/dom/canvas/test/webgl-mochitest/red-green.theora.ogv b/dom/canvas/test/webgl-mochitest/red-green.theora.ogv
new file mode 100644
index 0000000000..1543915a10
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/red-green.theora.ogv
Binary files differ
diff --git a/dom/canvas/test/webgl-mochitest/red-green.webmvp8.webm b/dom/canvas/test/webgl-mochitest/red-green.webmvp8.webm
new file mode 100644
index 0000000000..fde59a18b4
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/red-green.webmvp8.webm
Binary files differ
diff --git a/dom/canvas/test/webgl-mochitest/red-green.webmvp9.webm b/dom/canvas/test/webgl-mochitest/red-green.webmvp9.webm
new file mode 100644
index 0000000000..23dd3051cd
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/red-green.webmvp9.webm
Binary files differ
diff --git a/dom/canvas/test/webgl-mochitest/regress/test_bug_1268096.html b/dom/canvas/test/webgl-mochitest/regress/test_bug_1268096.html
new file mode 100644
index 0000000000..0262c52d8c
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/regress/test_bug_1268096.html
@@ -0,0 +1,140 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='UTF-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='../webgl-util.js'></script>
+ <script id='vs' type='x-shader/x-vertex'>
+
+attribute vec2 aPosition;
+
+void main(void) {
+ gl_PointSize = 16.0;
+ gl_Position = vec4(aPosition, 0, 1);
+}
+
+ </script>
+ <script id='fs' type='x-shader/x-fragment'>
+
+precision mediump float;
+
+uniform vec4 uColor;
+
+void main(void) {
+ gl_FragColor = uColor;
+}
+
+ </script>
+ </head>
+ <body>
+ <script>
+
+function GetPixel(gl, x, y) {
+ var pixel = new Uint8Array(4);
+ gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);
+ return pixel;
+}
+
+function ColorStr(arr) {
+ return '{' + arr.map(function(x) { return '' + x; }).join(', ') + '}';
+}
+
+function PixelShouldBe(gl, x, y, ref, prefix) {
+ if (prefix) {
+ prefix += ': ';
+ }
+
+ var test = GetPixel(gl, x, y);
+
+ var testStr = ColorStr(test);
+ var refStr = ColorStr(ref.map(value => value * 255));
+ ok(testStr == refStr, prefix + 'Should be ' + refStr + ', was ' + testStr + '.');
+}
+
+function GetProgram(gl) {
+ var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs');
+
+ prog.aPosition = gl.getAttribLocation(prog, 'aPosition');
+ ok(prog.aPosition >= 0, '`aPosition` should be valid.');
+
+ prog.uColor = gl.getUniformLocation(prog, 'uColor');
+ ok(prog.uColor, '`uColor` should be valid.');
+
+ return prog;
+}
+
+// Give ourselves a scope to return early from:
+(function () {
+ var c = document.createElement('canvas');
+ document.body.appendChild(c);
+ var gl = c.getContext('webgl', { depth: false, antialias: false });
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ return;
+ }
+
+ ////////
+
+ // With default culling, it works fine.
+ // The problem seems to be that the virtual quads generated from points are wound 'backwards'.
+ gl.enable(gl.CULL_FACE);
+ gl.cullFace(gl.BACK); // Cull back faces.
+
+ ////////
+
+ var vertArr = new Float32Array([
+ -1, -1,
+ +1, -1,
+ -1, +1,
+ ]);
+
+ var vbo = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
+ gl.bufferData(gl.ARRAY_BUFFER, vertArr, gl.STATIC_DRAW);
+
+ ////////
+
+ var triProg = GetProgram(gl);
+ var pointProg = GetProgram(gl);
+ if (!triProg || !pointProg) {
+ ok(false, 'Program linking should succeed.');
+ return;
+ }
+
+ ok(triProg.aPosition == pointProg.aPosition, 'aPosition should match.');
+ gl.enableVertexAttribArray(triProg.aPosition);
+ gl.vertexAttribPointer(triProg.aPosition, 2, gl.FLOAT, false, 0, 0);
+
+ ////////
+
+ gl.useProgram(triProg);
+ var triColor = [1, 0, 0, 1];
+ gl.uniform4fv(triProg.uColor, triColor);
+
+ gl.useProgram(pointProg);
+ var pointColor = [0, 1, 0, 1];
+ gl.uniform4fv(pointProg.uColor, pointColor);
+
+ ////////
+
+ gl.clearColor(0, 0, 0, 1);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+
+ gl.useProgram(triProg);
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
+
+ gl.useProgram(pointProg);
+ gl.drawArrays(gl.POINTS, 0, 3);
+
+ ////////
+
+ PixelShouldBe(gl, 32, 32, triColor, 'Tri');
+ PixelShouldBe(gl, 0, 0, pointColor, 'Point');
+
+ ok(true, 'Test complete');
+})();
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_backbuffer_channels.html b/dom/canvas/test/webgl-mochitest/test_backbuffer_channels.html
new file mode 100644
index 0000000000..ef880f9c22
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_backbuffer_channels.html
@@ -0,0 +1,111 @@
+<!DOCTYPE HTML>
+<title>WebGL test: bug 958723</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<script src="webgl-util.js"></script>
+<body>
+<script>
+
+function TestAttribs(attribs) {
+ ok(true, 'Testing attribs: ' + JSON.stringify(attribs));
+ var canvas = document.createElement('canvas');
+ var gl = canvas.getContext('experimental-webgl', attribs);
+ ok(gl, 'No tested attribs should result in failure to create a context');
+ if (!gl)
+ return;
+
+ var actual = gl.getContextAttributes();
+
+ ok(actual.alpha == attribs.alpha,
+ 'Resulting `alpha` should match request.');
+ ok(actual.premultipliedAlpha == attribs.premultipliedAlpha,
+ 'Resulting `premultipliedAlpha` should match request.');
+ ok(actual.preserveDrawingBuffer == attribs.preserveDrawingBuffer,
+ 'Resulting `preserveDrawingBuffer` should match request.');
+
+ // "The depth, stencil and antialias attributes, when set to true, are
+ // requests, not requirements."
+ if (!attribs.antialias) {
+ ok(!actual.antialias, 'No `antialias` if not requested.');
+ }
+ if (!attribs.depth) {
+ ok(!actual.depth, 'No `depth` if not requested.');
+ }
+ if (!attribs.stencil) {
+ ok(!actual.stencil, 'No `stencil` if not requested.');
+ }
+
+ var hasAlpha = !!gl.getParameter(gl.ALPHA_BITS);
+ var hasDepth = !!gl.getParameter(gl.DEPTH_BITS);
+ var hasStencil = !!gl.getParameter(gl.STENCIL_BITS);
+ var hasAntialias = !!gl.getParameter(gl.SAMPLES);
+
+ ok(hasAlpha == actual.alpha, 'Bits should match `alpha` attrib.');
+ ok(hasAntialias == actual.antialias, 'Bits should match `antialias` attrib.');
+ ok(hasDepth == actual.depth, 'Bits should match `depth` attrib.');
+ ok(hasStencil == actual.stencil, 'Bits should match `stencil` attrib.');
+}
+
+function CloneAttribs(attribs) {
+ return {
+ alpha: attribs.alpha,
+ antialias: attribs.antialias,
+ depth: attribs.depth,
+ premultipliedAlpha: attribs.premultipliedAlpha,
+ preserveDrawingBuffer: attribs.preserveDrawingBuffer,
+ stencil: attribs.stencil,
+ };
+}
+
+function SplitForAttrib(list, attrib) {
+ var ret = [];
+
+ for (var i in list) {
+ var cur = list[i];
+ if (cur[attrib])
+ throw 'Attrib is already true.';
+
+ var clone = CloneAttribs(cur);
+ clone[attrib] = true;
+
+ ret.push(cur);
+ ret.push(clone);
+ }
+
+ return ret;
+}
+
+function GenAttribList() {
+ var base = {
+ alpha: false,
+ antialias: false,
+ depth: false,
+ premultipliedAlpha: false,
+ preserveDrawingBuffer: false,
+ stencil: false,
+ };
+ var list = [base];
+ list = SplitForAttrib(list, 'alpha');
+ list = SplitForAttrib(list, 'antialias');
+ list = SplitForAttrib(list, 'depth');
+ list = SplitForAttrib(list, 'premultipliedAlpha');
+ list = SplitForAttrib(list, 'preserveDrawingBuffer');
+ list = SplitForAttrib(list, 'stencil');
+
+ if (list.length != 1<<6)
+ throw 'Attribs list length wrong: ' + list.length;
+
+ return list;
+}
+
+var list = GenAttribList();
+for (var i in list) {
+ var attribs = list[i];
+ TestAttribs(attribs);
+}
+
+ok(true, 'Test complete.');
+
+</script>
+
diff --git a/dom/canvas/test/webgl-mochitest/test_backends.html b/dom/canvas/test/webgl-mochitest/test_backends.html
new file mode 100644
index 0000000000..50ba4cbd4c
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_backends.html
@@ -0,0 +1,169 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset='UTF-8'>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+</head>
+<body>
+<script>
+
+function RunWithPrefs(prefPairList, func) {
+ var prefEnv = {'set': prefPairList};
+ try {
+ SpecialPowers.pushPrefEnv(prefEnv, func);
+ } catch (e) {
+ console.log('Warning: Failed to set prefs: ' + JSON.stringify(prefPairList));
+ func();
+ }
+}
+
+////////////////////////////////////////
+
+var ANGLE_IS_SINGLETON = true;
+
+var expectD3DType;
+try {
+ // code borrowed from browser/modules/test/browser_taskbar_preview.js
+ var version = SpecialPowers.Services.sysinfo.getProperty('version');
+ version = parseFloat(version);
+
+ // Version 6.0 is Vista, 6.1 is 7.
+ if (version <= 6.0)
+ expectD3DType = 'd3d9';
+ else
+ expectD3DType = 'd3d11';
+} catch (e) {
+ expectD3DType = 'd3d11';
+}
+
+function GetRenderer() {
+ var c = document.createElement('canvas');
+ var gl = c.getContext('experimental-webgl');
+ if (!gl)
+ return undefined;
+
+ var ext = gl.getExtension('WEBGL_debug_renderer_info');
+ if (!ext)
+ throw new Error('Requires WEBGL_debug_renderer_info.');
+
+ var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
+ return renderer;
+}
+
+function GetRendererType() {
+ var renderer = GetRenderer();
+ if (renderer === undefined)
+ return 'none';
+
+ if (renderer.includes('ANGLE')) {
+ if (renderer.includes('Microsoft Basic Render Driver')) // Also includes 'Direct3D11'.
+ return 'warp';
+ if (renderer.includes('Direct3D11'))
+ return 'd3d11';
+ if (renderer.includes('Direct3D9'))
+ return 'd3d9';
+
+ } else {
+ return 'gl';
+ }
+
+ throw new Error('Unrecognized renderer type for: ' + renderer);
+}
+
+function TestActualType(testName, expectedType) {
+ var actualType = GetRendererType();
+ ok(actualType == expectedType,
+ '[' + testName + '] Expected ' + expectedType + ', was ' + actualType);
+}
+
+////////////////////////////////////////
+
+function TestDefault() {
+ var expectedType = 'gl';
+ var isWindows = (navigator.platform.indexOf('Win') == 0);
+ if (isWindows) {
+ expectedType = expectD3DType;
+ }
+ TestActualType('TestDefault', expectedType);
+
+ if (isWindows && !ANGLE_IS_SINGLETON) {
+ var prefPairList = [
+ ['webgl.angle.force-warp', true],
+ ];
+ RunWithPrefs(prefPairList, TestWARP);
+ return;
+ }
+
+ var prefPairList = [
+ ['webgl.disabled', true],
+ ];
+ RunWithPrefs(prefPairList, TestDisabled);
+ return;
+}
+
+
+function TestWARP() {
+ var expectedType = (expectD3DType == 'd3d11') ? 'warp' : 'none';
+ TestActualType('TestWARP', expectedType);
+
+ var prefPairList = [
+ ['webgl.angle.force-warp', false],
+ ['webgl.angle.force-d3d11', true],
+ ];
+ RunWithPrefs(prefPairList, TestD3D11);
+}
+
+
+function TestD3D11() {
+ var expectedType = (expectD3DType == 'd3d11') ? 'd3d11' : 'none';
+ TestActualType('TestD3D11', expectedType);
+
+ var prefPairList = [
+ ['webgl.angle.force-d3d11', false],
+ ['webgl.angle.try-d3d11', false],
+ ];
+ RunWithPrefs(prefPairList, TestD3D9);
+}
+
+
+function TestD3D9() {
+ TestActualType('TestD3D9', 'd3d9');
+
+ var prefPairList = [
+ ['webgl.angle.try-d3d11', true],
+ ['webgl.disable-angle', true],
+ ];
+ RunWithPrefs(prefPairList, TestWinGL);
+}
+
+
+function TestWinGL() {
+ TestActualType('TestWinGL', 'gl');
+
+ var prefPairList = [
+ ['webgl.disabled', true],
+ ];
+ RunWithPrefs(prefPairList, TestDisabled);
+}
+
+
+function TestDisabled() {
+ TestActualType('TestDisabled', 'none');
+
+ SimpleTest.finish();
+}
+
+////////////////////////////////////////
+
+SimpleTest.waitForExplicitFinish();
+
+var prefPairList = [
+ ['webgl.force-enabled', true],
+ ['webgl.enable-debug-renderer-info', true],
+];
+RunWithPrefs(prefPairList, TestDefault);
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_canvas_size.html b/dom/canvas/test/webgl-mochitest/test_canvas_size.html
new file mode 100644
index 0000000000..a9ea076a82
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_canvas_size.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset='UTF-8'>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+</head>
+<title>WebGL test: Framebuffer maximum size test. (Bug 1290333)</title>
+<body>
+<script>
+function TestSize(contextName, testSize) {
+ var attributes = {
+ antialias: false,
+ };
+
+ var canvas = document.createElement('canvas');
+ var gl = canvas.getContext(contextName, attributes);
+
+ if (!gl) {
+ todo(false, contextName + 'is unavailable.');
+ return;
+ }
+ gl.canvas.width = testSize;
+ gl.canvas.height = testSize;
+
+ ok(true, contextName + 'test complete.');
+}
+
+function run() {
+ TestSize('webgl', 16384);
+ TestSize('webgl2', 16384);
+
+ ok(true, 'Test complete.');
+ SimpleTest.finish();
+}
+
+////////////////////////////////////////
+
+SimpleTest.waitForExplicitFinish();
+
+try {
+ var prefPairList = [
+ ['webgl.force-enabled', true],
+ ];
+ var prefEnv = {'set': prefPairList};
+ SpecialPowers.pushPrefEnv(prefEnv, run);
+} catch (e) {
+ warning('No SpecialPowers, but trying WebGL2 anyway...');
+ run();
+}
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_capture.html b/dom/canvas/test/webgl-mochitest/test_capture.html
new file mode 100644
index 0000000000..d456e590d9
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_capture.html
@@ -0,0 +1,213 @@
+<!DOCTYPE HTML>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+<title>WebGL test: CaptureStream()</title>
+
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="captureStream_common.js">
+<script src="driver-info.js"></script>
+<script src="webgl-util.js"></script>
+<script id="vs" type="x-shader/x-vertex">
+
+attribute vec2 aVertCoord;
+
+void main(void) {
+ gl_Position = vec4(aVertCoord, 0.0, 1.0);
+}
+
+</script>
+<script id="fs" type="x-shader/x-fragment">
+
+precision mediump float;
+uniform vec4 uColor;
+
+void main(void) {
+ gl_FragColor = uColor;
+}
+
+</script>
+<body>
+<script>
+
+// Globals. Initialized during beginTest().
+var c; // Canvas element captured by streams.
+var gl; // WebGLContext of |c|.
+var h; // CaptureStreamTestHelper holding utility test functions.
+var vauto; // Video element with captureStream stream in automatic mode.
+var vmanual; // Video element with captureStream stream in manual (fps 0) mode.
+var vrate; // Video element with captureStream stream with fixed frame rate.
+
+/* Fails the test if there was a GL error */
+function checkGLError(info) {
+ var error = gl.getError();
+ // Comparing strings for sake of log output in hex format.
+ is("0x" + error.toString(16), "0x0", "WebGL error [" + info + "]");
+}
+
+function checkClearColorInitialRed() {
+ info("Checking that clearing to red works for first frame.");
+
+ h.clearColor(c, h.red);
+
+ vauto.srcObject = c.captureStream();
+ vmanual.srcObject = c.captureStream(0);
+ vrate.srcObject = c.captureStream(10);
+
+ ok(h.isPixel(h.getPixel(vauto), h.blackTransparent),
+ "vauto should not be drawn to before stable state");
+ ok(h.isPixel(h.getPixel(vrate), h.blackTransparent),
+ "vrate should not be drawn to before stable state");
+ ok(h.isPixel(h.getPixel(vmanual), h.blackTransparent),
+ "vmanual should not be drawn to before stable state");
+
+ return Promise.resolve()
+ .then(() => h.pixelMustBecome(vauto, h.red, {
+ infoString: "should become red automatically",
+ }))
+ .then(() => h.pixelMustBecome(vrate, h.red, {
+ infoString: "should become red automatically",
+ }))
+ .then(() => h.pixelMustBecome(vmanual, h.red, {
+ infoString: "should become red when we get to stable "
+ + "state (first frame)",
+ }))
+}
+
+function checkDrawColorGreen() {
+ info("Checking that drawing green results in green video frames.");
+ var drawing = h.startDrawing(h.drawColor.bind(h, c, h.green));
+ checkGLError('after DrawColor');
+ return Promise.resolve()
+ .then(() => h.pixelMustBecome(vauto, h.green, {
+ infoString: "should become green automatically",
+ }))
+ .then(() => h.pixelMustBecome(vrate, h.green, {
+ infoString: "should become green automatically",
+ }))
+ .then(() => h.pixelMustBecome(vmanual, h.red, {
+ infoString: "should still be red",
+ }))
+ .then(() => h.requestFrame(vmanual))
+ .then(() => h.pixelMustBecome(vmanual, h.green, {
+ infoString: "should become green after requstFrame()",
+ }))
+ .then(() => drawing.stop());
+}
+
+function checkClearColorRed() {
+ info("Checking that clearing to red works.");
+ var drawing = h.startDrawing(h.clearColor.bind(h, c, h.red));
+ return Promise.resolve()
+ .then(() => h.pixelMustBecome(vauto, h.red, {
+ infoString: "should become red automatically",
+ }))
+ .then(() => h.pixelMustBecome(vrate, h.red, {
+ infoString: "should become red automatically",
+ }))
+ .then(() => h.pixelMustBecome(vmanual, h.green, {
+ infoString: "should still be green",
+ }))
+ .then(() => h.requestFrame(vmanual))
+ .then(() => h.pixelMustBecome(vmanual, h.red, {
+ infoString: "should become red after requestFrame()",
+ }))
+ .then(() => drawing.stop());
+}
+
+function checkRequestFrameOrderGuarantee() {
+ info("Checking that requestFrame() immediately after a draw " +
+ "call results in the expected frame seen in the stream.");
+ return Promise.resolve()
+ .then(() => h.pixelMustBecome(vmanual, h.red, 0, "should still be red"))
+ .then(() => h.drawColor(c, h.green)) // 1. Draw canvas green
+ .then(() => h.requestFrame(vmanual)) // 2. Immediately request a frame
+ .then(() => h.pixelMustBecome(vmanual, h.green, {
+ infoString: "should become green after call order test",
+ }))
+}
+
+function checkEndedOnStop() {
+ let promises = [vauto, vmanual, vrate].map(elem => {
+ elem.srcObject.getTracks()[0].stop();
+ return new Promise(resolve =>
+ elem.addEventListener("ended", function endedListener(event) {
+ ok(true, "Element " + elem.id + " ended.");
+ resolve();
+ elem.removeEventListener("ended", endedListener);
+ }));
+ });
+ return Promise.all(promises);
+}
+
+
+function finish() {
+ ok(true, 'Test complete.');
+ SimpleTest.finish();
+}
+
+function beginTest() {
+ h = new CaptureStreamTestHelperWebGL();
+
+ c = h.createAndAppendElement('canvas', 'c');
+ vauto = h.createAndAppendElement('video', 'vauto');
+ vmanual = h.createAndAppendElement('video', 'vmanual');
+ vrate = h.createAndAppendElement('video', 'vrate');
+
+ gl = c.getContext('webgl');
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ finish();
+ return;
+ }
+
+ gl.disable(gl.DEPTH_TEST);
+
+ prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs');
+ if (!prog) {
+ ok(false, 'Program linking should succeed.');
+ return;
+ }
+
+ // Setup vertex coordinates for drawing a rectangle across the whole canvas.
+
+ prog.aVertCoord = gl.getAttribLocation(prog, "aVertCoord");
+ ok(prog.aVertCoord >= 0, '`aVertCoord` should be valid.');
+
+ var vertCoordArr = new Float32Array([
+ -1, -1,
+ 1, -1,
+ -1, 1,
+ 1, 1,
+ ]);
+ var vertCoordBuff = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertCoordBuff);
+ gl.bufferData(gl.ARRAY_BUFFER, vertCoordArr, gl.STATIC_DRAW);
+
+ gl.useProgram(prog);
+ gl.enableVertexAttribArray(prog.aVertCoord);
+ gl.vertexAttribPointer(prog.aVertCoord, 2, gl.FLOAT, false, 0, 0);
+
+ // Setup the helper with a pointer to how to change fragment color.
+
+ var uColorLocation = gl.getUniformLocation(prog, "uColor");
+ h.setFragmentColorLocation(uColorLocation);
+
+ checkGLError('after setup');
+
+ // Run tests.
+
+ Promise.resolve()
+ .then(checkClearColorInitialRed)
+ .then(checkDrawColorGreen)
+ .then(checkClearColorRed)
+ .then(checkRequestFrameOrderGuarantee)
+ .then(checkEndedOnStop)
+ .then(finish);
+}
+
+SimpleTest.waitForExplicitFinish();
+
+beginTest();
+</script>
+
diff --git a/dom/canvas/test/webgl-mochitest/test_cubemap_must_be_square.html b/dom/canvas/test/webgl-mochitest/test_cubemap_must_be_square.html
new file mode 100644
index 0000000000..f2bc2914b2
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_cubemap_must_be_square.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta http-equiv='content-type' content='text/html; charset=utf-8'/>
+
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='webgl-util.js'></script>
+</head>
+
+<body>
+<script>
+'use strict';
+
+(function() {
+ var c = document.createElement('canvas');
+ var gl = c.getContext('webgl');
+
+ ok(!gl.getError(), 'No error before.');
+
+ var tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);
+ gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, gl.RGBA, 4, 3, 0, gl.RGBA,
+ gl.UNSIGNED_BYTE, null);
+
+ var err = gl.getError();
+ ok(err == gl.INVALID_VALUE,
+ 'Should be INVALID_VALUE (0x501) after, was 0x' + err.toString(16) + '.');
+})();
+
+ok(true, 'Test complete.');
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_depth_readpixels.html b/dom/canvas/test/webgl-mochitest/test_depth_readpixels.html
new file mode 100644
index 0000000000..d0ed8e60b0
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_depth_readpixels.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>WebGL test: Check for error on ReadPixels from a depth-only FB.</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="webgl-util.js"></script>
+<script src="driver-info.js"></script>
+</head>
+<body>
+<canvas id="c"></canvas>
+<script>
+"use strict";
+
+(function() {
+ var gl = c.getContext('webgl');
+ if (!gl) {
+ todo(gl, 'Get GL working here first.');
+ return;
+ }
+
+ var rb = gl.createRenderbuffer();
+ gl.bindRenderbuffer(gl.RENDERBUFFER, rb);
+ gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 4, 4);
+
+ var fb = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT,
+ gl.RENDERBUFFER, rb);
+
+ if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) {
+ todo(false, 'Depth-only FB incomplete. This is valid.');
+ return;
+ }
+
+ ok(!gl.getError(), 'Should have no errors after constructing FB.');
+
+ var pixels = new Uint8Array([1, 2, 3, 4]);
+ gl.readPixels(0, 0, // x,y
+ 1, 1, // w,h
+ gl.RGBA, gl.UNSIGNED_BYTE, pixels);
+
+ ok(gl.getError() == gl.INVALID_OPERATION,
+ '1x1 color read from a depth FB should generated INVALID_OP.');
+ console.log('Data after 1x1 color-from-depth readpixels:');
+ console.log(pixels);
+
+ gl.readPixels(0, 0, // x,y
+ 0, 0, // w,h
+ gl.RGBA, gl.UNSIGNED_BYTE, pixels);
+
+ ok(gl.getError() == gl.INVALID_OPERATION,
+ '0x0 color read from a depth FB should generated INVALID_OP.');
+})();
+
+ok(true, 'Test complete.');
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_depth_tex_lazy_clear.html b/dom/canvas/test/webgl-mochitest/test_depth_tex_lazy_clear.html
new file mode 100644
index 0000000000..a3f2dc409a
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_depth_tex_lazy_clear.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset='utf-8'/>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='webgl-util.js'></script>
+</head>
+<body>
+<script id='vs' type='x-shader/x-vertex'>
+
+attribute vec2 aVertCoord;
+
+void main(void) {
+ gl_Position = vec4(aVertCoord, 0.0, 1.0);
+}
+
+</script>
+<script id='fs' type='x-shader/x-fragment'>
+
+precision mediump float;
+uniform sampler2D uTexUnit;
+
+void main(void) {
+ vec4 tex = texture2D(uTexUnit, vec2(0));
+ gl_FragColor = vec4(tex.r, 1.0, 0.0, 1.0);
+}
+
+</script>
+<script>
+'use strict';
+
+var gl = null;
+
+do {
+ var c = document.createElement('canvas');
+ gl = c.getContext('webgl');
+ if (!gl) {
+ todo(false, 'Get GL working here first.');
+ break;
+ }
+
+ var ext = gl.getExtension('WEBGL_depth_texture');
+ if (!ext) {
+ todo(false, 'WEBGL_depth_texture not supported, which is fine.');
+ break;
+ }
+
+ var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs');
+ if (!prog) {
+ ok(false, 'Program linking should succeed.');
+ break;
+ }
+
+ var tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, 1, 1, 0, gl.DEPTH_COMPONENT,
+ gl.UNSIGNED_INT, null);
+
+ var uTexUnit = gl.getUniformLocation(prog, 'uTexUnit');
+ gl.useProgram(prog);
+ gl.uniform1i(uTexUnit, 0);
+
+ gl.drawArrays(gl.POINTS, 0, 1);
+
+ ok(!gl.getError(), 'Should have no errors.');
+} while (false);
+
+ok(true, 'Test complete.');
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_draw.html b/dom/canvas/test/webgl-mochitest/test_draw.html
new file mode 100644
index 0000000000..b0e2b6ffd2
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_draw.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+<title>WebGL test: Basic drawing</title>
+
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<script src="webgl-util.js"></script>
+
+
+<script id="vs" type="x-shader/x-vertex">
+
+attribute vec2 aVertCoord;
+
+void main(void) {
+ gl_Position = vec4(aVertCoord, 0.0, 1.0);
+}
+
+</script>
+<script id="fs" type="x-shader/x-fragment">
+
+precision mediump float;
+
+void main(void) {
+ gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
+}
+
+</script>
+<body>
+<canvas id="c" width="64" height="64"></canvas>
+<script>
+
+// Give ourselves a scope to return early from:
+(function() {
+ var gl = c.getContext('webgl');
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ return;
+ }
+
+ gl.disable(gl.DEPTH_TEST);
+
+ var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs');
+ if (!prog) {
+ ok(false, 'Program linking should succeed.');
+ return;
+ }
+
+ prog.aVertCoord = gl.getAttribLocation(prog, "aVertCoord");
+ ok(prog.aVertCoord >= 0, '`aVertCoord` should be valid.');
+
+ function checkGLError(func, info, refValue) {
+ if (!refValue)
+ refValue = 0;
+
+ var error = gl.getError();
+ func(error == refValue,
+ '[' + info + '] gl.getError should be 0x' + refValue.toString(16) +
+ ', was 0x' + error.toString(16) + '.');
+ }
+
+ var vertCoordArr = new Float32Array([
+ -1, -1,
+ 1, -1,
+ -1, 1,
+ 1, 1,
+ ]);
+ var vertCoordBuff = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertCoordBuff);
+ gl.bufferData(gl.ARRAY_BUFFER, vertCoordArr, gl.STATIC_DRAW);
+
+ var indexArr = new Uint16Array([
+ 0, 1, 2,
+ 3,
+ ]);
+ var indexBuff = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuff);
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArr, gl.STATIC_DRAW);
+
+
+ function testPixel(x, y, refData, func, infoString) {
+ var pixel = new Uint8Array(4);
+ gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);
+
+ var pixelMatches = pixel[0] == refData[0] &&
+ pixel[1] == refData[1] &&
+ pixel[2] == refData[2] &&
+ pixel[3] == refData[3];
+ func(pixelMatches, infoString);
+ }
+
+ function preDraw(info) {
+ gl.clearColor(1.0, 0.0, 0.0, 1.0);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+
+ testPixel(0, 0, [255, 0, 0, 255], ok, '[' + info + '] Should be red before drawing.');
+ }
+
+ function postDraw(info) {
+ testPixel(0, 0, [0, 255, 0, 255], ok, '[' + info + '] Should be green before drawing.');
+ }
+
+ gl.useProgram(prog);
+ gl.enableVertexAttribArray(prog.aVertCoord);
+ gl.vertexAttribPointer(prog.aVertCoord, 2, gl.FLOAT, false, 0, 0);
+
+ // Start drawing
+ checkGLError(ok, 'after setup');
+
+ preDraw('DrawArrays');
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
+ postDraw('DrawArrays');
+ checkGLError(ok, 'after DrawArrays');
+
+ preDraw('DrawElements');
+ gl.drawElements(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_SHORT, 0);
+ postDraw('DrawElements');
+ checkGLError(ok, 'after DrawElements');
+
+ ok(true, 'Test complete.');
+})();
+
+</script>
+
diff --git a/dom/canvas/test/webgl-mochitest/test_draw_fakevert_large_offset.html b/dom/canvas/test/webgl-mochitest/test_draw_fakevert_large_offset.html
new file mode 100644
index 0000000000..181711f685
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_draw_fakevert_large_offset.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset=utf-8>
+<script src='/tests/SimpleTest/SimpleTest.js'></script>
+</head>
+<body>
+<pre id=e_out></pre>
+<script>
+ok = window.ok || function(e, s) {
+ e_out.textContent += `\n${!e ? 'FAIL' : 'pass'}: ${s}`;
+};
+
+// -
+
+// Bug 1778144
+const canvas = document.createElement("canvas")
+const gl = canvas.getContext("webgl")
+program = gl.createProgram()
+vertex = gl.createShader(gl.VERTEX_SHADER)
+gl.shaderSource(vertex, `\
+ precision highp float;
+ attribute vec4 a_vec4;
+ uniform bool u_bool;
+ uniform bvec2 u_bvec2;
+ uniform bvec3 u_bvec3;
+ uniform bvec4 u_bvec4;
+ varying vec2 v_vec2;
+ void main() {
+ gl_Position.x += float(a_vec4.x);
+ if (u_bool || u_bvec2.x || u_bvec3.x || u_bvec4.x) {
+ }
+ }
+`)
+gl.compileShader(vertex)
+gl.attachShader(program, vertex)
+fragment = gl.createShader(gl.FRAGMENT_SHADER)
+gl.shaderSource(fragment, `\
+ precision highp float;
+ varying vec2 v_vec2;
+ uniform sampler2D u_sampler2d;
+ void main() {
+ gl_FragColor = texture2D(u_sampler2d, v_vec2);
+ }
+`)
+gl.compileShader(fragment)
+gl.attachShader(program, fragment)
+gl.linkProgram(program)
+gl.useProgram(program)
+const begin = performance.now();
+gl.drawArrays(gl.POINTS, 1659036386, 1)
+
+let err = gl.getError();
+ok(err == gl.OUT_OF_MEMORY || !err, `err: ${err}`);
+
+const elapsed_ms = performance.now() - begin;
+ok(elapsed_ms < 1000, `elapsed_ms:${elapsed_ms} < 1000`);
+
+// -
+
+// Let's be kind and kill this now-gpu-memory-heavy context.
+gl.getExtension('WEBGL_lose_context').loseContext();
+err = gl.getError();
+ok(err == gl.CONTEXT_LOST_WEBGL, `err:${err} == gl.CONTEXT_LOST_WEBGL`);
+
+// -
+
+ok(true, 'done');
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_fb_param.html b/dom/canvas/test/webgl-mochitest/test_fb_param.html
new file mode 100644
index 0000000000..80d76a6137
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_fb_param.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<title>WebGL test: bug 958491</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<body>
+<canvas id="c"></canvas>
+<script>
+
+// Give ourselves a scope to return early from:
+(function() {
+ var gl = c.getContext('webgl');
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ return;
+ }
+
+ function checkGLError(func, info, reference) {
+ var error = gl.getError();
+ var prefix = info ? ('[' + info + '] ') : '';
+ var text = 'gl.getError should be 0x' + reference.toString(16) +
+ ', was 0x' + error.toString(16) + '.';
+ func(error == reference, prefix + text);
+ }
+
+ // Begin test:
+ var rb = gl.createRenderbuffer();
+ gl.bindRenderbuffer(gl.RENDERBUFFER, rb);
+ gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 4, 4);
+
+ var fb = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0,
+ gl.RENDERBUFFER, rb);
+
+ checkGLError(ok, 'before bad param query', 0);
+
+ var GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210;
+ var result = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER,
+ gl.COLOR_ATTACHMENT0,
+ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING);
+
+ checkGLError(ok, 'after bad param query', gl.INVALID_ENUM);
+})();
+
+</script>
+
diff --git a/dom/canvas/test/webgl-mochitest/test_fb_param_crash.html b/dom/canvas/test/webgl-mochitest/test_fb_param_crash.html
new file mode 100644
index 0000000000..4046309ba6
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_fb_param_crash.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<title>WebGL test: bug 958723</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<body>
+<canvas id="c"></canvas>
+<script>
+
+// Give ourselves a scope to return early from:
+(function() {
+ var gl = c.getContext('webgl');
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ return;
+ }
+
+ function checkGLError(func, info, reference) {
+ var error = gl.getError();
+ var prefix = info ? ('[' + info + '] ') : '';
+ var text = 'gl.getError should be 0x' + reference.toString(16) +
+ ', was 0x' + error.toString(16) + '.';
+ func(error == reference, prefix + text);
+ }
+
+ // Begin test:
+ if (!gl.getExtension('WEBGL_draw_buffers')) {
+ todo(false, 'Not having this extension is fine.');
+ return;
+ }
+ checkGLError(ok, 'before bad param query', 0);
+
+ var result = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER,
+ gl.COLOR_ATTACHMENT0,
+ gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME);
+
+ checkGLError(ok, 'after bad param query', gl.INVALID_OPERATION);
+})();
+
+</script>
+
diff --git a/dom/canvas/test/webgl-mochitest/test_fuzzing_bugs.html b/dom/canvas/test/webgl-mochitest/test_fuzzing_bugs.html
new file mode 100644
index 0000000000..4c05d43ec9
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_fuzzing_bugs.html
@@ -0,0 +1,195 @@
+<!DOCTYPE HTML>
+<title>WebGL fuzzy bugs</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<script src="webgl-util.js"></script>
+<body>
+<script>
+
+// Test the framebufferTexture2D() call with a unbound texture.
+function framebufferTexture2D_bug1257593() {
+ var canvas = document.createElement('canvas');
+
+ var gl = null;
+ gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
+ if (!gl) {
+ todo(false, 'WebGL framebufferTexture2D test, webgl is unavailable.');
+ return;
+ }
+
+ var texture = gl.createTexture(); // only createTexture(), but no bindBuffer()
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, texture, 0);
+
+ ok(true, 'WebGL framebufferTexture2D with unbound texture');
+}
+
+// Test to call ClearBufferXXX() during context lost.
+function webGL2ClearBufferXXX_bug1252414() {
+ var canvas = document.createElement('canvas');
+
+ var gl = canvas.getContext('webgl2');
+ if (!gl) {
+ todo(false, 'WebGL2 is not supported');
+ return;
+ }
+
+ var ext = gl.getExtension('WEBGL_lose_context');
+ if (!ext) {
+ todo(false, 'WebGL ClearBufferXXX test, ext WEBGL_lose_context is unavailable.');
+ return;
+ }
+
+ // Force to lose context.
+ ext.loseContext();
+
+ // Even thought the context is lost, all clearBuffer* function should still
+ // work without crash.
+ gl.clearBufferiv(gl.COLOR, 0, new Int32Array(10));
+ gl.clearBufferuiv(gl.COLOR, 0, new Uint32Array(10));
+ gl.clearBufferfv(gl.DEPTH, 0, new Float32Array(10));
+ gl.clearBufferfi(gl.DEPTH_STENCIL, 0, 0.0, 0);
+
+ ok(true, 'WebGL2 clearBufferXXX call during loseContext');
+}
+
+// Test gl function for multiple gl contexts switch.
+function getFramebufferAttachmentParameter_bug1267100()
+{
+ var canvas1 = document.createElement('canvas');
+ var canvas2 = document.createElement('canvas');
+
+ var gl1 = null;
+ gl1 = canvas1.getContext('webgl') || canvas1.getContext('experimental-webgl');
+ if (!gl1) {
+ todo(false, 'WebGL getFramebufferAttachmentParameter test, webgl is unavailable.');
+ return;
+ }
+ var gl2 = null;
+ gl2 = canvas2.getContext('webgl') || canvas2.getContext('experimental-webgl');
+ if (!gl2) {
+ todo(false, 'WebGL getFramebufferAttachmentParameter test, webgl is unavailable.');
+ return;
+ }
+
+ gl1.bindFramebuffer(gl1.FRAMEBUFFER, gl1.createFramebuffer());
+ gl2.scissor(0, 1, 2, 3);
+ // The gl call should still work even though we use another gl context before.
+ gl1.getFramebufferAttachmentParameter(gl1.FRAMEBUFFER,
+ gl1.COLOR_ATTACHMENT0,
+ gl1.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME);
+
+ ok(true, 'WebGL test getFramebufferAttachmentParameter');
+}
+
+// Test to call getFragDataLocation() when the fragment shader is detatched.
+function getFragDataLocation_bug1259702() {
+ var canvas = document.createElement('canvas');
+
+ var gl = canvas.getContext('webgl2');
+
+ if (!gl) {
+ todo(false, 'WebGL2 is not supported');
+ return;
+ }
+
+ var program = gl.createProgram();
+
+ var vertexShaderSrc =
+ "void main(void) { \
+ gl_Position = vec4(1.0, 1.0, 1.0, 1.0); \
+ }";
+ var fragmentShaderSrc =
+ "void main(void) { \
+ gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); \
+ }";
+
+ var vertexShader = gl.createShader(gl.VERTEX_SHADER);
+ var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
+
+ gl.shaderSource(vertexShader, vertexShaderSrc);
+ gl.compileShader(vertexShader);
+ gl.attachShader(program, vertexShader);
+
+ gl.shaderSource(fragmentShader, fragmentShaderSrc);
+ gl.compileShader(fragmentShader);
+ gl.attachShader(program, fragmentShader);
+
+ gl.linkProgram(program);
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
+ var lastError = gl.getProgramInfoLog(program);
+ ok(false, 'WebGL getFragDataLocation() test, error in linking:' +
+ lastError);
+ return;
+ }
+
+ gl.useProgram(program);
+
+ gl.detachShader(program, fragmentShader);
+ // Test the getFragDataLocation() call after detatch the shader.
+ // This call should not hit crash.
+ gl.getFragDataLocation(program, "foobar");
+
+ ok(true, 'WebGL getFragDataLocation() call after detatch fragment shader');
+}
+
+function deleteBuffer_bug1379995()
+{
+ var canvas = document.createElement('canvas');
+ var gl = null;
+ gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
+ if (!gl) {
+ todo(false, 'WebGL deleteBuffer test, webgl is unavailable.');
+ return;
+ }
+
+ var program = gl.createProgram();
+ var vShader = gl.createShader(gl.VERTEX_SHADER);
+ var fShader = gl.createShader(gl.FRAGMENT_SHADER);
+ gl.shaderSource(vShader,'attribute vec3 pos;void main(){gl_Position = vec4(pos, 2.0);}');
+ gl.shaderSource(fShader,'void main() {gl_FragColor = vec4(0.5, 0.5, 1.0, 1.0);}');
+ gl.compileShader(vShader);
+ gl.compileShader(fShader);
+ gl.attachShader(program, vShader);
+ gl.attachShader(program, fShader);
+ gl.linkProgram(program);
+ var buffer = gl.createBuffer();
+ var attr = gl.getAttribLocation(program, 'pos');
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
+ gl.enableVertexAttribArray(attr);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, 0, 0,0, 1, 0,0, -1, 0,1, 0, 0]),gl.STATIC_DRAW);
+ gl.useProgram(program);
+ gl.vertexAttribPointer(attr, 3, gl.FLOAT, false, 0, 0);
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
+ gl.deleteBuffer(buffer);
+ // Call the drawArrays after deleteBuffer(). It should not hit the crash.
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
+
+ ok(true, 'WebGL no crash for drawArrays() after deleteBuffer() call');
+}
+
+function run() {
+ webGL2ClearBufferXXX_bug1252414();
+ framebufferTexture2D_bug1257593();
+ getFramebufferAttachmentParameter_bug1267100();
+ getFragDataLocation_bug1259702();
+ deleteBuffer_bug1379995();
+
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+
+try {
+ var prefArrArr = [
+ ['webgl.force-enabled', true],
+ ['webgl.enable-webgl2', true],
+ ];
+ var prefEnv = {'set': prefArrArr};
+ SpecialPowers.pushPrefEnv(prefEnv, run);
+} catch (e) {
+ warning('No SpecialPowers, but trying WebGL2 anyway...');
+ run();
+}
+</script>
+
diff --git a/dom/canvas/test/webgl-mochitest/test_has_rbab.html b/dom/canvas/test/webgl-mochitest/test_has_rbab.html
new file mode 100644
index 0000000000..bc60f2deaf
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_has_rbab.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset='UTF-8'>
+ <title>Fail without robust_buffer_access_behavior</title>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+</head>
+<body>
+<script>
+
+function AssertRBAB() {
+ const c = document.createElement('canvas');
+ const g = c.getContext('webgl');
+ const e = g.getExtension('MOZ_debug');
+ ok(e, 'Should have MOZ_debug.');
+
+ const does_index_validation = e.getParameter(e.DOES_INDEX_VALIDATION);
+ const err = g.getError();
+ ok(!err, 'Error should be 0, was 0x' + err.toString(16));
+ ok(!does_index_validation,
+ "Should have RBAB. Mark this test as failing on platforms that can't support it.");
+
+ SimpleTest.finish();
+}
+
+// -
+
+SimpleTest.waitForExplicitFinish();
+
+const prefPairList = [
+ ['webgl.force-enabled', true],
+ ['webgl.enable-privileged-extensions', true],
+];
+const prefEnv = {'set': prefPairList};
+SpecialPowers.pushPrefEnv(prefEnv, AssertRBAB);
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html b/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html
new file mode 100644
index 0000000000..addc1b0162
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html
@@ -0,0 +1,156 @@
+<!DOCTYPE HTML>
+<title>WebGL test: Hidden alpha on no-alpha contexts</title>
+<script src='/tests/SimpleTest/SimpleTest.js'></script>
+<link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+<script src='driver-info.js'></script>
+<script src='webgl-util.js'></script>
+<body>
+<script id='vs' type='x-shader/x-vertex'>
+ attribute vec2 aPosCoord;
+
+ void main(void) {
+ gl_Position = vec4(aPosCoord, 0.0, 1.0);
+ }
+</script>
+
+<script id='fs' type='x-shader/x-fragment'>
+ precision mediump float;
+
+ void main(void) {
+ gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
+ }
+</script>
+<canvas id='canvas' style='border: none;' width='100' height='100'></canvas>
+<script>
+
+var posCoords_arr = new Float32Array(2 * 4);
+var posCoords_buff = null;
+function DrawQuad(gl, prog, x0, y0, x1, y1) {
+ gl.useProgram(prog);
+
+ if (!posCoords_buff) {
+ posCoords_buff = gl.createBuffer();
+ }
+ gl.bindBuffer(gl.ARRAY_BUFFER, posCoords_buff);
+ posCoords_arr[0] = x0;
+ posCoords_arr[1] = y0;
+
+ posCoords_arr[2] = x1;
+ posCoords_arr[3] = y0;
+
+ posCoords_arr[4] = x0;
+ posCoords_arr[5] = y1;
+
+ posCoords_arr[6] = x1;
+ posCoords_arr[7] = y1;
+ gl.bufferData(gl.ARRAY_BUFFER, posCoords_arr, gl.STREAM_DRAW);
+
+ gl.enableVertexAttribArray(prog.aPosCoord);
+ gl.vertexAttribPointer(prog.aPosCoord, 2, gl.FLOAT, false, 0, 0);
+
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
+}
+
+function DrawSquare(gl, prog, size) {
+ DrawQuad(gl, prog, -size, -size, size, size);
+}
+
+function Reset(gl) {
+ gl.canvas.width += 1;
+ gl.canvas.width -= 1;
+}
+
+function ReadCenterPixel(gl) {
+ var w = gl.drawingbufferWidth;
+ var h = gl.drawingbufferHeight;
+ var ret = new Uint8Array(4);
+ gl.readPixels(w/2, h/2, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, ret);
+ return ret;
+}
+
+function Test(gl, prog) {
+ gl.enable(gl.BLEND);
+ gl.blendFunc(gl.ZERO, gl.DST_ALPHA);
+
+ var iColor = 64;
+ var fColor = iColor / 255.0;
+
+ //////////////////
+
+ ok(true, 'clear(R,G,B,0)');
+
+ Reset(gl);
+
+ gl.clearColor(fColor, fColor, fColor, 0.0);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+
+ var dataURL_pre = gl.canvas.toDataURL();
+ //console.log('Before blending: ' + dataURL_pre);
+
+ DrawSquare(gl, prog, 0.7);
+
+ var pixel = ReadCenterPixel(gl);
+ ok(pixel[0] == iColor &&
+ pixel[1] == iColor &&
+ pixel[2] == iColor, 'Color should be the same.');
+ ok(pixel[3] == 255, 'No-alpha should always readback as 1.0 alpha.');
+
+ var dataURL_post = gl.canvas.toDataURL();
+ //console.log('After blending: ' + dataURL_post);
+ ok(dataURL_post == dataURL_pre,
+ 'toDataURL should be unchanged after blending.');
+
+ //////////////////
+
+ ok(true, 'mask(R,G,B,0), clear(R,G,B,1)');
+
+ Reset(gl);
+
+ gl.colorMask(true, true, true, false);
+ gl.clearColor(fColor, fColor, fColor, 1.0);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.colorMask(true, true, true, true);
+
+ dataURL_pre = gl.canvas.toDataURL();
+ //console.log('Before blending: ' + dataURL_pre);
+
+ DrawSquare(gl, prog, 0.7);
+
+ var pixel = ReadCenterPixel(gl);
+ ok(pixel[0] == iColor &&
+ pixel[1] == iColor &&
+ pixel[2] == iColor, 'Color should be the same.');
+ ok(pixel[3] == 255, 'No-alpha should always readback as 1.0 alpha.');
+ ok(gl.getError() == 0, 'Should have no errors.');
+
+ dataURL_post = gl.canvas.toDataURL();
+ //console.log('After blending: ' + dataURL_post);
+ ok(dataURL_post == dataURL_pre,
+ 'toDataURL should be unchanged after blending.');
+
+ ok(true, 'Test complete.');
+ SimpleTest.finish();
+}
+
+(function(){
+ var canvas = document.getElementById('canvas');
+ var attribs = {
+ alpha: false,
+ antialias: false,
+ premultipliedAlpha: false,
+ };
+ var gl = canvas.getContext('experimental-webgl', attribs);
+ ok(gl, 'WebGL should work.');
+ ok(gl.getParameter(gl.ALPHA_BITS) == 0, 'Shouldn\'t have alpha bits.');
+
+ var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs');
+ ok(prog, 'Program should link.');
+ prog.aPosCoord = gl.getAttribLocation(prog, 'aPosCoord');
+
+ SimpleTest.waitForExplicitFinish();
+ SimpleTest.requestFlakyTimeout("untriaged");
+ setTimeout(function(){ Test(gl, prog); }, 500);
+})();
+
+</script>
+</body>
diff --git a/dom/canvas/test/webgl-mochitest/test_hidden_depth_stencil.html b/dom/canvas/test/webgl-mochitest/test_hidden_depth_stencil.html
new file mode 100644
index 0000000000..987af9e371
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_hidden_depth_stencil.html
@@ -0,0 +1,159 @@
+<!DOCTYPE HTML>
+<title>WebGL test: Hidden depth/stencil passes without a depth/stencil buffer respectively</title>
+<script src='/tests/SimpleTest/SimpleTest.js'></script>
+<link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+<script src='webgl-util.js'></script>
+<body>
+<script id='vs' type='x-shader/x-vertex'>
+ void main(void) {
+ gl_PointSize = 1.0; // Note that this is undefined if we don't write to it!
+ gl_Position = vec4(vec3(0), 1);
+ }
+</script>
+
+<script id='fs' type='x-shader/x-fragment'>
+ precision mediump float;
+
+ void main(void) {
+ gl_FragColor = vec4(0, 1, 0, 1);
+ }
+</script>
+<script>
+
+function ColorString(arr) {
+ return '[' + arr[0] + ', ' + arr[1] + ', ' + arr[2] + ', ' + arr[3] + ']';
+}
+
+function DrawAndCheck(gl, infoPrefix, refColorStr) {
+ gl.viewport(0, 0, 1, 1);
+
+ gl.clearColor(1, 0, 0, 1);
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
+ gl.drawArrays(gl.POINTS, 0, 1);
+
+ var pixel = new Uint8Array(4);
+ gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);
+ var pixelStr = ColorString(pixel);
+
+ ok(pixelStr == refColorStr, infoPrefix + pixelStr + ' should be ' + refColorStr);
+}
+
+function TestCurrent(gl, attribs, infoPrefix) {
+ infoPrefix = infoPrefix + JSON.stringify(attribs) + ': ';
+
+ var CLEAR_COLOR = ColorString([255, 0, 0, 255]);
+ var DRAW_COLOR = ColorString([0, 255, 0, 255]);
+
+ gl.disable(gl.DEPTH_TEST);
+ gl.disable(gl.STENCIL_TEST);
+
+ DrawAndCheck(gl, infoPrefix + 'initial: ', DRAW_COLOR);
+
+ if (!attribs.depth) {
+ gl.enable(gl.DEPTH_TEST);
+ gl.depthFunc(gl.NEVER);
+
+ gl.disable(gl.STENCIL_TEST);
+
+ // Depth test is enabled, and should pass NEVER.
+ // Since there is no depth buffer, the depth test is not run.
+ // Stencil test is disabled.
+ DrawAndCheck(gl, infoPrefix + 'no-depth: ', DRAW_COLOR);
+ }
+
+ if (!attribs.stencil) {
+ gl.disable(gl.DEPTH_TEST);
+
+ gl.enable(gl.STENCIL_TEST);
+ gl.stencilFunc(gl.NEVER, 0, 0);
+
+ // Depth test is disabled.
+ // Stencil test is enabled, and should pass NEVER.
+ // Since there is no stencil buffer, the stencil test is not run.
+ DrawAndCheck(gl, infoPrefix + 'no-stencil: ', DRAW_COLOR);
+ }
+}
+
+function TestBackbuffer(requestedAttribs) {
+ var canvas = document.createElement('canvas');
+ canvas.width = 1;
+ canvas.height = 1;
+ var gl = canvas.getContext('experimental-webgl', requestedAttribs);
+ if (!gl) {
+ ok(true, 'WebGL doesn\'t work, skipping test.');
+ return;
+ }
+
+ ok(gl.drawingBufferWidth == 1 && gl.drawingBufferHeight == 1,
+ 'backbuffer should be 1x1');
+
+ var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs');
+ gl.useProgram(prog);
+
+ var attribs = {
+ depth: gl.getContextAttributes().depth,
+ stencil: gl.getContextAttributes().stencil,
+ };
+ TestCurrent(gl, attribs, 'Backbuffer: ');
+}
+
+function TestUserFB() {
+ var canvas = document.createElement('canvas');
+ var gl = canvas.getContext('experimental-webgl');
+ if (!gl) {
+ ok(true, 'WebGL doesn\'t work, skipping test.');
+ return;
+ }
+
+ var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs');
+ gl.useProgram(prog);
+
+ var rb = gl.createRenderbuffer();
+ gl.bindRenderbuffer(gl.RENDERBUFFER, rb);
+ gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 1, 1);
+
+ var fb = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rb);
+
+ var depthRB = gl.createRenderbuffer();
+ gl.bindRenderbuffer(gl.RENDERBUFFER, depthRB);
+ gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 1, 1);
+
+ var stencilRB = gl.createRenderbuffer();
+ gl.bindRenderbuffer(gl.RENDERBUFFER, stencilRB);
+ gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, 1, 1);
+
+ do {
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthRB);
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, null);
+ var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ if (status != gl.FRAMEBUFFER_COMPLETE) {
+ ok(true, 'Depth-only user FB is incomplete. This is allowed.');
+ break;
+ }
+
+ TestCurrent(gl, {depth: true, stencil: false}, 'Depth-only user FB');
+ } while (false);
+
+ do {
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null);
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, stencilRB);
+ var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ if (status != gl.FRAMEBUFFER_COMPLETE) {
+ ok(true, 'Stencil-only user FB is incomplete. This is allowed.');
+ break;
+ }
+
+ TestCurrent(gl, {depth: false, stencil: true}, 'Stencil-only user FB');
+ } while (false);
+}
+
+(function(){
+ TestBackbuffer({depth: true, stencil: false});
+ TestBackbuffer({depth: false, stencil: true});
+ TestUserFB();
+})();
+
+</script>
+</body>
diff --git a/dom/canvas/test/webgl-mochitest/test_highp_fs.html b/dom/canvas/test/webgl-mochitest/test_highp_fs.html
new file mode 100644
index 0000000000..6927c5c1c2
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_highp_fs.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<title>WebGL test: `highp` support</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<script src="webgl-util.js"></script>
+<script id="shader-vs" type="x-shader/x-vertex">
+
+void main(void) {
+ gl_Position = vec4(vec3(0.0), 1.0);
+}
+
+</script>
+<script id="shader-fs" type="x-shader/x-fragment">
+
+precision highp float;
+
+void main(void) {
+ gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
+}
+
+</script>
+<body>
+<canvas id="c"></canvas>
+<script>
+
+// Give ourselves a scope to return early from:
+(function() {
+ var gl = c.getContext('webgl');
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ return;
+ }
+
+ function checkGLError(func, info) {
+ var error = gl.getError();
+ var prefix = info ? ('[' + info + '] ') : ''
+ func(!error, prefix + 'gl.getError should be 0x0, was 0x' + error.toString(16) + '.');
+ }
+
+ var format = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT);
+ var prog = WebGLUtil.createProgramByIds(gl, 'shader-vs', 'shader-fs');
+ checkGLError(ok);
+
+ if (format) {
+ ok(prog, 'Frag shader with unconditional `precision highp float` should ' +
+ 'link if `getShaderPrecisionFormat` gives a format for it.');
+ } else {
+ ok(!prog, 'Frag shader with unconditional `precision highp float` should ' +
+ 'NOT link if `getShaderPrecisionFormat` gives NO format for it.');
+ }
+})();
+
+</script>
+
diff --git a/dom/canvas/test/webgl-mochitest/test_imagedata_transfered_arraybuffer.html b/dom/canvas/test/webgl-mochitest/test_imagedata_transfered_arraybuffer.html
new file mode 100644
index 0000000000..18eed39a43
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_imagedata_transfered_arraybuffer.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset=utf-8>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+</head>
+<body>
+ <script>
+'use strict';
+const ab = new ArrayBuffer(4);
+const ta = new Uint8ClampedArray(ab);
+const idata = new ImageData(ta, 1);
+const canvas = document.createElement('canvas');
+const gl = canvas.getContext('webgl2');
+const worker = new Worker('worker.js');
+worker.postMessage([ab], [ab]);
+gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 1, gl.RGB, idata.width, idata.height, 0, gl.RGB, gl.UNSIGNED_SHORT_5_6_5, idata);
+const err = gl.getError();
+window.ok = window.ok || console.log;
+ok(err == gl.INVALID_VALUE, 'texImage2D(ImageData) with Transferred ArrayBuffer is INVALID_VALUE');
+ </script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html b/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html
new file mode 100644
index 0000000000..bbabef3e8b
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html
@@ -0,0 +1,199 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset='utf-8'>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+</head>
+<body>
+<script>
+
+var RGBA32F_EXT = 0x8814;
+var RGBA16F_EXT = 0x881A; // Yep, it's really 4 and A.
+var HALF_FLOAT_OES = 0x8D61;
+
+function IsFormatValidForRB(gl, format) {
+ ok(!gl.getError(), 'Should have no errors here.');
+
+ var rb = gl.createRenderbuffer();
+ gl.bindRenderbuffer(gl.RENDERBUFFER, rb);
+ gl.renderbufferStorage(gl.RENDERBUFFER, format, 4, 4);
+
+ var error = gl.getError();
+ if (error == gl.INVALID_ENUM)
+ return false;
+
+ ok(error == gl.NO_ERROR, 'Error should be INVALID_ENUM or NO_ERROR.');
+ return error == gl.NO_ERROR;
+}
+
+function IsFormatValidForTex(gl, format, type) {
+ ok(!gl.getError(), 'Should have no errors here.');
+
+ var tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ gl.texImage2D(gl.TEXTURE_2D, 0, format, 4, 4, 0, format, type, null);
+
+ var error = gl.getError();
+ if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION)
+ return false;
+
+ ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.');
+ return error == gl.NO_ERROR;
+}
+
+function IsFormatValidForTexFB(gl, format, type) {
+ ok(!gl.getError(), 'Should have no errors here.');
+
+ var tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ gl.texImage2D(gl.TEXTURE_2D, 0, format, 4, 4, 0, format, type, null);
+
+ var error = gl.getError();
+ if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION)
+ return false;
+
+ ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.');
+
+ var fb = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D,
+ tex, 0);
+ error = gl.getError();
+ ok(error == gl.NO_ERROR, 'Error should be NO_ERROR.');
+
+ var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ return status == gl.FRAMEBUFFER_COMPLETE;
+}
+
+function IsFormatValidForTexFBRead(gl, texFormat, texType, readType) {
+ ok(!gl.getError(), 'Should have no errors here.');
+
+ var tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ gl.texImage2D(gl.TEXTURE_2D, 0, texFormat, 4, 4, 0, texFormat, texType,
+ null);
+
+ var error = gl.getError();
+ if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION)
+ return false;
+
+ ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.');
+
+ var fb = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D,
+ tex, 0);
+ error = gl.getError();
+ ok(error == gl.NO_ERROR, 'Error should be NO_ERROR.');
+
+ var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ if (status != gl.FRAMEBUFFER_COMPLETE)
+ return false;
+
+ var data;
+ switch (readType) {
+ case gl.UNSIGNED_BYTE:
+ data = new Uint8Array(4);
+ break;
+ case HALF_FLOAT_OES:
+ data = new Uint16Array(4);
+ break;
+ case gl.FLOAT:
+ data = new Float32Array(4);
+ break;
+ default:
+ throw 'Bad `readType`.';
+ }
+ gl.readPixels(0, 0, 1, 1, gl.RGBA, readType, data);
+
+ error = gl.getError();
+ return error == gl.NO_ERROR;
+}
+
+function TestColorBufferExt(gl, rbFormat, texFormat, texType, readType)
+{
+ var isTexFBValid = IsFormatValidForTexFB(gl, texFormat, texType);
+ var isTexFBReadValid = IsFormatValidForTexFBRead(gl, texFormat, texType,
+ readType);
+ var isRBValid = IsFormatValidForRB(gl, rbFormat);
+
+ var validSubsetCount = isTexFBValid + isTexFBReadValid + isRBValid;
+
+ if (validSubsetCount) {
+ ok(isTexFBValid, 'If active, texture-fbs should work.');
+ ok(isTexFBReadValid, 'If active, reading texture-fbs should work.');
+ ok(isRBValid, 'If active, renderbuffers should work.');
+ }
+
+ return validSubsetCount == 3;
+}
+
+function TestImpliedExtension(gl, baseExtName, impliedExtName, rbFormat,
+ texFormat, texType, readType)
+{
+ ok(true, '========');
+ ok(true, 'Testing if ' + baseExtName + ' implies ' + impliedExtName + '.');
+ ok(true, '--------');
+
+ var baseExt = gl.getExtension(baseExtName);
+ if (!baseExt) {
+ ok(!baseExt, 'Ext \'' + baseExtName + '\' can be unsupported.');
+ return;
+ }
+
+ var isTexValid = IsFormatValidForTex(gl, texFormat, texType);
+ ok(isTexValid, baseExtName + ' should allow float textures.');
+ if (!isTexValid)
+ return;
+
+ var isImplicitlyActive = TestColorBufferExt(gl, rbFormat, texFormat,
+ texType, readType);
+
+ if (isImplicitlyActive) {
+ ok(true, 'Activating ' + baseExtName + ' has implicitly activated ' +
+ impliedExtName + '.');
+
+ var impliedExt = gl.getExtension(impliedExtName);
+ ok(impliedExt, 'If ' + impliedExtName + ' is supported implicitly, it' +
+ ' must be supported explicitly as well.');
+ return;
+ }
+
+ ok(true, 'Activating ' + baseExtName + ' has not implicitly activated ' +
+ impliedExtName + '.');
+ ok(true, '--------');
+
+ var impliedExt = gl.getExtension(impliedExtName);
+ if (!impliedExt) {
+ ok(true, impliedExtName + ' can be unsupported.');
+ return;
+ }
+ ok(true, 'Explicit activation of ' + impliedExtName + ' successful.');
+
+ var isFunctional = TestColorBufferExt(gl, rbFormat, texFormat, texType,
+ readType);
+ ok(isFunctional, impliedExtName + ' should be fully functional.');
+}
+
+(function() {
+ var canvas = document.createElement('canvas');
+ var gl = canvas.getContext('experimental-webgl');
+ if (!gl) {
+ ok(!gl, 'WebGL can be unsupported.');
+ return;
+ }
+
+ TestImpliedExtension(gl, 'OES_texture_float', 'WEBGL_color_buffer_float',
+ RGBA32F_EXT, gl.RGBA, gl.FLOAT, gl.FLOAT);
+ TestImpliedExtension(gl, 'OES_texture_half_float',
+ 'EXT_color_buffer_half_float', RGBA16F_EXT, gl.RGBA,
+ HALF_FLOAT_OES, gl.FLOAT);
+ ok(true, '========');
+ ok(true, 'TEST COMPLETE');
+})();
+
+</script>
+
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_no_arr_points.html b/dom/canvas/test/webgl-mochitest/test_no_arr_points.html
new file mode 100644
index 0000000000..c4556c9b5c
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_no_arr_points.html
@@ -0,0 +1,156 @@
+<!DOCTYPE HTML>
+<title>WebGL test: Drawing without attrib arrays</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<script src="webgl-util.js"></script>
+<script id="vs-no-attrib" type="x-shader/x-vertex">
+
+void main(void) {
+ gl_PointSize = 64.0;
+ gl_Position = vec4(vec3(0.0), 1.0);
+}
+
+</script>
+<script id="vs-attrib" type="x-shader/x-vertex">
+
+attribute vec3 aPosition;
+
+void main(void) {
+ gl_PointSize = 64.0;
+ gl_Position = vec4(aPosition, 1.0);
+}
+
+</script>
+<script id="fs" type="x-shader/x-fragment">
+
+precision mediump float;
+
+void main(void) {
+ gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
+}
+
+</script>
+<body>
+<canvas id="c" width="64" height="64"></canvas>
+<script>
+
+// Give ourselves a scope to return early from:
+(function() {
+ var gl = c.getContext('webgl');
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ return;
+ }
+
+ DriverInfo.dump(x => ok(true, x));
+
+ var attribProg = WebGLUtil.createProgramByIds(gl, 'vs-attrib', 'fs');
+ var noAttribProg = WebGLUtil.createProgramByIds(gl, 'vs-no-attrib', 'fs');
+ if (!attribProg || !noAttribProg) {
+ ok(false, 'Program linking should succeed.');
+ return;
+ }
+
+ attribProg.aPosition = gl.getAttribLocation(attribProg, "aPosition");
+ ok(attribProg.aPosition >= 0, '`aPosition` should be valid.');
+
+ function isScreenBlack() {
+ var pixels = gl.drawingBufferWidth * gl.drawingBufferHeight;
+ var data = new Uint8Array(4 * pixels);
+ gl.readPixels(0, 0,
+ gl.drawingBufferWidth, gl.drawingBufferHeight,
+ gl.RGBA, gl.UNSIGNED_BYTE,
+ data);
+
+ var accum = 0;
+ for (var i = 0; i < pixels; i++) {
+ accum += data[4*i + 0];
+ accum += data[4*i + 1];
+ accum += data[4*i + 2];
+ }
+
+ return accum == 0;
+ }
+
+ function checkGLError(func, info) {
+ var error = gl.getError();
+ func(!error, '[' + info + '] gl.getError should be 0, was 0x' + error.toString(16) + '.');
+ }
+
+ function testDrawing(info) {
+ var cruelNumber = 1024*1024;
+ // Really, we should test for INT32_MAX-1 here, but we don't gracefully chunk these calls,
+ // and so try to create a VBO of size INT32_MAX-1 to pretend that vert attrib 0 is an array.
+ // (INT32_MAX-1 because we check that `first+count` is a valid GLsizei, which is int32_t)
+ var UINT16_MAX = 0xffff;
+ var INT32_MAX = 0x7fffffff;
+ var UINT32_MAX = 0xffffffff;
+
+ // `first` needs room for `first+count` <= sizeof(GLsizei) == INT32_MAX
+ var hugeFirst = Math.min(cruelNumber, INT32_MAX-1);
+ var hugeIndex = Math.min(cruelNumber, UINT32_MAX);
+
+ var indexType = gl.UNSIGNED_SHORT;
+ var indexStride = 2;
+ var indexArr = new Uint16Array([0, 1, Math.min(hugeIndex, UINT16_MAX)]);
+ if (gl.getExtension('OES_element_index_uint')) {
+ indexType = gl.UNSIGNED_INT;
+ indexStride = 4;
+ indexArr = new Uint32Array([0, 1, hugeIndex]);
+ }
+
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.drawArrays(gl.POINTS, 0, 1);
+ ok(!isScreenBlack(), '[' + info + '] drawArrays should color pixels.');
+
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.drawArrays(gl.POINTS, hugeFirst, 1);
+ ok(!isScreenBlack(), '[' + info + '] drawArrays[huge first] should color pixels.');
+
+ checkGLError(ok, info);
+
+ var elemTestFunc = ok;
+ var checkGLTestFunc = ok;
+ if (DriverInfo.getDriver() == DriverInfo.DRIVER.ANDROID_X86_EMULATOR) {
+ // ...but the Android 4.2 x86 emulator environment is different
+ elemTestFunc = todo;
+ checkGLTestFunc = ok;
+ }
+
+ // Now for drawElements:
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer());
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArr, gl.STATIC_DRAW);
+
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.drawElements(gl.POINTS, 1, indexType, 0);
+ elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[0] should color pixels.');
+
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.drawElements(gl.POINTS, 1, indexType, 1*indexStride);
+ elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[1] should color pixels.');
+
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.drawElements(gl.POINTS, 1, indexType, 2*indexStride);
+ elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[huge offset] should color pixels.');
+
+ checkGLError(checkGLTestFunc, info);
+ }
+
+ // Begin drawing
+ gl.clearColor(0.0, 0.0, 0.0, 1.0);
+ gl.disable(gl.DEPTH_TEST);
+
+ // No-attrib prog:
+ gl.useProgram(noAttribProg);
+ testDrawing('no-attrib');
+
+ // One-attrib, no-array prog:
+ gl.useProgram(attribProg);
+ gl.disableVertexAttribArray(attribProg.aPosition);
+ gl.vertexAttrib3fv(attribProg.aPosition, [0.0, 0.0, 0.0]);
+ testDrawing('one-attrib, no-array');
+})();
+
+</script>
+
diff --git a/dom/canvas/test/webgl-mochitest/test_noprog_draw.html b/dom/canvas/test/webgl-mochitest/test_noprog_draw.html
new file mode 100644
index 0000000000..37def57fca
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_noprog_draw.html
@@ -0,0 +1,74 @@
+<!DOCTYPE HTML>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+<title>WebGL test: Drawing with a null program</title>
+
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<script src="webgl-util.js"></script>
+
+
+<script id="vs" type="x-shader/x-vertex">
+
+void main(void) {
+ gl_PointSize = 16.0;
+ gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
+}
+
+</script>
+<script id="fs" type="x-shader/x-fragment">
+
+precision mediump float;
+
+void main(void) {
+ gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
+}
+
+</script>
+<body>
+<canvas id="c" width="64" height="64"></canvas>
+<script>
+
+// Give ourselves a scope to return early from:
+(function() {
+ var gl = c.getContext('webgl');
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ return;
+ }
+
+ gl.disable(gl.DEPTH_TEST);
+
+ var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs');
+ if (!prog) {
+ ok(false, 'Program linking should succeed.');
+ return;
+ }
+
+ function checkGLError(func, info, refValue) {
+ if (!refValue)
+ refValue = 0;
+
+ var error = gl.getError();
+ func(error == refValue,
+ '[' + info + '] gl.getError should be 0x' + refValue.toString(16) +
+ ', was 0x' + error.toString(16) + '.');
+ }
+
+ // Start drawing
+ checkGLError(ok, 'after setup');
+
+ gl.useProgram(prog);
+ gl.drawArrays(gl.POINTS, 0, 1);
+ checkGLError(ok, 'after non-null-program DrawArrays');
+
+ gl.useProgram(null);
+ gl.drawArrays(gl.POINTS, 0, 1);
+ checkGLError(ok, 'after null-program DrawArrays', gl.INVALID_OPERATION);
+
+ ok(true, 'Test complete.');
+})();
+
+</script>
+
diff --git a/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html b/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html
new file mode 100644
index 0000000000..bfacc5bfa9
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html
@@ -0,0 +1,288 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='UTF-8'>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ </head>
+ <body>
+ <script>
+
+var RED = [1, 0, 0, 1];
+var GREEN = [0, 1, 0, 1];
+var BLUE = [0, 0, 1, 1];
+var WHITE = [1, 1, 1, 1];
+var ZERO = [0, 0, 0, 0];
+
+function DrawColors(gl) {
+ var fnClearToColor = function(color) {
+ gl.clearColor(color[0], color[1], color[2], color[3]);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ };
+
+ gl.enable(gl.SCISSOR_TEST);
+
+ // +---+
+ // |G W|
+ // |R B|
+ // +---+
+
+ gl.scissor(0, 0, 1, 1);
+ fnClearToColor(RED);
+
+ gl.scissor(1, 0, 1, 1);
+ fnClearToColor(BLUE);
+
+ gl.scissor(0, 1, 1, 1);
+ fnClearToColor(GREEN);
+
+ gl.scissor(1, 1, 1, 1);
+ fnClearToColor(WHITE);
+}
+
+function ClearBufferPair(gl, byteCount) {
+ // Using `null` here clears to zero according to WebGL.
+ gl.bufferData(gl.PIXEL_PACK_BUFFER, byteCount, gl.STREAM_READ);
+
+ var arr = new Uint8Array(byteCount);
+ return arr;
+}
+
+function ColorToString(color, offset=0) {
+ var arr = [ color[offset+0],
+ color[offset+1],
+ color[offset+2],
+ color[offset+3] ];
+ return '[' + arr.join(', ') + ']';
+}
+
+function TestIsUNormColor(refColor, testData, offset) {
+ if (testData.length < offset + 4) {
+ ok(false, 'testData not long enough.');
+ }
+
+ var refUNormColor = [
+ (refColor[0] * 255) | 0,
+ (refColor[1] * 255) | 0,
+ (refColor[2] * 255) | 0,
+ (refColor[3] * 255) | 0,
+ ];
+
+ var refStr = ColorToString(refUNormColor);
+ var testStr = ColorToString(testData, offset);
+ ok(testStr == refStr, 'Expected ' + refStr + ', was ' + testStr + '.');
+}
+
+function section(text) {
+ ok(true, '');
+ ok(true, 'Section: ' + text);
+}
+
+function EnsureNoError(gl) {
+ var glErr = gl.getError();
+ while (gl.getError()) {}
+
+ if (!glErr)
+ return;
+
+ var extraInfo = '';
+
+ var err = new Error();
+ var stackStr = err.stack;
+ if (stackStr !== undefined) {
+ var stackArr = stackStr.split('\n');
+ stackStr = stackArr[1]; // First one after present scope.
+ extraInfo = ': ' + stackStr;
+ }
+
+ ok(false, 'Unexpected GL error: 0x' + glErr.toString(16) + extraInfo);
+}
+
+function TestError(gl, refErrVal, str='') {
+ if (str == '') {
+ str = 'gl.getError()';
+ } else {
+ str = str + ': gl.getError()';
+ }
+
+ var err = gl.getError();
+ while (gl.getError()) {}
+
+ ShouldBe(err.toString(16), refErrVal.toString(16), str);
+}
+
+function ShouldBe(val, ref, str='') {
+ if (str != '') {
+ str += ': ';
+ }
+
+ ok(val == ref, str + 'Should be `' + ref + '`, was `' + val + '`.');
+}
+
+var gl;
+
+function Test() {
+ var canvas = document.createElement('canvas');
+ canvas.width = 2;
+ canvas.height = 2;
+ canvas.style = 'width: 256px; height: 256px; border: 1px solid black;';
+ document.body.appendChild(canvas);
+
+ var attribs = {
+ antialias: false,
+ alpha: false,
+ };
+ gl = canvas.getContext('webgl2', attribs);
+ if (!gl) {
+ todo(false, 'WebGL 2 not present, skipping.');
+ return;
+ }
+
+ ////////
+
+ TestIsUNormColor(RED, new Uint8Array([255, 0, 0, 255]), 0);
+
+ ////////
+
+ gl.clearColor(RED[0], RED[1], RED[2], RED[3]);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+
+ var data = new Uint8Array(16);
+ gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data);
+ console.log(JSON.stringify(data));
+ TestIsUNormColor(RED, data, 0);
+
+ ////////
+
+ DrawColors(gl);
+
+ ////////
+
+ EnsureNoError(gl);
+ gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, 0);
+ TestError(gl, gl.INVALID_OPERATION);
+
+ var data = new Uint8Array(16);
+ gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(RED, data, 0);
+ TestIsUNormColor(BLUE, data, 4);
+ TestIsUNormColor(GREEN, data, 8);
+ TestIsUNormColor(WHITE, data, 12);
+
+ ////////
+
+ var a = gl.createBuffer();
+ gl.bindBuffer(gl.PIXEL_PACK_BUFFER, a);
+ EnsureNoError(gl);
+
+ gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data);
+ TestError(gl, gl.INVALID_OPERATION);
+
+ ////////
+
+ // Basic
+ section('Basic readback');
+ data = ClearBufferPair(gl, 16);
+ EnsureNoError(gl);
+ gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, 0);
+ EnsureNoError(gl);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(RED, data, 0);
+ TestIsUNormColor(BLUE, data, 4);
+ TestIsUNormColor(GREEN, data, 8);
+ TestIsUNormColor(WHITE, data, 12);
+
+ section('Subrect readback');
+ data = ClearBufferPair(gl, 8);
+ gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 0);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(WHITE, data, 0);
+ TestIsUNormColor(ZERO, data, 4);
+
+ section('ReadPixels offset:4');
+ data = ClearBufferPair(gl, 16);
+ gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 4);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(ZERO, data, 0);
+ TestIsUNormColor(WHITE, data, 4);
+ TestIsUNormColor(ZERO, data, 8);
+ TestIsUNormColor(ZERO, data, 12);
+
+ section('ReadPixels offset:5');
+ gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 5);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(ZERO, data, 0);
+ TestIsUNormColor(WHITE, data, 4); // Should remain from previous read.
+ TestIsUNormColor(WHITE, data, 5);
+ TestIsUNormColor(ZERO, data, 9);
+ TestIsUNormColor(ZERO, data, 12);
+
+ section('GetBufferSubData src too small');
+ data = ClearBufferPair(gl, 16);
+ EnsureNoError(gl);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 1, data);
+ TestError(gl, gl.INVALID_VALUE);
+ TestIsUNormColor(ZERO, data, 0);
+ TestIsUNormColor(ZERO, data, 4);
+ TestIsUNormColor(ZERO, data, 8);
+ TestIsUNormColor(ZERO, data, 12);
+
+ section('GetBufferSubData offset:1');
+ data = new Uint8Array(15);
+ gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 8);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 1, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(ZERO, data, 0);
+ TestIsUNormColor(ZERO, data, 3);
+ TestIsUNormColor(WHITE, data, 7);
+ TestIsUNormColor(ZERO, data, 11);
+
+ //////////////////////////////////////
+
+ section('Test packing state');
+ EnsureNoError(gl);
+
+ function TestPackState(enumStr, initialVal, changedVal) {
+ var enumVal = gl[enumStr];
+
+ ShouldBe(gl.getParameter(enumVal), initialVal, 'Initial ' + enumStr);
+ gl.pixelStorei(enumVal, changedVal);
+ ShouldBe(gl.getParameter(enumVal), changedVal, 'Changed ' + enumStr);
+ gl.pixelStorei(enumVal, initialVal);
+ ShouldBe(gl.getParameter(enumVal), initialVal, 'Reverted ' + enumStr);
+ EnsureNoError(gl);
+ }
+
+ TestPackState('PACK_ALIGNMENT', 4, 1);
+ TestPackState('PACK_ROW_LENGTH', 0, 16);
+ TestPackState('PACK_SKIP_PIXELS', 0, 3);
+ TestPackState('PACK_SKIP_ROWS', 0, 3);
+}
+
+function RunTest() {
+ Test();
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+
+try {
+ var prefArrArr = [
+ ['webgl.force-enabled', true],
+ ['webgl.disable-angle', true],
+ ];
+ var prefEnv = {'set': prefArrArr};
+ SpecialPowers.pushPrefEnv(prefEnv, RunTest);
+} catch (e) {
+ todo(false, 'No SpecialPowers, but trying anyway...');
+ RunTest();
+}
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_privileged_exts.html b/dom/canvas/test/webgl-mochitest/test_privileged_exts.html
new file mode 100644
index 0000000000..37d4b0deb3
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_privileged_exts.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>WebGL test: Check for privileged ext access.</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+</head>
+<body>
+<canvas id="c"></canvas>
+<script>
+
+function TestExt(gl, name) {
+ var ext = gl.getExtension(name);
+ ok(!ext, 'Should not have access to \'' + name + '\'.');
+}
+
+(function() {
+ var gl = c.getContext('webgl');
+ if (!gl) {
+ todo(gl, 'Get GL working here first.');
+ return;
+ }
+
+ // Privileged extensions:
+ TestExt(gl, 'MOZ_debug');
+})();
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_read_pixels_no_format.html b/dom/canvas/test/webgl-mochitest/test_read_pixels_no_format.html
new file mode 100644
index 0000000000..d953058181
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_read_pixels_no_format.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset=utf-8>
+<script src='/tests/SimpleTest/SimpleTest.js'></script>
+</head>
+<body>
+<pre id=e_out></pre>
+<script>
+ok = window.ok || function(e, s) {
+ e_out.textContent += `\n${!e ? 'FAIL' : 'pass'}: ${s}`;
+};
+
+// -
+
+const canvas = document.createElement('canvas')
+document.documentElement.appendChild(canvas)
+const gl = canvas.getContext('webgl2')
+gl.bindBuffer(gl.PIXEL_PACK_BUFFER, gl.createBuffer())
+gl.readPixels(0, 0, 0, 0, gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_FORMAT), 0, 0);
+const err = gl.getError();
+ok(err == gl.INVALID_ENUM, `err: ${err}`);
+
+ok(true, 'done');
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_renderer_strings.html b/dom/canvas/test/webgl-mochitest/test_renderer_strings.html
new file mode 100644
index 0000000000..cbf0aeac78
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_renderer_strings.html
@@ -0,0 +1,248 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+</head>
+<body>
+<script>
+
+let gl, ext;
+
+function getStrings() {
+ const ret = {
+ renderer: gl.getParameter(gl.RENDERER),
+ vendor: gl.getParameter(gl.VENDOR),
+ };
+ if (ext) {
+ ret.unmasked_renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
+ ret.unmasked_vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);
+ }
+ return ret;
+}
+
+const RTX3070_R = 'ANGLE (NVIDIA, NVIDIA GeForce RTX 3070 Direct3D11 vs_5_0 ps_5_0, D3D11-27.21.14.5751)';
+const RTX3070_V = 'Google Inc.';
+const RTX3070_R_SANITIZED = 'ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0)';
+
+function expectJsonEqual(was, expected, when) {
+ if (when) {
+ when = when + ': ';
+ } else {
+ when = '';
+ }
+ const wasStr = JSON.stringify(was);
+ const expectedStr = JSON.stringify(expected);
+ let str = `${when}Was ${wasStr}`;
+ const matches = (wasStr == expectedStr);
+ if (!matches) {
+ str += `, expected ${expectedStr}`;
+ }
+ ok(matches, str);
+}
+
+async function testKnownCiStrings() {
+ gl = document.createElement('canvas').getContext('webgl');
+ if (!gl) return;
+
+ await SpecialPowers.pushPrefEnv({'set': [
+ ['webgl.sanitize-unmasked-renderer', false],
+ ]});
+ ext = gl.getExtension('WEBGL_debug_renderer_info');
+ const was = getStrings();
+
+ const KNOWN_ON_CI = {
+ renderer: [
+ 'Adreno (TM) 540', // Android
+ 'Adreno (TM) 650', // Android pixel5
+ 'llvmpipe', // Linux
+ 'Intel(R) HD Graphics 400', // Mac
+ 'Apple M1', // Mac
+ 'ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs_5_0 ps_5_0)', // Windows
+ ],
+ vendor: [
+ 'Mozilla',
+ ],
+ unmasked_renderer: [
+ 'Adreno (TM) 540', // Android
+ 'Adreno (TM) 620', // Android pixel5
+ 'llvmpipe (LLVM 10.0.0, 256 bits)', // Linux
+ 'Intel(R) UHD Graphics 630', // Mac
+ 'Apple M1', // Mac
+ 'ANGLE (NVIDIA, NVIDIA Tesla M60 Direct3D11 vs_5_0 ps_5_0, D3D11-23.21.13.9181)', // Windows
+ 'ANGLE (NVIDIA, NVIDIA Tesla M60 Direct3D11 vs_5_0 ps_5_0, D3D11-30.0.14.7239)', // Windows 11
+ ],
+ unmasked_vendor: [
+ 'Qualcomm', // Android
+ 'VMware, Inc.', // Linux
+ 'Intel Inc.', // Mac
+ 'Apple', // Mac
+ 'Google Inc. (NVIDIA)', // Windows
+ ],
+ };
+ for (const k in was) {
+ const wasVal = was[k];
+ const knownList = KNOWN_ON_CI[k];
+ ok(knownList.includes(wasVal),
+ `[ignore if not on CI] getParameter(${k}) -> ${wasVal} must be in KNOWN_ON_CI`);
+ }
+ await SpecialPowers.popPrefEnv();
+}
+
+// -
+
+async function testPrefBehavior() {
+ const canvas = document.createElement('canvas');
+ gl = canvas.getContext('webgl');
+ ext = null;
+ if (!gl) {
+ todo(gl, 'Get WebGL working here first.');
+ return;
+ }
+
+ // -
+ // Assuming that we're on CI, test against known-good strings.
+ // If we add machine configs, we'll need to add to these lists.
+ // This is to avoid situations like bug 1743734, where ANGLE added
+ // detailed driver version/date to its RENDERER strings, which
+ // we want to prevent.
+
+ const KNOWN_CI_VENDORS = [
+ 'Mozilla',
+ ];
+ const KNOWN_CI_RENDERERS = [
+ 'Adreno (TM) 540', // Android
+ 'Adreno (TM) 650', // Android
+ 'Intel(R) HD Graphics 400', // Mac
+ 'Apple M1', // Mac
+ 'llvmpipe', // Linux
+ 'ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs_5_0 ps_5_0)', // Windows
+ ];
+ function assertKnownValid(key, knownList) {
+ const val = gl.getParameter(gl[key]);
+ ok(knownList.includes(val),
+ `[ignore if not on CI] getParameter(${key}) -> ${val} not known-valid!`);
+ }
+ assertKnownValid('VENDOR', KNOWN_CI_VENDORS);
+ assertKnownValid('RENDERER', KNOWN_CI_RENDERERS);
+
+ // -
+
+ await SpecialPowers.pushPrefEnv({'set': [
+ ['webgl.override-unmasked-renderer', RTX3070_R],
+ ['webgl.override-unmasked-vendor', RTX3070_V],
+ ]});
+
+ // -
+ // Test disabled
+
+ await SpecialPowers.pushPrefEnv({'set': [
+ ['webgl.enable-debug-renderer-info', false],
+ ]});
+
+ ext = gl.getExtension('WEBGL_debug_renderer_info');
+ ok(!ext,
+ 'When pref disabled: Should not have access to \'WEBGL_debug_renderer_info\'.');
+
+ {
+ const EXPECTED = {
+ renderer: RTX3070_R_SANITIZED,
+ vendor: 'Mozilla',
+ };
+ const was = getStrings();
+ expectJsonEqual(was, EXPECTED, 'v92 behavior w/o ext');
+ }
+
+ await SpecialPowers.popPrefEnv();
+
+ // -
+ // Test RFP
+
+ await SpecialPowers.pushPrefEnv({'set': [
+ ['privacy.resistFingerprinting', true],
+ ]});
+
+ ext = gl.getExtension('WEBGL_debug_renderer_info');
+ ok(!ext,
+ 'With RFP: Should not have access to \'WEBGL_debug_renderer_info\'.');
+
+ {
+ const EXPECTED = {
+ renderer: 'Mozilla',
+ vendor: 'Mozilla',
+ };
+ const was = getStrings();
+ expectJsonEqual(was, EXPECTED, 'RFP behavior');
+ }
+
+ await SpecialPowers.popPrefEnv();
+
+ // -
+ // Test default state (v92+)
+
+ ext = gl.getExtension('WEBGL_debug_renderer_info');
+ ok(ext,
+ 'By default: Should have access to \'WEBGL_debug_renderer_info\'.');
+
+ {
+ const EXPECTED = {
+ renderer: RTX3070_R_SANITIZED,
+ vendor: 'Mozilla',
+ unmasked_renderer: RTX3070_R_SANITIZED,
+ unmasked_vendor: RTX3070_V,
+ };
+ const was = getStrings();
+ expectJsonEqual(was, EXPECTED, 'v92 behavior');
+ }
+
+ // -
+ // Test v91 behavior
+
+ await SpecialPowers.pushPrefEnv({'set': [
+ ['webgl.enable-renderer-query', false],
+ ]});
+
+ {
+ const EXPECTED = {
+ renderer: 'Mozilla',
+ vendor: 'Mozilla',
+ unmasked_renderer: RTX3070_R_SANITIZED,
+ unmasked_vendor: RTX3070_V,
+ };
+ const was = getStrings();
+ expectJsonEqual(was, EXPECTED, 'v91 behavior');
+ }
+
+ // -
+ // Test v90 behavior
+
+ await SpecialPowers.pushPrefEnv({'set': [
+ ['webgl.sanitize-unmasked-renderer', false],
+ ]});
+
+ {
+ const EXPECTED = {
+ renderer: 'Mozilla',
+ vendor: 'Mozilla',
+ unmasked_renderer: RTX3070_R,
+ unmasked_vendor: RTX3070_V,
+ };
+ const was = getStrings();
+ expectJsonEqual(was, EXPECTED, 'v90 behavior');
+ }
+}
+
+// -
+
+SimpleTest.waitForExplicitFinish();
+(async function() {
+ await testKnownCiStrings();
+ await testPrefBehavior();
+
+ ok(true, 'Test complete.');
+ SimpleTest.finish();
+})();
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html b/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html
new file mode 100644
index 0000000000..2700ed3007
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html
@@ -0,0 +1,190 @@
+<html>
+ <head>
+ <meta charset='UTF-8'>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ </head>
+ <body>
+<canvas id='c' width='200' height='200'></canvas>
+<canvas id='c2' width='200' height='200'></canvas>
+
+<script>
+
+function RGBAToString(arr) {
+ return '[' + arr[0].toPrecision(4) + ', ' +
+ arr[1].toPrecision(4) + ', ' +
+ arr[2].toPrecision(4) + ', ' +
+ arr[3].toPrecision(4) + ']';
+}
+
+function TestScreenColor(gl, r, g, b, a) {
+ var arr = new SharedArrayBuffer(4);
+ var view = new Uint8Array(arr);
+ gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, view);
+
+ var err = gl.getError();
+ ok(err == 0, 'Should be no errors.');
+ if (err)
+ return;
+
+ var floatArr;
+ floatArr = new Float32Array(4);
+ floatArr[0] = view[0] / 255.0;
+ floatArr[1] = view[1] / 255.0;
+ floatArr[2] = view[2] / 255.0;
+ floatArr[3] = view[3] / 255.0;
+
+ var testText = RGBAToString(floatArr);
+ var refText = RGBAToString([r, g, b, a]);
+
+ var eps = 1.0 / 255.0;
+ var isSame = (Math.abs(floatArr[0] - r) < eps &&
+ Math.abs(floatArr[1] - g) < eps &&
+ Math.abs(floatArr[2] - b) < eps &&
+ Math.abs(floatArr[3] - a) < eps);
+
+ ok(isSame, 'Should be ' + refText + ', was ' + testText + ',');
+}
+
+// Give ourselves a scope to return early from:
+(function() {
+ var canvas = document.getElementById('c');
+ var attribs = {
+ antialias: false,
+ depth: false,
+ };
+ let gl = canvas.getContext('experimental-webgl', attribs);
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ return;
+ }
+ if (typeof SharedArrayBuffer === 'undefined') {
+ todo(false, 'SharedArrayBuffer is unavailable.');
+ return;
+ }
+
+ var vs = gl.createShader(gl.VERTEX_SHADER);
+ gl.shaderSource(vs, "attribute vec2 aVertCoord; void main(void) { gl_Position = vec4(aVertCoord, 0.0, 1.0); }");
+ gl.compileShader(vs);
+ var fs = gl.createShader(gl.FRAGMENT_SHADER);
+ gl.shaderSource(fs, "precision mediump float; uniform vec4 uFragColor; void main(void) { gl_FragColor = uFragColor; }");
+ gl.compileShader(fs);
+ var prog = gl.createProgram();
+ gl.attachShader(prog, vs);
+ gl.attachShader(prog, fs);
+ gl.linkProgram(prog);
+
+ var success = gl.getProgramParameter(prog, gl.LINK_STATUS);
+ if (!success) {
+ console.log('Error linking program for \'' + vsId + '\' and \'' + fsId + '\'.');
+ console.log('\nLink log: ' + gl.getProgramInfoLog(prog));
+ console.log('\nVert shader log: ' + gl.getShaderInfoLog(vs));
+ console.log('\nFrag shader log: ' + gl.getShaderInfoLog(fs));
+ }
+ ok(prog, 'Program should link.');
+ if (!prog) {
+ return;
+ }
+
+ prog.aVertCoord = gl.getAttribLocation(prog, 'aVertCoord');
+ prog.uFragColor = gl.getUniformLocation(prog, 'uFragColor');
+
+ gl.useProgram(prog);
+
+ // Test gl.bufferData(), gl.bufferSubData() and gl.readPixels() APIs with SAB as input.
+ var arr = new SharedArrayBuffer(8*4);
+ var view = new Float32Array(arr);
+ view.set(new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]));
+ var vb = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vb);
+ gl.bufferData(gl.ARRAY_BUFFER, view, gl.STATIC_DRAW);
+ ok(gl.getError() == 0, 'bufferData with SAB as input parameter works ok.');
+ gl.bufferSubData(gl.ARRAY_BUFFER, 0, view);
+ ok(gl.getError() == 0, 'bufferSubData with SAB as input parameter works ok.');
+ gl.enableVertexAttribArray(0);
+ gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
+ gl.clearColor(0, 0, 0, 1.0);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.uniform4f(prog.uFragColor, 0.2, 0.4, 0.6, 1.0);
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
+ var arr = new Uint8Array(4);
+ TestScreenColor(gl, 0.2, 0.4, 0.6, 1.0);
+
+ // Test gl.texImage2D() and gl.texSubImage2D() APIs with SAB as input.
+ var tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ var width = 4;
+ var height = 4;
+ var numChannels = 4;
+ var sab = new SharedArrayBuffer(width * height * numChannels);
+ var data = new Uint8Array(sab);
+ for (var i = 0; i < data.length; ++i) {
+ data[i] = i;
+ }
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
+ ok(gl.getError() == 0, 'texImage2D() with SAB as input parameter works ok.');
+ gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);
+ ok(gl.getError() == 0, 'texSubImage2D() with SAB as input parameter works ok.');
+
+ ok(gl.getError() == 0, 'Should be no errors after test.');
+})();
+
+// Test WebGL 2
+(function() {
+ var canvas = document.getElementById('c2');
+ var attribs = {
+ antialias: false,
+ depth: false,
+ };
+ let gl = canvas.getContext('webgl2', attribs);
+ if (!gl) {
+ todo(false, 'WebGL 2 is unavailable.');
+ return;
+ }
+ if (typeof SharedArrayBuffer === 'undefined') {
+ todo(false, 'SharedArrayBuffer is unavailable.');
+ return;
+ }
+
+ var arr = new SharedArrayBuffer(8*4);
+ var view = new Float32Array(arr);
+ view.set(new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]));
+ var vb = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vb);
+ gl.bufferData(gl.ARRAY_BUFFER, view, gl.STATIC_DRAW);
+
+ var arr2 = new SharedArrayBuffer(8*4);
+ var view2 = new Float32Array(arr2);
+ gl.getBufferSubData(gl.ARRAY_BUFFER, 0, view2);
+ var equal = true;
+ for(var i = 0; i < 8; ++i) {
+ if (view[i] != view2[i]) equal = false;
+ }
+ ok(equal, 'getBufferSubData with SAB as input parameter works ok.');
+
+ // Test gl.texImage3D() and gl.texSubImage3D() APIs with SAB as input.
+ var tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_3D, tex);
+ var width = 4;
+ var height = 4;
+ var depth = 4;
+ var numChannels = 4;
+ var sab = new SharedArrayBuffer(width * height * depth* numChannels);
+ var data = new Uint8Array(sab);
+ for (var i = 0; i < data.length; ++i) {
+ data[i] = i;
+ }
+ gl.texImage3D(gl.TEXTURE_3D, 0, gl.RGBA, width, height, depth, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
+ ok(gl.getError() == 0, 'texImage3D() with SAB as input parameter works ok.');
+ gl.texSubImage3D(gl.TEXTURE_3D, 0, 0, 0, 0, width, height, depth, gl.RGBA, gl.UNSIGNED_BYTE, data);
+ ok(gl.getError() == 0, 'texSubImage3D() with SAB as input parameter works ok.');
+
+ ok(gl.getError() == 0, 'Should be no errors after test.');
+})();
+
+ok(true, 'TEST COMPLETE');
+
+</script>
+
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_tex_large_uploads.html b/dom/canvas/test/webgl-mochitest/test_tex_large_uploads.html
new file mode 100644
index 0000000000..c2fd554843
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_tex_large_uploads.html
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='UTF-8'>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ </head>
+ <body>
+ <img id='e_blank_15000x10000' src='blank_15000x10000.png'>
+ <script>
+
+function shouldBe(testStr, refStr) {
+ ok(testStr == refStr, 'Expected "' + refStr + '", was "' + testStr + '".');
+}
+
+function getErrorStr(gl, err) {
+ if (!err) return "NO_ERROR";
+ for (const k in gl) {
+ const v = gl[k];
+ if (v == err) {
+ return k;
+ }
+ }
+ return `<${err}>`;
+}
+
+function glErrorShouldBe(gl, expected, opt_info) {
+ if (opt_info) {
+ opt_info = opt_info + ': '
+ } else {
+ opt_info = '';
+ }
+
+ if (!expected.length) {
+ expected = [expected];
+ }
+ expected = expected.map(x => getErrorStr(gl, x));
+ let was = gl.getError();
+ was = getErrorStr(gl, was);
+ ok(expected.includes(was),
+ `${opt_info}Expected gl.getError() in [${expected}], was ${was}.`);
+}
+SimpleTest.waitForExplicitFinish();
+(async () => {
+ const gl = document.createElement('canvas').getContext('webgl2');
+ window.gl = gl;
+ if (!gl) {
+ todo(false, 'No webgl2, skipping...');
+ return;
+ }
+ const tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+
+ const TESTS = [
+ //{w: 16000, h: 8000}, // TODO: This asserts.
+ //{w: 8000, h: 16000}, // TODO: This asserts.
+ {w: 8000, h: 4000},
+ {w: 4000, h: 8000},
+ {w: 4000, h: 4000},
+ ];
+ const src = document.createElement('canvas').getContext('webgl',
+ {antialias:false, depth:false});
+ const maxTexSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
+ for (const t of TESTS) {
+ ok(true, 'canvas: ' + JSON.stringify(t));
+ if (t.w > maxTexSize || t.h > maxTexSize) {
+ ok(true, `Larger than MAX_TEXTURE_SIZE of ${maxTexSize}`);
+ continue;
+ }
+ src.canvas.width = t.w;
+ src.canvas.height = t.h;
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE,
+ src.canvas);
+
+ glErrorShouldBe(gl, [0, gl.OUT_OF_MEMORY], `after texImage(${JSON.stringify(t)})`);
+
+ src.canvas.width = src.canvas.height = 1;
+ }
+
+ if (15000 > maxTexSize) {
+ ok(true, `e_blank_15000x10000 larger than MAX_TEXTURE_SIZE of ${maxTexSize}, skipping.`);
+ } else {
+ await e_blank_15000x10000.decode(); // Otherwise it will not have loaded yet.
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE,
+ e_blank_15000x10000);
+ glErrorShouldBe(gl, [0, gl.OUT_OF_MEMORY], `after texImage(e_blank_15000x10000)`);
+ ok(!gl.isContextLost(), '!gl.isContextLost()');
+ }
+
+ SimpleTest.finish();
+})();
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_tex_pbo.html b/dom/canvas/test/webgl-mochitest/test_tex_pbo.html
new file mode 100644
index 0000000000..f64d52bd41
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_tex_pbo.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='UTF-8'>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ </head>
+ <body>
+ <script>
+
+function shouldBe(testStr, refStr) {
+ ok(testStr == refStr, 'Expected "' + refStr + '", was "' + testStr + '".');
+}
+
+function getErrorStr(gl, err) {
+ if (!err) return "NO_ERROR";
+ for (const k in gl) {
+ const v = gl[k];
+ if (v == err) {
+ return k;
+ }
+ }
+ return `<${err}>`;
+}
+
+function glErrorShouldBe(gl, expected, opt_info) {
+ if (opt_info) {
+ opt_info = opt_info + ': '
+ } else {
+ opt_info = '';
+ }
+
+ if (!expected.length) {
+ expected = [expected];
+ }
+ expected = expected.map(x => getErrorStr(gl, x));
+ let was = gl.getError();
+ was = getErrorStr(gl, was);
+ console.log(expected);
+ ok(expected.includes(was),
+ `${opt_info}Expected gl.getError() in [${expected}], was ${was}.`);
+}
+
+(() => {
+ const gl = document.createElement('canvas').getContext('webgl2');
+ if (!gl) {
+ todo(false, 'No webgl2, skipping...');
+ return;
+ }
+ const pbo = gl.createBuffer();
+ gl.bindBuffer(gl.PIXEL_UNPACK_BUFFER, pbo);
+
+ const PBO_DATA = new Uint8Array([
+ 255, 0, 0, 255,
+ 0, 255, 0, 255,
+ ]);
+ gl.bufferData(gl.PIXEL_UNPACK_BUFFER, PBO_DATA, gl.STATIC_DRAW);
+
+ const tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+
+ const fb = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
+
+ const readback = new Uint8Array(4);
+
+ const PBO_LIST = [null, pbo];
+ for (const cur of PBO_LIST) {
+ gl.bindBuffer(gl.PIXEL_UNPACK_BUFFER, cur);
+
+ function tryUpload(arg, expectedReadback) {
+ let argType = typeof(arg);
+ if (arg === null) {
+ argType = 'null';
+ }
+ const argForPbo = (argType == 'number');
+ const pboBound = !!cur;
+ const expectedErr = (argForPbo == pboBound) ? 0 : gl.INVALID_OPERATION;
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE,
+ arg);
+ const with_without = pboBound ? 'with' : 'without';
+ glErrorShouldBe(gl, expectedErr, `${with_without} pbo, texImage(..., ${argType}("${arg}"))`);
+
+ if (expectedErr) return;
+ gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, readback);
+ shouldBe(expectedReadback.toString(), readback.toString());
+ }
+
+ const CPU_DATA = new Uint8Array([255, 255, 0, 255]);
+
+ tryUpload(null, [0,0,0,0]);
+ tryUpload(CPU_DATA, CPU_DATA);
+ tryUpload(0, PBO_DATA.slice(0,4));
+ tryUpload(4, PBO_DATA.slice(4));
+ }
+})();
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_tex_unit_different_sampler_types.html b/dom/canvas/test/webgl-mochitest/test_tex_unit_different_sampler_types.html
new file mode 100644
index 0000000000..3664f40ff7
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_tex_unit_different_sampler_types.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset=utf-8>
+<script src='/tests/SimpleTest/SimpleTest.js'></script>
+</head>
+<body>
+<pre id=e_out></pre>
+<script>
+
+ok = window.ok || function(e, s) {
+ e_out.textContent += `\n${!e ? 'FAIL' : 'pass'}: ${s}`;
+};
+
+const canvas = document.createElement('canvas');
+const gl = canvas.getContext('webgl');
+const program = gl.createProgram();
+const vertex = gl.createShader(gl.VERTEX_SHADER);
+
+gl.shaderSource(vertex, `\
+ precision highp float;
+ varying vec2 v_vec2;
+ varying vec3 v_vec3;
+ void main() { }
+`);
+gl.compileShader(vertex);
+gl.attachShader(program, vertex);
+
+const fragment = gl.createShader(gl.FRAGMENT_SHADER);
+gl.shaderSource(fragment, `\
+ precision highp float;
+ varying vec2 v_vec2;
+ varying vec3 v_vec3;
+ uniform sampler2D u_sampler2d;
+ uniform samplerCube u_samplercube;
+ void main() {
+ gl_FragColor = texture2D(u_sampler2d, v_vec2);
+ gl_FragColor += textureCube(u_samplercube, normalize(v_vec3));
+ }
+`);
+gl.compileShader(fragment);
+gl.attachShader(program, fragment);
+
+gl.linkProgram(program);
+gl.useProgram(program);
+gl.drawArrays(gl.TRIANGLE_STRIP, 29, 32);
+let err = gl.getError();
+ok(err == gl.INVALID_OPERATION, `err: ${err}`);
+
+ok(true, `Done.`);
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_texsubimage_float.html b/dom/canvas/test/webgl-mochitest/test_texsubimage_float.html
new file mode 100644
index 0000000000..991066e41b
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_texsubimage_float.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<title>WebGL test: bug 1003607</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<script src="webgl-util.js"></script>
+<body>
+<canvas id="c"></canvas>
+<script>
+
+// Give ourselves a scope to return early from:
+(function() {
+ var gl = c.getContext('webgl');
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ return;
+ }
+
+ function checkGLError(func, info, reference) {
+ var error = gl.getError();
+ var prefix = info ? ('[' + info + '] ') : '';
+ var text = 'gl.getError should be 0x' + reference.toString(16) +
+ ', was 0x' + error.toString(16) + '.';
+ func(error == reference, prefix + text);
+ }
+
+ // Begin test:
+ if (!gl.getExtension('OES_texture_float')) {
+ todo(false, 'Not having this extension is fine.');
+ return;
+ }
+ var tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+ checkGLError(ok, 'texture parameter setup should succeed', gl.NO_ERROR);
+
+ // Generate data
+ var width = 2;
+ var height = 2;
+ var numChannels = 4;
+ var data = new Float32Array(width * height * numChannels);
+ for (var ii = 0; ii < data.length; ++ii) {
+ data[ii] = 10000;
+ }
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.FLOAT, data);
+ checkGLError(ok, 'floating-point texture allocation should succeed', gl.NO_ERROR);
+
+ // Try respecifying data
+ gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, gl.FLOAT, data);
+ checkGLError(ok, 'floating-point texture sub image should succeed', gl.NO_ERROR);
+})();
+
+</script>
diff --git a/dom/canvas/test/webgl-mochitest/test_uninit_data.html b/dom/canvas/test/webgl-mochitest/test_uninit_data.html
new file mode 100644
index 0000000000..541cfdbe51
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_uninit_data.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta http-equiv='content-type' content='text/html; charset=utf-8'/>
+
+ <title>Test contents of uninitialized buffers</title>
+
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='webgl-util.js'></script>
+</head>
+
+<body>
+<script>
+'use strict';
+
+function TestFB(gl) {
+ var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ ok(status == gl.FRAMEBUFFER_COMPLETE, 'FB should be complete.');
+
+ var pixel = new Uint8Array(4);
+ gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);
+
+ ok(!pixel[0], 'R channel should be 0, was ' + pixel[0] + '.');
+ ok(!pixel[1], 'G channel should be 0, was ' + pixel[1] + '.');
+ ok(!pixel[2], 'B channel should be 0, was ' + pixel[2] + '.');
+ ok(!pixel[3], 'A channel should be 0, was ' + pixel[3] + '.');
+}
+
+function Test(contextAttribs) {
+ ok(true, '===============================');
+ ok(true, 'Testing ' + JSON.stringify(contextAttribs));
+
+ var c = document.createElement('canvas');
+ var gl = c.getContext('webgl', contextAttribs);
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ return;
+ }
+
+ var rb = gl.createRenderbuffer();
+ gl.bindRenderbuffer(gl.RENDERBUFFER, rb);
+
+ var tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+
+ var err = gl.getError();
+ ok(!err, 'Error should be 0x0, was 0x' + err.toString(16));
+ if (err)
+ return;
+
+ var fb = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+
+ ok(true, 'Backed with RB');
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rb);
+ gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 1, 1);
+ TestFB(gl);
+
+ ok(true, 'Backed with texture');
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
+ TestFB(gl);
+
+ err = gl.getError();
+ ok(!err, 'Error should be 0x0, was 0x' + err.toString(16));
+}
+
+// Give ourselves a scope to return early from:
+(function() {
+ // We test multiple configurations because we've had bugs regarding faking RGBX on
+ // ANGLE: With alpha:false, uninitialized buffers were being filled with (0,0,0,1)
+ // instead of (0,0,0,0).
+ Test({alpha: false, antialias: false});
+ Test({alpha: true, antialias: false});
+ Test({alpha: false, antialias: true});
+ Test({alpha: true, antialias: true});
+
+ ok(true, 'Test complete.');
+})();
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_vertexattrib4f_update.html b/dom/canvas/test/webgl-mochitest/test_vertexattrib4f_update.html
new file mode 100644
index 0000000000..e845b4a594
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_vertexattrib4f_update.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'>
+ <title>Bug 1426289 - vertexAttrib4f should actually update.</title>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ <script src='webgl-util.js'></script>
+ </head>
+ <body>
+ <script id='eVertSource' type='none'>
+attribute vec4 aColor;
+varying vec4 vColor;
+
+void main() {
+ gl_PointSize = 64.0;
+ gl_Position = vec4(vec3(0.0), 1.0);
+ vColor = aColor;
+}
+ </script>
+ <script id='eFragSource' type='none'>
+precision mediump float;
+varying vec4 vColor;
+
+void main() {
+ gl_FragColor = vColor;
+}
+ </script>
+ <script>
+const canvas = document.createElement('canvas');
+canvas.width = 1;
+canvas.height = 1;
+const gl = canvas.getContext('webgl');
+
+const prog = WebGLUtil.linkProgramByIds(gl, eVertSource, eFragSource);
+gl.useProgram(prog);
+
+function getRgb() {
+ const data = new Uint32Array(1);
+ gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(data.buffer));
+ return data[0] & 0xffffff;
+}
+
+gl.clearColor(0.0, 0.0, 0.0, 1.0);
+gl.clear(gl.COLOR_BUFFER_BIT);
+let was = getRgb();
+ok(was == 0x000000, '0x'+was.toString(16));
+
+gl.disableVertexAttribArray(prog.aColor);
+
+gl.vertexAttrib4f(prog.aColor, 1, 0, 0, 1);
+gl.drawArrays(gl.POINTS, 0, 1);
+was = getRgb();
+ok(was == 0x0000ff, '0x'+was.toString(16));
+
+gl.vertexAttrib4f(prog.aColor, 0, 1, 0, 1);
+gl.drawArrays(gl.POINTS, 0, 1);
+was = getRgb();
+ok(was == 0x00ff00, '0x'+was.toString(16));
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_video_fastpath.js b/dom/canvas/test/webgl-mochitest/test_video_fastpath.js
new file mode 100644
index 0000000000..1c204237a7
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_video_fastpath.js
@@ -0,0 +1,34 @@
+var gl;
+var video;
+
+function onPlayingTestVideo() {
+ video.removeEventListener("playing", onPlayingTestVideo, true);
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video);
+ is(
+ gl.getError(),
+ gl.NO_ERROR,
+ "texImage2D should not generate any error here."
+ );
+ video.pause();
+ SimpleTest.finish();
+}
+
+function startTest(file) {
+ gl = document.createElement("canvas").getContext("webgl");
+ ext = gl.getExtension("MOZ_debug");
+ ok(ext, "MOZ_debug extenstion should exist");
+ gl.bindTexture(gl.TEXTURE_2D, gl.createTexture());
+ gl.pixelStorei(ext.UNPACK_REQUIRE_FASTPATH, true);
+ is(
+ gl.getError(),
+ gl.NO_ERROR,
+ "pixelStorei should not generate any error here."
+ );
+
+ video = document.createElement("video");
+ video.addEventListener("playing", onPlayingTestVideo, true);
+ video.preload = "auto";
+ video.src = file;
+ video.loop = true;
+ video.play();
+}
diff --git a/dom/canvas/test/webgl-mochitest/test_video_fastpath_mp4.html b/dom/canvas/test/webgl-mochitest/test_video_fastpath_mp4.html
new file mode 100644
index 0000000000..194e9b29ea
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_video_fastpath_mp4.html
@@ -0,0 +1,21 @@
+<html>
+ <head>
+ <meta name="timeout" content="long"/>
+ <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>
+ <title>Video Fastpath upload test</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script src="test_video_fastpath.js"></script>
+ <link rel="stylesheet" href="/tests/SimpleTest/test.css">
+ </head>
+ <body>
+ <script>
+
+ function runTest() {
+ startTest("red-green.mp4");
+ }
+
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({"set" : [["webgl.enable-privileged-extensions", true]]}, runTest);
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_video_fastpath_theora.html b/dom/canvas/test/webgl-mochitest/test_video_fastpath_theora.html
new file mode 100644
index 0000000000..4f4fbab88b
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_video_fastpath_theora.html
@@ -0,0 +1,21 @@
+<html>
+ <head>
+ <meta name="timeout" content="long"/>
+ <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>
+ <title>Video Fastpath upload test</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script src="test_video_fastpath.js"></script>
+ <link rel="stylesheet" href="/tests/SimpleTest/test.css">
+ </head>
+ <body>
+ <script>
+
+ function runTest() {
+ startTest("red-green.theora.ogv");
+ }
+
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({"set" : [["webgl.enable-privileged-extensions", true]]}, runTest);
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp8.html b/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp8.html
new file mode 100644
index 0000000000..e87f6c6484
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp8.html
@@ -0,0 +1,21 @@
+<html>
+ <head>
+ <meta name="timeout" content="long"/>
+ <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>
+ <title>Video Fastpath upload test</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script src="test_video_fastpath.js"></script>
+ <link rel="stylesheet" href="/tests/SimpleTest/test.css">
+ </head>
+ <body>
+ <script>
+
+ function runTest() {
+ startTest("red-green.webmvp8.webm");
+ }
+
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({"set" : [["webgl.enable-privileged-extensions", true]]}, runTest);
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp9.html b/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp9.html
new file mode 100644
index 0000000000..fd4a4332d0
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp9.html
@@ -0,0 +1,21 @@
+<html>
+ <head>
+ <meta name="timeout" content="long"/>
+ <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>
+ <title>Video Fastpath upload test</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script src="test_video_fastpath.js"></script>
+ <link rel="stylesheet" href="/tests/SimpleTest/test.css">
+ </head>
+ <body>
+ <script>
+
+ function runTest() {
+ startTest("red-green.webmvp9.webm");
+ }
+
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({"set" : [["webgl.enable-privileged-extensions", true]]}, runTest);
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_webgl2_alpha_luminance.html b/dom/canvas/test/webgl-mochitest/test_webgl2_alpha_luminance.html
new file mode 100644
index 0000000000..3ec6c1909e
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_webgl2_alpha_luminance.html
@@ -0,0 +1,114 @@
+<!DOCTYPE HTML>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<title>WebGL2 test: Alpha and Luminance Textures</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<script src="webgl-util.js"></script>
+<script id="vs" type="x-shader/x-vertex"
+>#version 300 es
+
+in vec2 aTexCoord;
+out vec2 vTexCoord;
+
+void main() {
+ vec2 pos = vec2(2.0)*aTexCoord - vec2(1.0);
+ gl_Position = vec4(pos, 0.0, 1.0);
+ vTexCoord = aTexCoord;
+}
+</script>
+<script id="fs" type="x-shader/x-fragment"
+>#version 300 es
+precision mediump float;
+
+in vec2 vTexCoord;
+uniform sampler2D uTex;
+out vec4 oFragColor;
+
+void main() {
+ oFragColor = texture(uTex, vTexCoord);
+}
+</script>
+<body>
+<canvas id="c" width="32" height="32"></canvas>
+<script>
+ WebGLUtil.withWebGL2('c', function(gl) {
+
+ function testPixel(x, y, refData, infoPrefix) {
+ var pixel = new Uint8Array(4);
+ gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);
+
+ var pixelMatches = (pixel[0] == refData[0] &&
+ pixel[1] == refData[1] &&
+ pixel[2] == refData[2] &&
+ pixel[3] == refData[3]);
+ var expectedStr = '[' + refData.join(', ') + ']';
+ var actualStr = '[' + pixel.join(', ') + ']';
+
+ if (pixelMatches) {
+ ok(true, infoPrefix + 'Expected ' + expectedStr + '.');
+ } else {
+ ok(false, infoPrefix + 'Expected ' + expectedStr + ', was ' + actualStr + '.');
+ }
+ }
+
+ function testTexture(details, prog) {
+ prog.aTexCoord = gl.getAttribLocation(prog, "aTexCoord");
+ ok(prog.aTexCoord >= 0, '`aTexCoord` should be valid.');
+
+ var tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ gl.texImage2D(gl.TEXTURE_2D, 0, details.format, 1, 1, 0,
+ details.format, gl.UNSIGNED_BYTE, details.texData);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+
+ gl.useProgram(prog);
+ gl.vertexAttribPointer(prog.aTexCoord, 2, gl.FLOAT, false, 0, 0);
+ gl.enableVertexAttribArray(prog.aTexCoord);
+
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
+
+ testPixel(0, 0, details.result, details.info + ': ');
+ return true;
+ }
+
+ var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs');
+ if (!prog) {
+ ok(false, 'Program linking should succeed.');
+ return false;
+ }
+
+ gl.disable(gl.DEPTH_TEST);
+
+ var vertData = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertData);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0, 0, 1, 0, 0, 1, 1, 1 ]), gl.STATIC_DRAW);
+
+ gl.clearColor(0, 0, 1, 1);
+ gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
+
+ var details = [
+ { info: 'Luminance8', format: gl.LUMINANCE, texData: new Uint8Array([ 128 ]),
+ result: [128, 128, 128, 255] },
+ { info: 'Alpha8', format: gl.ALPHA, texData: new Uint8Array([ 128 ]),
+ result: [0, 0, 0, 128] },
+ { info: 'Luminance8Alpha8', format: gl.LUMINANCE_ALPHA, texData: new Uint8Array([ 128, 128 ]),
+ result: [128, 128, 128, 128] },
+ ];
+
+ for (var i = 0; i < details.length; i++) {
+ if (!testTexture(details[i], prog)) {
+ return;
+ }
+ }
+ ok(true, 'Test complete.');
+ }, function() {
+ SimpleTest.finish();
+ });
+
+ SimpleTest.waitForExplicitFinish();
+</script>
diff --git a/dom/canvas/test/webgl-mochitest/test_webgl2_invalidate_framebuffer.html b/dom/canvas/test/webgl-mochitest/test_webgl2_invalidate_framebuffer.html
new file mode 100644
index 0000000000..6a384e1b9d
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_webgl2_invalidate_framebuffer.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+<title>WebGL2 test: Framebuffers</title>
+
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<script src="webgl-util.js"></script>
+<body>
+<canvas id="c" width="64" height="64"></canvas>
+<script>
+
+WebGLUtil.withWebGL2('c', function (gl) {
+ gl.invalidateFramebuffer(gl.FRAMEBUFFER, [gl.COLOR]);
+ ok(gl.getError() == 0, 'invalidateFramebuffer');
+ gl.invalidateSubFramebuffer(gl.FRAMEBUFFER, [gl.COLOR], 0, 0, 64, 64);
+ ok(gl.getError() == 0, 'invalidateSubFramebuffer');
+ gl.invalidateFramebuffer(gl.FRAMEBUFFER, [gl.GL_COLOR_ATTACHMENT0]);
+ ok(gl.getError() == gl.INVALID_ENUM, 'invalidateFrameBuffer should fail with GL_COLOR_ATTACHMENT on the default framebuffer');
+}, function () {
+ SimpleTest.finish();
+});
+
+SimpleTest.waitForExplicitFinish();
+
+</script>
diff --git a/dom/canvas/test/webgl-mochitest/test_webgl2_not_exposed.html b/dom/canvas/test/webgl-mochitest/test_webgl2_not_exposed.html
new file mode 100644
index 0000000000..d8d2f54c0d
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_webgl2_not_exposed.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>WebGL test: WebGL2RenderingContext only exposed when appropriate</title>
+<script src='/tests/SimpleTest/SimpleTest.js'></script>
+<link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+</head>
+<body>
+<script>
+
+function ShouldExpose() {
+ try {
+ return SpecialPowers.getBoolPref('webgl.enable-webgl2');
+ } catch (e) {}
+
+ return false;
+}
+
+function DoesExpose() {
+ try {
+ null instanceof WebGL2RenderingContext;
+ return true;
+ } catch (e) {}
+
+ return false;
+}
+
+var doesExpose = DoesExpose();
+if (ShouldExpose()) {
+ ok(doesExpose, 'WebGL2RenderingContext should be exposed.');
+} else {
+ ok(!doesExpose, 'WebGL2RenderingContext should not be exposed.');
+}
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_webgl2_uniform_block.html b/dom/canvas/test/webgl-mochitest/test_webgl2_uniform_block.html
new file mode 100644
index 0000000000..3e9ad9832a
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_webgl2_uniform_block.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<title>WebGL2 test: using uniform blocks</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="webgl-util.js"></script>
+<script id='vertSource' type='none'>
+#version 300 es
+uniform UniformBlock
+{
+ vec3 color;
+ vec3 offset;
+};
+in vec2 POSITION;
+out vec3 outCOLOR0;
+
+void main() {
+ gl_Position = vec4(POSITION, 0.0, 1.0);
+ outCOLOR0 = vec3(color.x + offset.x, color.y + offset.y,
+ color.z + offset.z);
+}
+</script>
+<script id='fragSource' type='none'>
+#version 300 es
+precision mediump float;
+in vec3 outCOLOR0;
+out vec4 oFragColor;
+
+void main() {
+ oFragColor = vec4(outCOLOR0, 1.0);
+}
+</script>
+<body>
+<canvas id="c" width="32" height="32"></canvas>
+<script>
+ WebGLUtil.withWebGL2('c', function(gl) {
+ const vs = gl.createShader(gl.VERTEX_SHADER);
+ gl.shaderSource(vs, vertSource.innerHTML.trim());
+ gl.compileShader(vs);
+ const fs = gl.createShader(gl.FRAGMENT_SHADER);
+ gl.shaderSource(fs, fragSource.innerHTML.trim());
+ gl.compileShader(fs);
+ const prog = gl.createProgram();
+ gl.attachShader(prog, vs);
+ gl.attachShader(prog, fs);
+ gl.linkProgram(prog);
+ gl.useProgram(prog);
+ gl.detachShader(prog, vs);
+ gl.detachShader(prog, fs);
+
+ gl.disable(gl.DEPTH_TEST);
+ var vertData = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertData);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-0.5, -0.5,
+ 0.5, -0.5,
+ 0.0, 0.5]), gl.STATIC_DRAW);
+
+ gl.clearColor(0, 1, 0, 1);
+
+ prog.POSITION = gl.getAttribLocation(prog, "POSITION");
+ ok(prog.POSITION >= 0, '`POSITION` should be valid.');
+ prog.blockIndex = gl.getUniformBlockIndex(prog, "UniformBlock");
+ ok(prog.blockIndex >= 0, '`UniformBlock` index should be valid.');
+ prog.blockSize = gl.getActiveUniformBlockParameter(prog,
+ prog.blockIndex, gl.UNIFORM_BLOCK_DATA_SIZE);
+ ok(prog.blockSize >= 0, '`UniformBlock` size should be valid.');
+
+ var uboArray = new ArrayBuffer(prog.blockSize);
+ var uboFloat = new Float32Array(uboArray);
+ uboFloat.set([0.5, 0.2, 0.3, 0.3, 0.2, 0.1], 0);
+ var uniformBuffer = gl.createBuffer();
+ gl.uniformBlockBinding(prog, prog.blockIndex, 1);
+ gl.bindBuffer(gl.UNIFORM_BUFFER, uniformBuffer);
+ gl.bufferData(gl.UNIFORM_BUFFER, uboFloat, gl.DYNAMIC_DRAW);
+ gl.bindBufferBase(gl.UNIFORM_BUFFER, 1, uniformBuffer);
+
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.drawArrays(gl.POINTS, 0, 1);
+
+ ok(true, 'Test complete.');
+ }, function() {
+ SimpleTest.finish();
+ });
+
+ SimpleTest.waitForExplicitFinish();
+</script>
diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_available.html b/dom/canvas/test/webgl-mochitest/test_webgl_available.html
new file mode 100644
index 0000000000..f6817c9858
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_webgl_available.html
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>WebGL test: Check that WebGL works out-of-the-box.</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" href="/tests/SimpleTest/test.css">
+ </head>
+ <body>
+ <script>
+
+'use strict';
+var c = document.createElement('canvas');
+var gl = c.getContext('experimental-webgl');
+ok(gl, 'Expected WebGL creation to succeed.');
+
+ </script>
+ </body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_compressed_texture_es3.html b/dom/canvas/test/webgl-mochitest/test_webgl_compressed_texture_es3.html
new file mode 100644
index 0000000000..d40bd1dc7f
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_webgl_compressed_texture_es3.html
@@ -0,0 +1,751 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="webgl-util.js"></script>
+<script src="es3-data.js"></script>
+<title>WebGL test: test WEBGL_compressed_texture_etc extension</title>
+<style>
+img {
+ border: 1px solid black;
+ margin-right: 1em;
+}
+.testimages {
+}
+
+.testimages br {
+ clear: both;
+}
+
+.testimages > div {
+ float: left;
+ margin: 1em;
+}
+</style>
+</head>
+<body>
+<div id="description"></div>
+<canvas id="canvas" width="8" height="8"></canvas>
+<div id="console"></div>
+<script id="vshader" type="x-shader/x-vertex">
+ attribute vec4 vPosition;
+ attribute vec2 texCoord0;
+ varying vec2 texCoord;
+ void main() {
+ gl_Position = vPosition;
+ texCoord = texCoord0;
+ }
+</script>
+<script id="fshader" type="x-shader/x-fragment">
+ precision mediump float;
+ uniform sampler2D tex;
+ varying vec2 texCoord;
+ void main() {
+ gl_FragData[0] = texture2D(tex, texCoord);
+ }
+</script>
+<script id="fshader-r" type="x-shader/x-fragment">
+ precision mediump float;
+ uniform sampler2D tex;
+ varying vec2 texCoord;
+ void main() {
+ vec4 pixel = (texture2D(tex, texCoord));
+ pixel.r = (pixel.r + 1.0) / 2.0;
+ gl_FragData[0] = pixel;
+ }
+</script>
+<script id="fshader-rg" type="x-shader/x-fragment">
+ precision mediump float;
+ uniform sampler2D tex;
+ varying vec2 texCoord;
+ void main() {
+ vec4 pixel = (texture2D(tex, texCoord));
+ pixel.rg = (pixel.rg + 1.0) / 2.0;
+ gl_FragData[0] = pixel;
+ }
+</script>
+<script>
+"use strict";
+var ext = null;
+var vao = null;
+var gl = null;
+var validFormats = {
+ COMPRESSED_R11_EAC : 0x9270,
+ COMPRESSED_SIGNED_R11_EAC : 0x9271,
+ COMPRESSED_RG11_EAC : 0x9272,
+ COMPRESSED_SIGNED_RG11_EAC : 0x9273,
+ COMPRESSED_RGB8_ETC2 : 0x9274,
+ COMPRESSED_SRGB8_ETC2 : 0x9275,
+ COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 : 0x9276,
+ COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 : 0x9277,
+ COMPRESSED_RGBA8_ETC2_EAC : 0x9278,
+ COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : 0x9279,
+};
+
+function setupUnitQuad() {
+ var vertexObject = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
+ 1.0, 1.0, 0.0,
+ -1.0, 1.0, 0.0,
+ -1.0, -1.0, 0.0,
+ 1.0, 1.0, 0.0,
+ -1.0, -1.0, 0.0,
+ 1.0, -1.0, 0.0]), gl.STATIC_DRAW);
+ gl.enableVertexAttribArray(0);
+ gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
+
+ var vertexObject = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
+ 1.0, 1.0,
+ 0.0, 1.0,
+ 0.0, 0.0,
+ 1.0, 1.0,
+ 0.0, 0.0,
+ 1.0, 0.0]), gl.STATIC_DRAW);
+ gl.enableVertexAttribArray(1);
+ gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);
+}
+
+function runTest() {
+ gl = canvas.getContext('webgl', {antialias: false});
+ if (!gl) {
+ ok(false, "WebGL context does not exist");
+ } else {
+ ok(true, "WebGL context exists");
+ setupUnitQuad();
+
+ // Run tests with extension disabled
+ runTestDisabled();
+
+ // Query the extension and store globally so shouldBe can access it
+ ext = gl.getExtension("WEBGL_compressed_texture_etc");
+ if (!ext) {
+ ok(true, "No WEBGL_compressed_texture_etc support -- this is legal");
+ runSupportedTest(false);
+ } else {
+ ok(true, "Successfully enabled WEBGL_compressed_texture_etc extension");
+
+ runSupportedTest(true);
+ runTestExtension();
+ }
+ }
+ SimpleTest.finish();
+}
+
+function runSupportedTest(extensionEnabled) {
+ var supported = gl.getSupportedExtensions();
+ if (supported.includes("WEBGL_compressed_texture_etc")) {
+ if (extensionEnabled) {
+ ok(true, "WEBGL_compressed_texture_etc listed as supported and getExtension succeeded");
+ } else {
+ ok(false, "WEBGL_compressed_texture_etc listed as supported but getExtension failed");
+ }
+ } else {
+ if (extensionEnabled) {
+ ok(false, "WEBGL_compressed_texture_etc not listed as supported but getExtension succeeded");
+ } else {
+ ok(true, "WEBGL_compressed_texture_etc not listed as supported and getExtension failed -- this is legal");
+ }
+ }
+}
+
+function runTestDisabled() {
+ is(gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS).length, 0,
+ "Should be no compressed texture formats");
+}
+
+function formatExists(format, supportedFormats) {
+ for (var ii = 0; ii < supportedFormats.length; ++ii) {
+ if (format == supportedFormats[ii]) {
+ ok(true, "supported format " + formatToString(format) + " is exists");
+ return;
+ }
+ }
+ ok(false, "supported format " + formatToString(format) + " does not exist");
+}
+
+function formatToString(format) {
+ for (var p in ext) {
+ if (ext[p] == format) {
+ return p;
+ }
+ }
+ return "0x" + format.toString(16);
+}
+
+function runTestExtension() {
+ // check that all format enums exist.
+ for (let name in validFormats) {
+ is(ext[name], validFormats[name], "format is match");
+ }
+
+ let supportedFormats = gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS);
+ // There should be exactly 10 formats
+ is(supportedFormats.length, 10, "Should be exactly 10 formats");
+
+ // check that all 10 formats exist
+ for (let name in validFormats.length) {
+ formatExists(validFormats[name], supportedFormats);
+ }
+
+ // Test each format
+ testETC2_RGB();
+}
+
+function testETC2_RGB() {
+ var tests = [
+ {
+ width: 4,
+ height: 4,
+ channels: 1,
+ data: img_4x4_r11_eac,
+ format: ext.COMPRESSED_R11_EAC
+ },
+ {
+ width: 4,
+ height: 4,
+ channels: 1,
+ data: img_4x4_signed_r11_eac,
+ format: ext.COMPRESSED_SIGNED_R11_EAC
+ },
+ {
+ width: 4,
+ height: 4,
+ channels: 2,
+ data: img_4x4_rg11_eac,
+ format: ext.COMPRESSED_RG11_EAC
+ },
+ {
+ width: 4,
+ height: 4,
+ channels: 2,
+ data: img_4x4_signed_rg11_eac,
+ format: ext.COMPRESSED_SIGNED_RG11_EAC
+ },
+ {
+ width: 4,
+ height: 4,
+ channels: 3,
+ data: img_4x4_rgb_etc2,
+ format: ext.COMPRESSED_RGB8_ETC2
+ },
+ {
+ width: 4,
+ height: 4,
+ channels: 3,
+ data: img_4x4_rgb_etc2,
+ format: ext.COMPRESSED_SRGB8_ETC2
+ },
+ {
+ width: 4,
+ height: 4,
+ channels: 4,
+ data: img_4x4_rgb_punchthrough_etc2,
+ format: ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
+ },
+ {
+ width: 4,
+ height: 4,
+ channels: 4,
+ data: img_4x4_rgb_punchthrough_etc2,
+ format: ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
+ },
+ {
+ width: 4,
+ height: 4,
+ channels: 4,
+ data: img_4x4_rgba_etc2,
+ format: ext.COMPRESSED_RGBA8_ETC2_EAC
+ },
+ {
+ width: 4,
+ height: 4,
+ channels: 4,
+ data: img_4x4_rgba_etc2,
+ format: ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
+ },
+ {
+ width: 8,
+ height: 8,
+ channels: 1,
+ data: img_8x8_r11_eac,
+ format: ext.COMPRESSED_R11_EAC
+ },
+ {
+ width: 8,
+ height: 8,
+ channels: 1,
+ data: img_8x8_signed_r11_eac,
+ format: ext.COMPRESSED_SIGNED_R11_EAC
+ },
+ {
+ width: 8,
+ height: 8,
+ channels: 2,
+ data: img_8x8_rg11_eac,
+ format: ext.COMPRESSED_RG11_EAC
+ },
+ {
+ width: 8,
+ height: 8,
+ channels: 2,
+ data: img_8x8_signed_rg11_eac,
+ format: ext.COMPRESSED_SIGNED_RG11_EAC
+ },
+ {
+ width: 8,
+ height: 8,
+ channels: 3,
+ data: img_8x8_rgb_etc2,
+ format: ext.COMPRESSED_RGB8_ETC2
+ },
+ {
+ width: 8,
+ height: 8,
+ channels: 3,
+ data: img_8x8_rgb_etc2,
+ format: ext.COMPRESSED_SRGB8_ETC2
+ },
+ {
+ width: 8,
+ height: 8,
+ channels: 4,
+ data: img_8x8_rgb_punchthrough_etc2,
+ format: ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
+ },
+ {
+ width: 8,
+ height: 8,
+ channels: 4,
+ data: img_8x8_rgb_punchthrough_etc2,
+ format: ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
+ },
+ {
+ width: 8,
+ height: 8,
+ channels: 4,
+ data: img_8x8_rgba_etc2,
+ format: ext.COMPRESSED_RGBA8_ETC2_EAC
+ },
+ {
+ width: 8,
+ height: 8,
+ channels: 4,
+ data: img_8x8_rgba_etc2,
+ format: ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
+ },
+ {
+ width: 32,
+ height: 32,
+ channels: 1,
+ data: img_32x32_r11_eac,
+ format: ext.COMPRESSED_R11_EAC
+ },
+ {
+ width: 32,
+ height: 32,
+ channels: 1,
+ data: img_32x32_signed_r11_eac,
+ format: ext.COMPRESSED_SIGNED_R11_EAC
+ },
+ {
+ width: 32,
+ height: 32,
+ channels: 2,
+ data: img_32x32_rg11_eac,
+ format: ext.COMPRESSED_RG11_EAC
+ },
+ {
+ width: 32,
+ height: 32,
+ channels: 2,
+ data: img_32x32_signed_rg11_eac,
+ format: ext.COMPRESSED_SIGNED_RG11_EAC
+ },
+ {
+ width: 32,
+ height: 32,
+ channels: 3,
+ data: img_32x32_rgb_etc2,
+ format: ext.COMPRESSED_RGB8_ETC2
+ },
+ {
+ width: 32,
+ height: 32,
+ channels: 3,
+ data: img_32x32_rgb_etc2,
+ format: ext.COMPRESSED_SRGB8_ETC2
+ },
+ {
+ width: 32,
+ height: 32,
+ channels: 4,
+ data: img_32x32_rgb_punchthrough_etc2,
+ format: ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
+ },
+ {
+ width: 32,
+ height: 32,
+ channels: 4,
+ data: img_32x32_rgb_punchthrough_etc2,
+ format: ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
+ },
+ {
+ width: 32,
+ height: 32,
+ channels: 4,
+ data: img_32x32_rgba_etc2,
+ format: ext.COMPRESSED_RGBA8_ETC2_EAC
+ },
+ {
+ width: 32,
+ height: 32,
+ channels: 4,
+ data: img_32x32_rgba_etc2,
+ format: ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
+ },
+ ];
+ testETCTextures(tests);
+}
+
+function testETCTextures(tests) {
+ for (var ii = 0; ii < tests.length; ++ii) {
+ testETCTexture(tests[ii]);
+ }
+}
+
+/* Return the size of block in bytes */
+function getBlockSize(format) {
+ switch (format) {
+ case ext.COMPRESSED_R11_EAC:
+ case ext.COMPRESSED_SIGNED_R11_EAC:
+ case ext.COMPRESSED_RGB8_ETC2:
+ case ext.COMPRESSED_SRGB8_ETC2:
+ case ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+ case ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+ return 8;
+ case ext.COMPRESSED_RG11_EAC:
+ case ext.COMPRESSED_SIGNED_RG11_EAC:
+ case ext.COMPRESSED_RGBA8_ETC2_EAC:
+ case ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
+ return 16
+ }
+}
+
+function copyRect(data, srcX, srcY, dstX, dstY, width, height, stride) {
+ var bytesPerLine = width * 4;
+ var srcOffset = srcX * 4 + srcY * stride;
+ var dstOffset = dstX * 4 + dstY * stride;
+ for (var jj = height; jj > 0; --jj) {
+ for (var ii = 0; ii < bytesPerLine; ++ii) {
+ data[dstOffset + ii] = data[srcOffset + ii];
+ }
+ srcOffset += stride;
+ dstOffset += stride;
+ }
+}
+
+function testETCTexture(test) {
+ var data = new Uint8Array(test.data.compressed);
+ var width = test.width;
+ var height = test.height;
+ var format = test.format;
+
+ var uncompressedData = new Uint8Array(test.data.decompressed);
+ var glErrorShouldBe = (glInner, glError, msg) => {
+ msg = msg || "";
+ var err = glInner.getError();
+ var getGLErrorAsString = error => {
+ if (error === glInner.NO_ERROR) {
+ return "NO_ERROR";
+ }
+ for (let name in glInner) {
+ if (glInner[name] === error) {
+ return name;
+ }
+ }
+ return error.toString();
+ }
+
+ if (err != glError) {
+ ok(false, "getError expected: " + getGLErrorAsString(glError) +
+ ". Was " + getGLErrorAsString(err) + " : " + msg);
+ } else {
+ ok(true, "getError was expected value: " +
+ getGLErrorAsString(glError) + " : " + msg);
+ }
+ };
+
+ canvas.width = width;
+ canvas.height = height;
+ gl.viewport(0, 0, width, height);
+
+ var tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, data);
+ glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture");
+ gl.generateMipmap(gl.TEXTURE_2D);
+ glErrorShouldBe(gl, gl.INVALID_OPERATION, "trying to generate mipmaps from compressed texture");
+ if (format == ext.COMPRESSED_SIGNED_R11_EAC) {
+ var program = WebGLUtil.createProgramByIds(gl, 'vshader', 'fshader-r');
+ } else if (format == ext.COMPRESSED_SIGNED_RG11_EAC) {
+ var program = WebGLUtil.createProgramByIds(gl, 'vshader', 'fshader-rg');
+ } else {
+ var program = WebGLUtil.createProgramByIds(gl, 'vshader', 'fshader');
+ }
+ gl.bindAttribLocation(program, 0, 'vPosition');
+ gl.bindAttribLocation(program, 1, 'texCoord0');
+ gl.useProgram(program);
+
+ gl.clearColor(1.0, 1.0, 1.0, 1.0);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.drawArrays(gl.TRIANGLES, 0, 6);
+ compareRect(width, height, test.channels, width, height, uncompressedData, data, format);
+
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 1, data);
+ glErrorShouldBe(gl, gl.INVALID_VALUE, "non 0 border");
+
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width + 4, height, 0, data);
+ glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height + 4, 0, data);
+ glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 4, height, 0, data);
+ glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 4, 0, data);
+ glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
+
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 1, height, 0, data);
+ glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported");
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 2, height, 0, data);
+ glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported");
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 1, 0, data);
+ glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported");
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 2, 0, data);
+ glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported");
+
+ if (width == 4) {
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, 1, height, 0, data);
+ glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0");
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, 2, height, 0, data);
+ glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0");
+ }
+ if (height == 4) {
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, width, 1, 0, data);
+ glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0");
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, width, 2, 0, data);
+ glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0");
+ }
+
+ // pick a wrong format that uses the same amount of data.
+ var wrongFormat;
+ switch (format) {
+ case ext.COMPRESSED_R11_EAC:
+ wrongFormat = ext.COMPRESSED_SIGNED_R11_EAC;
+ break;
+ case ext.COMPRESSED_SIGNED_R11_EAC:
+ wrongFormat = ext.COMPRESSED_R11_EAC;
+ break;
+ case ext.COMPRESSED_RG11_EAC:
+ wrongFormat = ext.COMPRESSED_SIGNED_RG11_EAC;
+ break;
+ case ext.COMPRESSED_SIGNED_RG11_EAC:
+ wrongFormat = ext.COMPRESSED_RG11_EAC;
+ break;
+ case ext.COMPRESSED_RGB8_ETC2:
+ wrongFormat = ext.COMPRESSED_SRGB8_ETC2;
+ break;
+ case ext.COMPRESSED_SRGB8_ETC2:
+ wrongFormat = ext.COMPRESSED_RGB8_ETC2;
+ break;
+ case ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+ wrongFormat = ext.COMPRESSED_RGB8_ETC2;
+ break;
+ case ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+ wrongFormat = ext.COMPRESSED_RGB8_ETC2;
+ break;
+ case ext.COMPRESSED_RGBA8_ETC2_EAC:
+ wrongFormat = ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
+ break;
+ case ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
+ wrongFormat = ext.COMPRESSED_RGBA8_ETC2_EAC;
+ break;
+ }
+
+ // Restore original texture.
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, data);
+ glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture");
+
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, wrongFormat, data);
+ glErrorShouldBe(gl, gl.INVALID_OPERATION, "format does not match");
+
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width + 4, height, format, data);
+ glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height + 4, format, data);
+ glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 4, height, format, data);
+ glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 4, format, data);
+ glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
+
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, data);
+ glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture");
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 1, height, format, data);
+ glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 2, height, format, data);
+ glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 1, format, data);
+ glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 2, format, data);
+ glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
+
+ var subData = new Uint8Array(data.buffer, 0, getBlockSize(format));
+
+ if (width == 8 && height == 8) {
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 1, 0, 4, 4, format, subData);
+ glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid offset");
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 1, 4, 4, format, subData);
+ glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid offset");
+ }
+
+ if (width < 32 && height < 32) {
+ var stride = width * 4;
+ for (var yoff = 0; yoff < height; yoff += 4) {
+ for (var xoff = 0; xoff < width; xoff += 4) {
+ copyRect(uncompressedData, 0, 0, xoff, yoff, 4, 4, stride);
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, xoff, yoff, 4, 4, format, subData);
+ glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture");
+ gl.clearColor(1.0, 1.0, 1.0, 1.0);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.drawArrays(gl.TRIANGLES, 0, 6);
+ compareRect(width, height, test.channels, width, height, uncompressedData, data, format);
+ }
+ }
+ }
+}
+
+function insertImg(element, caption, img) {
+ var div = document.createElement("div");
+ div.appendChild(img);
+ var label = document.createElement("div");
+ label.appendChild(document.createTextNode(caption));
+ div.appendChild(label);
+ element.appendChild(div);
+}
+
+function convertToSRGB(val) {
+ var norm = val / 255.0;
+ var res = 0;
+ if (norm <= 0.04045) {
+ res = norm / 12.92;
+ } else {
+ res = Math.pow(((norm + 0.055)/1.055), 2.4);
+ }
+
+ return res * 255.0;
+}
+
+function makeImage(imageWidth, imageHeight, dataWidth, data, alpha) {
+ var scale = 8;
+ var c = document.createElement("canvas");
+ c.width = imageWidth * scale;
+ c.height = imageHeight * scale;
+ var ctx = c.getContext("2d");
+ for (var yy = 0; yy < imageHeight; ++yy) {
+ for (var xx = 0; xx < imageWidth; ++xx) {
+ var offset = (yy * dataWidth + xx) * 4;
+ ctx.fillStyle = "rgba(" +
+ data[offset + 0] + "," +
+ data[offset + 1] + "," +
+ data[offset + 2] + "," +
+ (alpha ? data[offset + 3] / 255 : 1) + ")";
+ ctx.fillRect(xx * scale, yy * scale, scale, scale);
+ }
+ }
+ var img = document.createElement("img");
+ img.src = c.toDataURL();
+ return img;
+}
+
+function compareRect(actualWidth, actualHeight, actualChannels,
+ dataWidth, dataHeight, expectedData,
+ testData, testFormat)
+{
+ var actual = new Uint8Array(actualWidth * actualHeight * 4);
+ gl.readPixels(
+ 0, 0, actualWidth, actualHeight, gl.RGBA, gl.UNSIGNED_BYTE, actual);
+
+ var div = document.createElement("div");
+ div.className = "testimages";
+ var hasAlpha = actualChannels == 4;
+ var imgExpected = makeImage(actualWidth, actualHeight, dataWidth, expectedData, hasAlpha);
+ var imgActual = makeImage(actualWidth, actualHeight, actualWidth, actual, hasAlpha);
+ insertImg(div, "expected", imgExpected);
+ insertImg(div, "actual", imgActual);
+ div.appendChild(document.createElement('br'));
+ document.getElementById("console").appendChild(div);
+
+ var failed = false;
+ for (var yy = 0; yy < actualHeight; ++yy) {
+ for (var xx = 0; xx < actualWidth; ++xx) {
+ var actualOffset = (yy * actualWidth + xx) * 4;
+ var expectedOffset = (yy * dataWidth + xx) * 4;
+ var expected = expectedData.slice(expectedOffset, expectedOffset + 4);
+
+ var maxDiffPixel = 0;
+ switch (testFormat) {
+ case ext.COMPRESSED_SRGB8_ETC2:
+ case ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+ case ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
+
+ // Alpha shouldn't do conversion.
+ for (var i = 0; i < 3; ++i) {
+ expected[i] = convertToSRGB(expected[i]);
+ }
+ //fallthrough
+ case ext.COMPRESSED_R11_EAC:
+ case ext.COMPRESSED_RG11_EAC:
+ case ext.COMPRESSED_SIGNED_R11_EAC:
+ case ext.COMPRESSED_SIGNED_RG11_EAC:
+ // Due to floating round error, we need fuzzy test here.
+ var maxDiffPixel = 1;
+ break;
+ default:
+ var maxDiffPixel = 0;
+ break;
+ }
+
+ for (var channel = 0; channel < actualChannels; ++channel) {
+ var diff = Math.abs(expected[channel] - actual[actualOffset + channel]);
+
+ if (diff > maxDiffPixel) {
+ failed = true;
+ var was = actual.slice(actualOffset, actualOffset + 4).join();
+ ok(false, 'at (' + xx + ', ' + yy +
+ ') expected: ' + expected.join() + ' was ' + was);
+ break;
+ }
+ }
+ }
+ }
+ if (!failed) {
+ ok(true, "texture rendered correctly");
+ }
+}
+
+var prefArrArr = [
+ ['webgl.enable-draft-extensions', true],
+];
+var prefEnv = {'set': prefArrArr};
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv(prefEnv, runTest);
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_fingerprinting_resistance.html b/dom/canvas/test/webgl-mochitest/test_webgl_fingerprinting_resistance.html
new file mode 100644
index 0000000000..99f81cb7e1
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_webgl_fingerprinting_resistance.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<script>
+/* global SimpleTest SpecialPowers */
+SimpleTest.waitForExplicitFinish();
+document.addEventListener("DOMContentLoaded", async function() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["privacy.resistFingerprinting", true]
+ ]
+ });
+
+ let canvas = document.body.appendChild(document.createElement("canvas"));
+ if (!canvas) {
+ SimpleTest.ok(false, "Cannot create canvas");
+ SimpleTest.finish();
+ }
+
+ let gl = canvas.getContext("webgl");
+ if (!gl) {
+ SimpleTest.ok(false, "Cannot get WebGL context");
+ SimpleTest.finish();
+ }
+
+ SimpleTest.is(gl.getParameter(gl.MAX_TEXTURE_SIZE), 2048, "MAX_TEXTURE_SIZE");
+ SimpleTest.is(gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE), 2048, "MAX_CUBE_MAP_TEXTURE_SIZE");
+ SimpleTest.is(gl.getParameter(gl.MAX_RENDERBUFFER_SIZE), 2048, "MAX_RENDERBUFFER_SIZE");
+ SimpleTest.is(gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS), 8, "MAX_VERTEX_TEXTURE_IMAGE_UNITS");
+ SimpleTest.is(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS), 8, "MAX_TEXTURE_IMAGE_UNITS");
+ SimpleTest.is(gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS), 16, "MAX_COMBINED_TEXTURE_IMAGE_UNITS");
+ SimpleTest.is(gl.getParameter(gl.MAX_VERTEX_ATTRIBS), 16, "MAX_VERTEX_ATTRIBS");
+ SimpleTest.is(gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS), 256, "MAX_VERTEX_UNIFORM_VECTORS");
+ SimpleTest.is(gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS), 224, "MAX_FRAGMENT_UNIFORM_VECTORS");
+ SimpleTest.is(gl.getParameter(gl.MAX_VARYING_VECTORS), 8, "MAX_VARYING_VECTORS");
+ let viewportDims = gl.getParameter(gl.MAX_VIEWPORT_DIMS);
+ SimpleTest.is(viewportDims[0], 4096, "MAX_VIEWPORT_DIMS[0]");
+ SimpleTest.is(viewportDims[1], 4096, "MAX_VIEWPORT_DIMS[1]");
+ let aliasedPointSizeRange = gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE);
+ SimpleTest.is(aliasedPointSizeRange[0], 1, "ALIASED_POINT_SIZE_RANGE[0]");
+ SimpleTest.is(aliasedPointSizeRange[1], 63, "ALIASED_POINT_SIZE_RANGE[1]");
+ let aliasedLineWIdthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);
+ SimpleTest.is(aliasedLineWIdthRange[0], 1, "ALIASED_LINE_WIDTH_RANGE[0]");
+ SimpleTest.is(aliasedLineWIdthRange[1], 1, "ALIASED_LINE_WIDTH_RANGE[1]");
+ SimpleTest.finish();
+});
+</script>
diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_force_enable.html b/dom/canvas/test/webgl-mochitest/test_webgl_force_enable.html
new file mode 100644
index 0000000000..8e8b05e6d3
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_webgl_force_enable.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>WebGL test: Check that WebGL works (or not) if it should (or should not).</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+</head>
+<body>
+<canvas id="c"></canvas>
+<script>
+
+function test() {
+ ok(SpecialPowers.getBoolPref('webgl.force-enabled'), 'WebGL should be force-enabled.');
+
+ var shouldSucceed = true;
+ var shouldFail = false;
+
+ if (DriverInfo.getOS() == DriverInfo.OS.ANDROID &&
+ DriverInfo.getOSVersion() < 15)
+ {
+ // Consider 'random'. Actually, ARMv6 fails, and ARMv7 succeeds, but we have
+ // not been successful at determining this from JS. (see bug 917478)
+ shouldSucceed = false;
+ shouldFail = false;
+ }
+
+ var gl = c.getContext('webgl');
+ if (shouldSucceed) {
+ ok(gl, 'Expected WebGL creation to succeed.');
+ }
+ if (shouldFail) {
+ ok(!gl, 'Expected WebGL creation to fail.');
+ }
+
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+
+var prefArrArr = [
+ ['webgl.force-enabled', true]
+];
+var prefEnv = {'set': prefArrArr};
+SpecialPowers.pushPrefEnv(prefEnv, test);
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_request_context.html b/dom/canvas/test/webgl-mochitest/test_webgl_request_context.html
new file mode 100644
index 0000000000..d11584e08c
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_webgl_request_context.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<title>WebGL test: 'webgl' and 'experimental-webgl' context requests succeed,
+ 'moz-webgl' context requests fail.</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<body>
+<canvas id="c1"></canvas>
+<canvas id="c2"></canvas>
+<script>
+
+var testFunc = ok;
+
+function testContextRetrieval(canvasId, creationId, shouldSucceed) {
+ var canvas = document.getElementById(canvasId);
+ ok(canvas, 'Invalid `canvasId`: ' + canvasId);
+
+ var createdGL = canvas.getContext(creationId);
+ if (shouldSucceed) {
+ testFunc(createdGL, 'Request for \'' + creationId + '\' should succeed.');
+ } else {
+ ok(!createdGL, 'Request for \'' + creationId + '\' should fail.');
+ }
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({'set': [
+ ['webgl.force-enabled', true]
+]}, function() {
+ testContextRetrieval('c1', 'experimental-webgl', true);
+ testContextRetrieval('c2', 'moz-webgl', false);
+ SimpleTest.finish();
+});
+
+</script>
+
diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_request_mismatch.html b/dom/canvas/test/webgl-mochitest/test_webgl_request_mismatch.html
new file mode 100644
index 0000000000..1dcab1c167
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_webgl_request_mismatch.html
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+</head>
+<body>
+<script>
+
+WEBGL_TYPES = {};
+WEBGL_TYPES['experimental-webgl'] = true;
+WEBGL_TYPES.webgl = true;
+
+function AreBothIn(a, b, set) {
+ return (a in set) && (b in set);
+}
+
+function IsAlias(typeA, typeB) {
+ if (typeA == typeB)
+ return true;
+
+ if (AreBothIn(typeA, typeB, WEBGL_TYPES))
+ return true;
+
+ return false;
+}
+
+function TestContextRetrieval(creationType, requestType, functionalTypeSet) {
+ var canvas = document.createElement('canvas');
+ var createdGL = canvas.getContext(creationType);
+
+ var didCreationSucceed = (createdGL != null);
+ if (creationType in functionalTypeSet) {
+ ok(createdGL, 'Context creation should succeed for type \'' +
+ creationType + '\'');
+ } else {
+ ok(!createdGL, 'Context creation should fail for type \'' +
+ creationType + '\'');
+ return;
+ }
+
+ var requestedGL = canvas.getContext(requestType);
+
+ if (requestType in functionalTypeSet &&
+ IsAlias(creationType, requestType))
+ {
+ ok(requestedGL, 'Request for \'' + requestType + '\' from \'' +
+ creationType + '\' should succeed.');
+ ok(requestedGL == createdGL, 'Request for \'' + requestType +
+ '\' from \'' + creationType +
+ '\' should match.');
+ } else {
+ ok(!requestedGL, 'Request for \'' + requestType + '\' from \'' +
+ creationType + '\' should fail.');
+ }
+}
+
+function IsWebGLFunctional() {
+ var canvas = document.createElement('canvas');
+ return canvas.getContext('experimental-webgl') != null;
+}
+
+function IsWebGLConformant() {
+ var canvas = document.createElement('canvas');
+ return canvas.getContext('webgl') != null;
+}
+
+var typeList = ['2d', 'experimental-webgl', 'webgl'];
+var functionalTypeSet = {};
+functionalTypeSet['2d'] = true;
+
+if (IsWebGLFunctional())
+ functionalTypeSet['experimental-webgl'] = true;
+
+if (IsWebGLConformant())
+ functionalTypeSet.webgl = true;
+
+for (var i in typeList) {
+ var creationType = typeList[i];
+
+ for (var j in typeList) {
+ var requestType = typeList[j];
+
+ TestContextRetrieval(creationType, requestType, functionalTypeSet);
+ }
+}
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_webglcontextcreationerror.html b/dom/canvas/test/webgl-mochitest/test_webglcontextcreationerror.html
new file mode 100644
index 0000000000..65d9b4eb2f
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_webglcontextcreationerror.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset='UTF-8'>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+</head>
+<body>
+<script>
+'use strict';
+
+function RunWithPrefs(prefPairList, func) {
+ var prefEnv = {'set': prefPairList};
+ try {
+ SpecialPowers.pushPrefEnv(prefEnv, func);
+ } catch (e) {
+ console.log('Warning: Failed to set prefs: ' + JSON.stringify(prefPairList));
+ func();
+ }
+}
+
+////////////////////////////////////////
+
+function Check(expr, text) {
+ ok(expr, text);
+ return expr;
+}
+
+function TestWhenDisabled() {
+ var c = document.createElement('canvas');
+
+ var generatedEvent = null;
+ var f = function(event) { generatedEvent = event; };
+ c.addEventListener('webglcontextcreationerror', f);
+
+ var gl = c.getContext('webgl'); // Should fail.
+
+ do {
+ if (!Check(!gl, 'When disabled, context creation should fail.'))
+ break;
+
+ if (!Check(generatedEvent, 'Context creation failure should generate an event.'))
+ break;
+
+ var reason = generatedEvent.statusMessage;
+ if (!Check(reason !== undefined, 'generatedEvent.statusMessage should be defined.'))
+ break;
+
+ ok(reason.length, 'statusMessage should be non-empty.');
+ } while (false);
+
+ SimpleTest.finish();
+}
+
+////////////////////////////////////////
+
+SimpleTest.waitForExplicitFinish();
+
+var prefPairList = [
+ ['webgl.disabled', true],
+];
+RunWithPrefs(prefPairList, TestWhenDisabled);
+
+</script>
+</body>
+</html>
diff --git a/dom/canvas/test/webgl-mochitest/test_without_index_validation.html b/dom/canvas/test/webgl-mochitest/test_without_index_validation.html
new file mode 100644
index 0000000000..01e028539d
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_without_index_validation.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8'>
+<title>WebGL test: Drawing without index validation</title>
+<script src='/tests/SimpleTest/SimpleTest.js'></script>
+<link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+
+<script id='vertSource' type='none'>
+void main(void) {
+ gl_PointSize = 1.0;
+ gl_Position = vec4(0, 0, 0, 1);
+}
+</script>
+
+<script id='fragSource' type='none'>
+precision mediump float;
+
+void main(void) {
+ gl_FragColor = vec4(0, 1, 0, 1);
+}
+</script>
+</head>
+<body>
+<script>
+
+function test() {
+ const c = document.createElement('canvas');
+ c.width = c.height = 1;
+ const gl = c.getContext('webgl');
+ if (!gl) {
+ todo(false, 'WebGL is unavailable.');
+ return;
+ }
+ document.body.appendChild(c);
+
+ const vs = gl.createShader(gl.VERTEX_SHADER);
+ gl.shaderSource(vs, vertSource.innerHTML.trim());
+ gl.compileShader(vs);
+ const fs = gl.createShader(gl.FRAGMENT_SHADER);
+ gl.shaderSource(fs, fragSource.innerHTML.trim());
+ gl.compileShader(fs);
+ const prog = gl.createProgram();
+ gl.attachShader(prog, vs);
+ gl.attachShader(prog, fs);
+ gl.linkProgram(prog);
+ gl.useProgram(prog);
+
+ gl.clearColor(1,0,0,1);
+ const pixel = new Uint32Array(1);
+ const pixelData = new Uint8Array(pixel.buffer);
+
+ function expectPixel(expected, info) {
+ gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixelData);
+ ok(pixel[0] == expected,
+ '[' + info + '] Expected 0x' + expected.toString(16) + ', was 0x' + pixel[0].toString(16));
+ }
+
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ expectPixel(0xFF0000FF, 'Clear');
+
+ gl.drawArrays(gl.POINTS, 0, 1);
+ expectPixel(0xFF00FF00, 'DrawArrays');
+
+ const indexBuffer = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0]), gl.STATIC_DRAW);
+
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.drawElements(gl.POINTS, 1, gl.UNSIGNED_SHORT, 0);
+ expectPixel(0xFF00FF00, 'DrawElements');
+
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+
+const prefArrArr = [
+ ['webgl.force-index-validation', -1]
+];
+const prefEnv = {'set': prefArrArr};
+SpecialPowers.pushPrefEnv(prefEnv, test);
+
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/canvas/test/webgl-mochitest/webgl-util.js b/dom/canvas/test/webgl-mochitest/webgl-util.js
new file mode 100644
index 0000000000..ca4837860a
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/webgl-util.js
@@ -0,0 +1,137 @@
+WebGLUtil = (function () {
+ // ---------------------------------------------------------------------------
+ // WebGL helpers
+
+ function withWebGL2(canvasId, callback, onFinished) {
+ var run = function () {
+ var canvas = document.getElementById(canvasId);
+
+ var gl = null;
+ try {
+ gl = canvas.getContext("webgl2");
+ } catch (e) {}
+
+ if (!gl) {
+ todo(false, "WebGL2 is not supported");
+ onFinished();
+ return;
+ }
+
+ callback(gl);
+ onFinished();
+ };
+
+ try {
+ var prefArrArr = [
+ ["webgl.force-enabled", true],
+ ["webgl.enable-webgl2", true],
+ ];
+ var prefEnv = { set: prefArrArr };
+ SpecialPowers.pushPrefEnv(prefEnv, run);
+ } catch (e) {
+ warning("No SpecialPowers, but trying WebGL2 anyway...");
+ run();
+ }
+ }
+
+ // Returns a valid shader, or null on errors.
+ function createShaderById(gl, id) {
+ var elem = document.getElementById(id);
+ if (!elem) {
+ throw new Error(
+ "Failed to create shader from non-existent id '" + id + "'."
+ );
+ }
+
+ var src = elem.innerHTML.trim();
+
+ var shader;
+ if (elem.type == "x-shader/x-fragment") {
+ shader = gl.createShader(gl.FRAGMENT_SHADER);
+ } else if (elem.type == "x-shader/x-vertex") {
+ shader = gl.createShader(gl.VERTEX_SHADER);
+ } else {
+ throw new Error(
+ "Bad MIME type for shader '" + id + "': " + elem.type + "."
+ );
+ }
+
+ gl.shaderSource(shader, src);
+ gl.compileShader(shader);
+
+ return shader;
+ }
+
+ function createProgramByIds(gl, vsId, fsId) {
+ var vs = createShaderById(gl, vsId);
+ var fs = createShaderById(gl, fsId);
+ if (!vs || !fs) {
+ return null;
+ }
+
+ var prog = gl.createProgram();
+ gl.attachShader(prog, vs);
+ gl.attachShader(prog, fs);
+ gl.linkProgram(prog);
+
+ if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {
+ var str = "Shader program linking failed:";
+ str += "\nShader program info log:\n" + gl.getProgramInfoLog(prog);
+ str += "\n\nVert shader log:\n" + gl.getShaderInfoLog(vs);
+ str += "\n\nFrag shader log:\n" + gl.getShaderInfoLog(fs);
+ console.error(str);
+ return null;
+ }
+
+ return prog;
+ }
+
+ return {
+ withWebGL2,
+
+ createShaderById,
+ createProgramByIds,
+
+ linkProgramByIds(gl, vertSrcElem, fragSrcElem) {
+ const prog = gl.createProgram();
+
+ function attachShaderById(type, srcElem) {
+ const shader = gl.createShader(type);
+ gl.shaderSource(shader, srcElem.innerHTML.trim() + "\n");
+ gl.compileShader(shader);
+ gl.attachShader(prog, shader);
+ prog[type] = shader;
+ }
+ attachShaderById(gl.VERTEX_SHADER, vertSrcElem);
+ attachShaderById(gl.FRAGMENT_SHADER, fragSrcElem);
+
+ gl.linkProgram(prog);
+ const success = gl.getProgramParameter(prog, gl.LINK_STATUS);
+ if (!success) {
+ console.error("Error linking program:");
+ console.error("\nLink log: " + gl.getProgramInfoLog(prog));
+ console.error(
+ "\nVert shader log: " + gl.getShaderInfoLog(prog[gl.VERTEX_SHADER])
+ );
+ console.error(
+ "\nFrag shader log: " + gl.getShaderInfoLog(prog[gl.FRAGMENT_SHADER])
+ );
+ return null;
+ }
+ gl.deleteShader(prog[gl.VERTEX_SHADER]);
+ gl.deleteShader(prog[gl.FRAGMENT_SHADER]);
+
+ let count = gl.getProgramParameter(prog, gl.ACTIVE_ATTRIBUTES);
+ for (let i = 0; i < count; i++) {
+ const info = gl.getActiveAttrib(prog, i);
+ prog[info.name] = gl.getAttribLocation(prog, info.name);
+ }
+ count = gl.getProgramParameter(prog, gl.ACTIVE_UNIFORMS);
+ for (let i = 0; i < count; i++) {
+ const info = gl.getActiveUniform(prog, i);
+ prog[info.name] = gl.getUniformLocation(prog, info.name);
+ }
+ return prog;
+ },
+ };
+})();