From d7664a97466b4f6eaa4829b5443cfe18d704f15f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 21 Aug 2024 17:17:58 +0800 Subject: [PATCH 001/232] feat!: (web) (flutter) create canvas when createViewer is called (no longer need to manually add canvas element to web HTML) --- .../lib/thermion_dart/thermion_viewer.dart | 1 - .../lib/thermion/thermion_flutter_plugin.dart | 10 ++-- .../lib/thermion/widgets/thermion_widget.dart | 22 +++++++-- .../thermion/widgets/thermion_widget_web.dart | 3 ++ .../widgets/thermion_widget_web_impl.dart | 49 +++++++++++++++++++ .../widgets/thermion_widget_web_stub.dart | 7 +++ .../lib/thermion_flutter_web.dart | 21 +++++--- 7 files changed, 95 insertions(+), 18 deletions(-) create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index 49370879..c3569657 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -85,7 +85,6 @@ abstract class ThermionViewer { /// Future render(); - /// /// Render a single frame to the viewport and copy the pixel buffer to [out]. /// diff --git a/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart b/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart index 3c784cc9..da02e615 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart @@ -9,10 +9,8 @@ import 'package:thermion_flutter_platform_interface/thermion_flutter_texture.dar /// surface in a Flutter application and lifecycle listeners to pause rendering /// when the app is inactive or in the background. /// Call [createViewer] to create an instance of [ThermionViewer]. -/// This is a lightweight singleton that /// class ThermionFlutterPlugin { - ThermionFlutterPlugin._(); static AppLifecycleListener? _appLifecycleListener; @@ -92,8 +90,12 @@ class ThermionFlutterPlugin { } @override - static Future resizeTexture(ThermionFlutterTexture texture, - int width, int height, int offsetLeft, int offsetRight) async { + static Future resizeTexture( + ThermionFlutterTexture texture, + int width, + int height, + int offsetLeft, + int offsetRight) async { return ThermionFlutterPlatform.instance .resizeTexture(texture, width, height, offsetLeft, offsetRight); } diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart index e69d2eb1..2f86d154 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:thermion_flutter/thermion/widgets/thermion_widget_web.dart'; import 'dart:async'; import 'package:thermion_flutter_platform_interface/thermion_flutter_texture.dart'; @@ -82,17 +83,27 @@ class _ThermionWidgetState extends State { @override Widget build(BuildContext context) { + if (kIsWeb) { + if (_texture == null || _resizing) { + return widget.initial ?? Container(color: Colors.red); + } + return ResizeObserver( + onResized: _resizeTexture, child: ThermionWidgetWeb()); + } + if (_texture?.usesBackingWindow == true) { return ResizeObserver( - onResized: _resizeTexture, - child: Stack(children: [ - Positioned.fill(child: CustomPaint(painter: TransparencyPainter())) - ])); + onResized: _resizeTexture, + child: Stack(children: [ + Positioned.fill(child: CustomPaint(painter: TransparencyPainter())) + ])); } if (_texture == null || _resizing) { return widget.initial ?? - Container(color: kIsWeb ? Colors.transparent : Colors.red); + Container( + color: + kIsWeb ? const Color.fromARGB(0, 170, 129, 129) : Colors.red); } var textureWidget = Texture( @@ -131,3 +142,4 @@ class TransparencyPainter extends CustomPainter { @override bool shouldRepaint(covariant CustomPainter oldDelegate) => false; } + diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web.dart new file mode 100644 index 00000000..1b72c757 --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web.dart @@ -0,0 +1,3 @@ +export 'thermion_widget_web_stub.dart' + if (dart.library.js_interop) 'thermion_widget_web_impl.dart'; + diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart new file mode 100644 index 00000000..905d63a6 --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart @@ -0,0 +1,49 @@ +import 'dart:js_util'; +import 'dart:js_interop'; +import 'dart:js_interop_unsafe'; +import 'dart:ui' as ui; +import 'dart:ui_web' as ui_web; +import 'package:flutter/material.dart'; +import 'package:web/web.dart'; +import 'package:flutter/widgets.dart'; +import 'dart:html' as html; + +class ThermionWidgetWeb extends StatefulWidget { + @override + State createState() => ThermionWidgetWebState(); +} + +class ThermionWidgetWebState extends State { + ui.Image? _img; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + capture(); + }); + } + + Future capture() async { + try { + final ImageBitmap newSource = await promiseToFuture( + window.createImageBitmap( + document.getElementById("canvas") as HTMLCanvasElement)); + _img = await ui_web.createImageFromImageBitmap(newSource); + setState(() {}); + WidgetsBinding.instance.addPostFrameCallback((_) { + capture(); + }); + } catch (err) { + print(err); + } + } + + @override + Widget build(BuildContext context) { + if (_img == null) { + return Container(color: Colors.transparent); + } + return RawImage(image: _img!); + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart new file mode 100644 index 00000000..528afe83 --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +class ThermionWidgetWeb extends StatefulWidget { + @override + State createState() => throw Exception(); +} diff --git a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart index 765c5dc2..230a08b1 100644 --- a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart +++ b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart @@ -17,6 +17,14 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { @override Future createTexture( int width, int height, int offsetLeft, int offsetRight) async { + await _viewer!.destroySwapChain(); + await _viewer!.createSwapChain(width, height); + _viewer!.updateViewportAndCameraProjection(width, height, 1.0); + + final canvas = document.getElementById("canvas") as HTMLCanvasElement; + canvas.width = width; + canvas.height = height; + return ThermionFlutterTexture(null, null, 0, 0, null); } @@ -39,15 +47,12 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { } Future createViewer({String? uberArchivePath}) async { - final canvas = document.getElementById("canvas") as HTMLCanvasElement; - canvas.width = window.innerWidth; - canvas.height = window.innerHeight; - - var width = window.innerWidth; - var height = window.innerHeight; - _viewer = ThermionViewerWasm(assetPathPrefix: "/assets/"); - await _viewer!.initialize(width, height, uberArchivePath: uberArchivePath); + final canvas = document.createElement("canvas") as HTMLCanvasElement; + canvas.id = "canvas"; + document.body!.appendChild(canvas); + canvas.style.display = 'none'; + await _viewer!.initialize(0, 0, uberArchivePath:uberArchivePath); return _viewer!; } } From 98c3676fdfdd5a261b0b27f725a0eb430e88d110 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 21 Aug 2024 17:18:37 +0800 Subject: [PATCH 002/232] fix: (web) add emscripten guards for flushAndWait call when swapchain destroyed --- thermion_dart/native/src/FilamentViewer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 31570388..300551de 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -806,7 +806,11 @@ namespace thermion_filament _swapChain = nullptr; Log("Swapchain destroyed."); } + #ifdef __EMSCRIPTEN__ + _engine->execute(); + #else _engine->flushAndWait(); + #endif } void FilamentViewer::clearEntities() From 7693a0fe149c9ed664de65aa5ebc3ddc0ea05ab5 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 22 Aug 2024 18:04:06 +0800 Subject: [PATCH 003/232] feat: re-implement (native) Gizmo class, expose preserveScaling parameter for setParent, add methods for getting viewport bounding box from renderable entity --- thermion_dart/ffigen/native.yaml | 2 + .../compatibility/native/thermion_dart.g.dart | 182 ++++--- .../entities/abstract_gizmo.dart | 20 + .../lib/thermion_dart/entities/gizmo.dart | 75 +-- .../lib/thermion_dart/thermion_viewer.dart | 22 +- .../thermion_dart/thermion_viewer_ffi.dart | 34 +- .../thermion_dart/thermion_viewer_stub.dart | 9 +- thermion_dart/native/include/Aabb2.h | 18 + thermion_dart/native/include/Gizmo.hpp | 48 ++ thermion_dart/native/include/SceneManager.hpp | 24 +- .../native/include/ThermionDartApi.h | 4 +- thermion_dart/native/src/Gizmo.cpp | 199 ++++++++ thermion_dart/native/src/SceneManager.cpp | 468 ++++++++++-------- thermion_dart/native/src/ThermionDartApi.cpp | 10 +- thermion_dart/native/web/CMakeLists.txt | 1 + 15 files changed, 769 insertions(+), 347 deletions(-) create mode 100644 thermion_dart/native/include/Aabb2.h create mode 100644 thermion_dart/native/include/Gizmo.hpp create mode 100644 thermion_dart/native/src/Gizmo.cpp diff --git a/thermion_dart/ffigen/native.yaml b/thermion_dart/ffigen/native.yaml index c4472fde..cb79e560 100644 --- a/thermion_dart/ffigen/native.yaml +++ b/thermion_dart/ffigen/native.yaml @@ -4,10 +4,12 @@ headers: - '../native/include/ThermionDartFFIApi.h' - '../native/include/ThermionDartApi.h' - '../native/include/ResourceBuffer.h' + - '../native/include/Aabb2.h' include-directives: - '../native/include/ThermionDartFFIApi.h' - '../native/include/ThermionDartApi.h' - '../native/include/ResourceBuffer.h' + - '../native/include/Aabb2.h' ffi-native: assetId: package:thermion_dart/thermion_dart.dart ignore-source-errors: true diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart index 30b657ee..b12b7d42 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart @@ -123,7 +123,7 @@ external void remove_ibl( ); @ffi.Native< - ffi.Int Function( + EntityId Function( ffi.Pointer, ffi.Uint8, ffi.Float, @@ -161,7 +161,7 @@ external int add_light( bool shadows, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external void remove_light( ffi.Pointer viewer, int entityId, @@ -173,7 +173,7 @@ external void clear_lights( ); @ffi.Native< - ffi.Int Function(ffi.Pointer, ffi.Pointer, ffi.Int)>() + EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Int)>() external int load_glb( ffi.Pointer sceneManager, ffi.Pointer assetPath, @@ -181,7 +181,7 @@ external int load_glb( ); @ffi.Native< - ffi.Int Function(ffi.Pointer, ffi.Pointer, ffi.Size)>() + EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Size)>() external int load_glb_from_buffer( ffi.Pointer sceneManager, ffi.Pointer data, @@ -189,7 +189,7 @@ external int load_glb_from_buffer( ); @ffi.Native< - ffi.Int Function( + EntityId Function( ffi.Pointer, ffi.Pointer, ffi.Pointer)>() external int load_gltf( ffi.Pointer sceneManager, @@ -197,24 +197,24 @@ external int load_gltf( ffi.Pointer relativePath, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external int create_instance( ffi.Pointer sceneManager, int id, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external int get_instance_count( ffi.Pointer sceneManager, int entityId, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Pointer)>() + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer)>() external void get_instances( ffi.Pointer sceneManager, int entityId, - ffi.Pointer out, + ffi.Pointer out, ); @ffi.Native)>() @@ -222,13 +222,13 @@ external void set_main_camera( ffi.Pointer viewer, ); -@ffi.Native)>() +@ffi.Native)>() external int get_main_camera( ffi.Pointer viewer, ); @ffi.Native< - ffi.Bool Function(ffi.Pointer, ffi.Int, ffi.Pointer)>() + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer)>() external bool set_camera( ffi.Pointer viewer, int entity, @@ -263,6 +263,15 @@ external void render( ffi.Pointer data, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>() +external void capture( + ffi.Pointer viewer, + ffi.Pointer pixelBuffer, + ffi.Pointer> callback, +); + @ffi.Native< ffi.Void Function( ffi.Pointer, ffi.Pointer, ffi.Uint32, ffi.Uint32)>() @@ -335,7 +344,7 @@ external void grab_end( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Pointer, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, ffi.Pointer, ffi.Int)>() external void apply_weights( ffi.Pointer sceneManager, @@ -347,7 +356,7 @@ external void apply_weights( @ffi.Native< ffi.Bool Function( - ffi.Pointer, ffi.Int, ffi.Pointer, ffi.Int)>() + ffi.Pointer, EntityId, ffi.Pointer, ffi.Int)>() external bool set_morph_target_weights( ffi.Pointer sceneManager, int entity, @@ -356,7 +365,7 @@ external bool set_morph_target_weights( ); @ffi.Native< - ffi.Bool Function(ffi.Pointer, ffi.Int, ffi.Pointer, + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, ffi.Pointer, ffi.Int, ffi.Int, ffi.Float)>() external bool set_morph_animation( ffi.Pointer sceneManager, @@ -368,13 +377,13 @@ external bool set_morph_animation( double frameLengthInMs, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external void clear_morph_animation( ffi.Pointer sceneManager, int entity, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external void reset_to_rest_pose( ffi.Pointer sceneManager, int asset, @@ -383,7 +392,7 @@ external void reset_to_rest_pose( @ffi.Native< ffi.Void Function( ffi.Pointer, - ffi.Int, + EntityId, ffi.Int, ffi.Int, ffi.Pointer, @@ -406,7 +415,8 @@ external void add_bone_animation( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Pointer)>() + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Pointer)>() external void get_local_transform( ffi.Pointer sceneManager, int entityId, @@ -414,7 +424,7 @@ external void get_local_transform( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Int, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Pointer, ffi.Int)>() external void get_rest_local_transforms( ffi.Pointer sceneManager, @@ -425,7 +435,8 @@ external void get_rest_local_transforms( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Pointer)>() + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Pointer)>() external void get_world_transform( ffi.Pointer sceneManager, int entityId, @@ -433,7 +444,7 @@ external void get_world_transform( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Int, ffi.Int, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, ffi.Pointer)>() external void get_inverse_bind_matrix( ffi.Pointer sceneManager, @@ -444,7 +455,7 @@ external void get_inverse_bind_matrix( ); @ffi.Native< - ffi.Bool Function(ffi.Pointer, ffi.Int, ffi.Int, ffi.Int, + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, ffi.Pointer)>() external bool set_bone_transform( ffi.Pointer sceneManager, @@ -455,7 +466,7 @@ external bool set_bone_transform( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Int, ffi.Bool, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Bool, ffi.Bool, ffi.Bool, ffi.Float, ffi.Float)>() external void play_animation( ffi.Pointer sceneManager, @@ -469,7 +480,7 @@ external void play_animation( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Int, ffi.Int)>() + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>() external void set_animation_frame( ffi.Pointer sceneManager, int entity, @@ -477,14 +488,14 @@ external void set_animation_frame( int animationFrame, ); -@ffi.Native, ffi.Int, ffi.Int)>() +@ffi.Native, EntityId, ffi.Int)>() external void stop_animation( ffi.Pointer sceneManager, int entity, int index, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external int get_animation_count( ffi.Pointer sceneManager, int asset, @@ -492,7 +503,7 @@ external int get_animation_count( @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Int, ffi.Pointer, ffi.Int)>() + ffi.Pointer, EntityId, ffi.Pointer, ffi.Int)>() external void get_animation_name( ffi.Pointer sceneManager, int entity, @@ -500,14 +511,14 @@ external void get_animation_name( int index, ); -@ffi.Native, ffi.Int, ffi.Int)>() +@ffi.Native, EntityId, ffi.Int)>() external double get_animation_duration( ffi.Pointer sceneManager, int entity, int index, ); -@ffi.Native, ffi.Int, ffi.Int)>() +@ffi.Native, EntityId, ffi.Int)>() external int get_bone_count( ffi.Pointer sceneManager, int assetEntity, @@ -515,7 +526,7 @@ external int get_bone_count( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>, ffi.Int)>() external void get_bone_names( ffi.Pointer sceneManager, @@ -525,7 +536,7 @@ external void get_bone_names( ); @ffi.Native< - ffi.Int Function(ffi.Pointer, ffi.Int, ffi.Int, ffi.Int)>() + EntityId Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>() external int get_bone( ffi.Pointer sceneManager, int entityId, @@ -534,21 +545,22 @@ external int get_bone( ); @ffi.Native< - ffi.Bool Function(ffi.Pointer, ffi.Int, ffi.Pointer)>() + ffi.Bool Function( + ffi.Pointer, EntityId, ffi.Pointer)>() external bool set_transform( ffi.Pointer sceneManager, int entityId, ffi.Pointer transform, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external bool update_bone_matrices( ffi.Pointer sceneManager, int entityId, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Int, + ffi.Void Function(ffi.Pointer, EntityId, EntityId, ffi.Pointer, ffi.Int)>() external void get_morph_target_name( ffi.Pointer sceneManager, @@ -558,14 +570,14 @@ external void get_morph_target_name( int index, ); -@ffi.Native, ffi.Int, ffi.Int)>() +@ffi.Native, EntityId, EntityId)>() external int get_morph_target_name_count( ffi.Pointer sceneManager, int assetEntity, int childEntity, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external void remove_entity( ffi.Pointer viewer, int asset, @@ -577,7 +589,7 @@ external void clear_entities( ); @ffi.Native< - ffi.Bool Function(ffi.Pointer, ffi.Int, ffi.Pointer, + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, ffi.Int, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() external bool set_material_color( ffi.Pointer sceneManager, @@ -590,14 +602,14 @@ external bool set_material_color( double a, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external void transform_to_unit_cube( ffi.Pointer sceneManager, int asset, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Float, ffi.Float, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float, ffi.Bool)>() external void queue_position_update( ffi.Pointer sceneManager, @@ -609,7 +621,7 @@ external void queue_position_update( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Float, ffi.Float, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float, ffi.Float, ffi.Float, ffi.Bool)>() external void queue_rotation_update( ffi.Pointer sceneManager, @@ -624,7 +636,7 @@ external void queue_rotation_update( @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Int, ffi.Float, ffi.Float, ffi.Float)>() + ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>() external void set_position( ffi.Pointer sceneManager, int entity, @@ -634,7 +646,7 @@ external void set_position( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Int, ffi.Float, ffi.Float, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() external void set_rotation( ffi.Pointer sceneManager, @@ -646,14 +658,14 @@ external void set_rotation( double w, ); -@ffi.Native, ffi.Int, ffi.Float)>() +@ffi.Native, EntityId, ffi.Float)>() external void set_scale( ffi.Pointer sceneManager, int entity, double scale, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external void move_camera_to_asset( ffi.Pointer viewer, int asset, @@ -782,7 +794,7 @@ external void set_camera_manipulator_options( ); @ffi.Native< - ffi.Int Function(ffi.Pointer, ffi.Int, ffi.Pointer)>() + ffi.Int Function(ffi.Pointer, EntityId, ffi.Pointer)>() external int hide_mesh( ffi.Pointer sceneManager, int entity, @@ -790,7 +802,7 @@ external int hide_mesh( ); @ffi.Native< - ffi.Int Function(ffi.Pointer, ffi.Int, ffi.Pointer)>() + ffi.Int Function(ffi.Pointer, EntityId, ffi.Pointer)>() external int reveal_mesh( ffi.Pointer sceneManager, int entity, @@ -838,32 +850,32 @@ external void set_antialiasing( ffi.Int, ffi.Pointer< ffi.NativeFunction< - ffi.Void Function(ffi.Int entityId, ffi.Int x, ffi.Int y)>>)>() + ffi.Void Function(EntityId entityId, ffi.Int x, ffi.Int y)>>)>() external void filament_pick( ffi.Pointer viewer, int x, int y, ffi.Pointer< ffi.NativeFunction< - ffi.Void Function(ffi.Int entityId, ffi.Int x, ffi.Int y)>> + ffi.Void Function(EntityId entityId, ffi.Int x, ffi.Int y)>> callback, ); -@ffi.Native Function(ffi.Pointer, ffi.Int)>() +@ffi.Native Function(ffi.Pointer, EntityId)>() external ffi.Pointer get_name_for_entity( ffi.Pointer sceneManager, int entityId, ); @ffi.Native< - ffi.Int Function(ffi.Pointer, ffi.Int, ffi.Pointer)>() + EntityId Function(ffi.Pointer, EntityId, ffi.Pointer)>() external int find_child_entity_by_name( ffi.Pointer sceneManager, int parent, ffi.Pointer name, ); -@ffi.Native, ffi.Int, ffi.Bool)>() +@ffi.Native, EntityId, ffi.Bool)>() external int get_entity_count( ffi.Pointer sceneManager, int target, @@ -872,17 +884,17 @@ external int get_entity_count( @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Int, ffi.Bool, ffi.Pointer)>() + ffi.Pointer, EntityId, ffi.Bool, ffi.Pointer)>() external void get_entities( ffi.Pointer sceneManager, int target, bool renderableOnly, - ffi.Pointer out, + ffi.Pointer out, ); @ffi.Native< ffi.Pointer Function( - ffi.Pointer, ffi.Int, ffi.Int, ffi.Bool)>() + ffi.Pointer, EntityId, ffi.Int, ffi.Bool)>() external ffi.Pointer get_entity_name_at( ffi.Pointer sceneManager, int target, @@ -913,41 +925,41 @@ external void thermion_flutter_free( @ffi.Native< ffi.Void Function( ffi.Pointer, - ffi.Int, + EntityId, ffi.Pointer< ffi.NativeFunction< - ffi.Void Function(ffi.Int entityId1, ffi.Int entityId2)>>, + ffi.Void Function(EntityId entityId1, EntityId entityId2)>>, ffi.Bool)>() external void add_collision_component( ffi.Pointer sceneManager, int entityId, ffi.Pointer< ffi.NativeFunction< - ffi.Void Function(ffi.Int entityId1, ffi.Int entityId2)>> + ffi.Void Function(EntityId entityId1, EntityId entityId2)>> callback, bool affectsCollidingTransform, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external void remove_collision_component( ffi.Pointer sceneManager, int entityId, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external bool add_animation_component( ffi.Pointer sceneManager, int entityId, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external void remove_animation_component( ffi.Pointer sceneManager, int entityId, ); @ffi.Native< - ffi.Int Function(ffi.Pointer, ffi.Pointer, ffi.Int, + EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Int, ffi.Pointer, ffi.Int, ffi.Int, ffi.Pointer)>() external int create_geometry( ffi.Pointer viewer, @@ -959,36 +971,44 @@ external int create_geometry( ffi.Pointer materialPath, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external int get_parent( ffi.Pointer sceneManager, int child, ); -@ffi.Native, ffi.Int, ffi.Int)>() +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, EntityId, ffi.Bool)>() external void set_parent( ffi.Pointer sceneManager, int child, int parent, + bool preserveScaling, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, EntityId)>() external void test_collisions( ffi.Pointer sceneManager, int entity, ); -@ffi.Native, ffi.Int, ffi.Int)>() +@ffi.Native, EntityId, ffi.Int)>() external void set_priority( ffi.Pointer sceneManager, int entityId, int priority, ); -@ffi.Native, ffi.Pointer)>() +@ffi.Native, ffi.Pointer)>() external void get_gizmo( ffi.Pointer sceneManager, - ffi.Pointer out, + ffi.Pointer out, +); + +@ffi.Native, EntityId)>() +external Aabb2 get_bounding_box( + ffi.Pointer sceneManager, + int entity, ); @ffi.Native< @@ -1499,6 +1519,27 @@ typedef LoadFilamentResourceIntoOutPointerFunction = ffi.Void Function( ffi.Pointer uri, ffi.Pointer out); typedef DartLoadFilamentResourceIntoOutPointerFunction = void Function( ffi.Pointer uri, ffi.Pointer out); + +final class Aabb2 extends ffi.Struct { + @ffi.Float() + external double minX; + + @ffi.Float() + external double minY; + + @ffi.Float() + external double maxX; + + @ffi.Float() + external double maxY; +} + +/// This header replicates most of the methods in ThermionDartApi.h. +/// It represents the interface for: +/// - invoking those methods that must be called on the main Filament engine thread +/// - setting up a render loop +typedef EntityId = ffi.Int32; +typedef DartEntityId = int; typedef _ManipulatorMode = ffi.Int32; typedef Dart_ManipulatorMode = int; typedef FilamentRenderCallback @@ -1508,13 +1549,6 @@ typedef FilamentRenderCallbackFunction = ffi.Void Function( typedef DartFilamentRenderCallbackFunction = void Function( ffi.Pointer owner); -/// This header replicates most of the methods in ThermionDartApi.h. -/// It represents the interface for: -/// - invoking those methods that must be called on the main Filament engine thread -/// - setting up a render loop -typedef EntityId = ffi.Int32; -typedef DartEntityId = int; - const int __bool_true_false_are_defined = 1; const int true1 = 1; diff --git a/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart b/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart index b28b04f6..30d5e5c1 100644 --- a/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart +++ b/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart @@ -1,3 +1,23 @@ +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:vector_math/vector_math_64.dart'; + +abstract class AbstractGizmo { + bool get isActive; + + void translate(double transX, double transY); + + void reset(); + + void attach(ThermionEntity entity); + + void detach(); + + Aabb2 boundingBox = Aabb2(); + + void checkHover(double x, double y) { + if(boundingBox.containsVector2(Vector2(x, y))); + } +} diff --git a/thermion_dart/lib/thermion_dart/entities/gizmo.dart b/thermion_dart/lib/thermion_dart/entities/gizmo.dart index ccfb0019..0434fe84 100644 --- a/thermion_dart/lib/thermion_dart/entities/gizmo.dart +++ b/thermion_dart/lib/thermion_dart/entities/gizmo.dart @@ -1,16 +1,18 @@ +import 'dart:ffi'; +import 'package:ffi/ffi.dart'; +import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; import 'package:vector_math/vector_math_64.dart'; import '../thermion_viewer.dart'; class Gizmo extends AbstractGizmo { final ThermionEntity x; - Vector3 _x = Vector3(0.1, 0, 0); final ThermionEntity y; - Vector3 _y = Vector3(0.0, 0.1, 0); final ThermionEntity z; - Vector3 _z = Vector3(0.0, 0.0, 0.1); - final ThermionViewer controller; + final ThermionEntity center; + + final ThermionViewer _viewer; ThermionEntity? _activeAxis; ThermionEntity? _activeEntity; @@ -18,29 +20,41 @@ class Gizmo extends AbstractGizmo { final Set ignore; - Gizmo(this.x, this.y, this.z, this.controller, + Aabb2 boundingBox = Aabb2(); + + Gizmo(this.x, this.y, this.z, this.center, this._viewer, {this.ignore = const {}}) { - controller.pickResult.listen(_onPickResult); + _viewer.pickResult.listen(_onPickResult); } Future _reveal() async { - await controller.reveal(x, null); - await controller.reveal(y, null); - await controller.reveal(z, null); + await _viewer.reveal(x, null); + await _viewer.reveal(y, null); + await _viewer.reveal(z, null); + await _viewer.reveal(center, null); } + final _stopwatch = Stopwatch(); + + var _translation = Vector3.zero(); + void translate(double transX, double transY) async { - late Vector3 vec; - if (_activeAxis == x) { - vec = _x; - } else if (_activeAxis == y) { - vec = _y; - } else if (_activeAxis == z) { - vec = _z; + if (!_stopwatch.isRunning) { + _stopwatch.start(); + } + if (_activeAxis == x) { + _translation += Vector3(transX, 0.0, 0.0); + } else { + _translation += Vector3(0.0, transY, 0.0); + } + + if (_stopwatch.elapsedMilliseconds > 16) { + await _viewer.queuePositionUpdate( + _activeEntity!, _translation.x, _translation.y, _translation.z, + relative: true); + _stopwatch.reset(); + _translation = Vector3.zero(); } - await controller.queuePositionUpdate( - _activeEntity!, transX * vec.x, -transY * vec.y, -transX * vec.z, - relative: true); } void reset() { @@ -63,17 +77,22 @@ class Gizmo extends AbstractGizmo { _activeAxis = null; _activeEntity = entity; await _reveal(); - await controller.setParent(x, entity); - await controller.setParent(y, entity); - await controller.setParent(z, entity); + + await _viewer.setParent(x, entity); + await _viewer.setParent(y, entity); + await _viewer.setParent(z, entity); + await _viewer.setParent(center, entity); + boundingBox = await _viewer.getBoundingBox(x); } void detach() async { - await controller.setParent(x, 0); - await controller.setParent(y, 0); - await controller.setParent(z, 0); - await controller.hide(x, null); - await controller.hide(y, null); - await controller.hide(z, null); + await _viewer.setParent(x, 0); + await _viewer.setParent(y, 0); + await _viewer.setParent(z, 0); + await _viewer.setParent(center, 0); + await _viewer.hide(x, null); + await _viewer.hide(y, null); + await _viewer.hide(z, null); + await _viewer.hide(center, null); } } diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index c3569657..14597a90 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'dart:typed_data'; +import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:vector_math/vector_math_64.dart'; import 'dart:async'; @@ -55,7 +56,6 @@ class TextureDetails { } abstract class ThermionViewer { - Future get initialized; /// @@ -719,7 +719,7 @@ abstract class ThermionViewer { /// /// Sets the parent transform of [child] to [parent]. /// - Future setParent(ThermionEntity child, ThermionEntity parent); + Future setParent(ThermionEntity child, ThermionEntity parent, { bool preserveScaling }); /// /// Test all collidable entities against this entity to see if any have collided. @@ -738,7 +738,7 @@ abstract class ThermionViewer { Scene get scene; /// - /// + /// The gizmo for translating/rotating objects. Only one gizmo is present in the scene. /// AbstractGizmo? get gizmo; @@ -746,16 +746,10 @@ abstract class ThermionViewer { /// Register a callback to be invoked when this viewer is disposed. /// void onDispose(Future Function() callback); + + /// + /// Gets the 2D bounding box (in viewport coordinates) for the given entity. + /// + Future getBoundingBox(ThermionEntity entity); } -abstract class AbstractGizmo { - bool get isActive; - - void translate(double transX, double transY); - - void reset(); - - void attach(ThermionEntity entity); - - void detach(); -} diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index e22157a5..77a8776d 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -6,6 +6,7 @@ import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; import 'package:thermion_dart/thermion_dart/entities/gizmo.dart'; import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:vector_math/vector_math_64.dart'; +import 'package:vector_math/vector_math_64.dart' as v64; import 'thermion_viewer.dart'; import 'scene_impl.dart'; import 'package:logging/logging.dart'; @@ -67,9 +68,9 @@ class ThermionViewerFFI extends ThermionViewer { this._driver = driver ?? nullptr; this._sharedContext = sharedContext ?? nullptr; try { - _onPickResultCallable = - NativeCallable.listener( - _onPickResult); + _onPickResultCallable = NativeCallable< + Void Function( + EntityId entityId, Int x, Int y)>.listener(_onPickResult); } catch (err) { _logger.severe( "Failed to set pick result callback. This is expected if running on web/wasm"); @@ -127,9 +128,9 @@ class ThermionViewerFFI extends ThermionViewer { await setCameraManipulatorOptions(zoomSpeed: 1.0); - final out = allocator(3); + final out = allocator(4); get_gizmo(_sceneManager!, out); - _gizmo = Gizmo(out[0], out[1], out[2], this); + _gizmo = Gizmo(out[0], out[1], out[2], out[3], this); allocator.free(out); this._initialized.complete(true); @@ -408,7 +409,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future> getInstances(ThermionEntity entity) async { var count = await getInstanceCount(entity); - var out = allocator(count); + var out = allocator(count); get_instances(_sceneManager!, entity, out); var instances = []; for (int i = 0; i < count; i++) { @@ -1364,7 +1365,7 @@ class ThermionViewerFFI extends ThermionViewer { _scene!.registerSelected(entityId); } - late NativeCallable + late NativeCallable _onPickResultCallable; /// @@ -1553,7 +1554,7 @@ class ThermionViewerFFI extends ThermionViewer { Future> getChildEntities( ThermionEntity parent, bool renderableOnly) async { var count = get_entity_count(_sceneManager!, parent, renderableOnly); - var out = allocator(count); + var out = allocator(count); get_entities(_sceneManager!, parent, renderableOnly, out); var outList = List.generate(count, (index) => out[index]).cast(); @@ -1612,9 +1613,9 @@ class ThermionViewerFFI extends ThermionViewer { // ignore: sdk_version_since if (callback != null) { - var ptr = - NativeCallable.listener( - callback); + var ptr = NativeCallable< + Void Function( + EntityId entityId1, EntityId entityId2)>.listener(callback); add_collision_component( _sceneManager!, entity, ptr.nativeFunction, affectsTransform); _collisions[entity] = ptr; @@ -1699,11 +1700,11 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future setParent(ThermionEntity child, ThermionEntity parent) async { + Future setParent(ThermionEntity child, ThermionEntity parent, { bool preserveScaling = false}) async { if (_sceneManager == null) { throw Exception("Asset manager must be non-null"); } - set_parent(_sceneManager!, child, parent); + set_parent(_sceneManager!, child, parent, preserveScaling); } /// @@ -1736,4 +1737,11 @@ class ThermionViewerFFI extends ThermionViewer { Future setPriority(ThermionEntity entityId, int priority) async { set_priority(_sceneManager!, entityId, priority); } + + @override + Future getBoundingBox(ThermionEntity entityId) async { + final result = get_bounding_box(_sceneManager!, entityId); + return v64.Aabb2.minMax(v64.Vector2(result.minX, result.minY), + v64.Vector2(result.maxX, result.maxY)); + } } diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart index 9f09e2c0..ad4dc644 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'dart:typed_data'; +import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:vector_math/vector_math_64.dart'; @@ -608,7 +609,7 @@ class ThermionViewerStub extends ThermionViewer { } @override - Future setParent(ThermionEntity child, ThermionEntity parent) { + Future setParent(ThermionEntity child, ThermionEntity parent, { bool preserveScaling = false}) { // TODO: implement setParent throw UnimplementedError(); } @@ -757,4 +758,10 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement capture throw UnimplementedError(); } + + @override + Future getBoundingBox(ThermionEntity entity) { + // TODO: implement getBoundingBox + throw UnimplementedError(); + } } diff --git a/thermion_dart/native/include/Aabb2.h b/thermion_dart/native/include/Aabb2.h new file mode 100644 index 00000000..ba1196ec --- /dev/null +++ b/thermion_dart/native/include/Aabb2.h @@ -0,0 +1,18 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif +struct Aabb2 { + float minX; + float minY; + float maxX; + float maxY; +}; + +typedef struct Aabb2 Aabb2; + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/thermion_dart/native/include/Gizmo.hpp b/thermion_dart/native/include/Gizmo.hpp new file mode 100644 index 00000000..b138f3ec --- /dev/null +++ b/thermion_dart/native/include/Gizmo.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "material/gizmo.h" + +#include "Aabb2.h" + +using namespace filament; +using namespace utils; + + +class Gizmo { + public: + Gizmo(Engine* const engine); + void updateTransform(); + void destroy(Engine* const engine); + Entity x() { + return _entities[0]; + }; + Entity y() { + return _entities[1]; + }; + Entity z() { + return _entities[2]; + }; + Entity center() { + return _entities[3]; + }; + private: + utils::Entity _entities[4]; + Material* _material; + MaterialInstance* _materialInstances[4]; +}; \ No newline at end of file diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 4a5bdf41..70882f2c 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -6,6 +6,8 @@ #include #include +#include +#include #include #include @@ -17,11 +19,13 @@ #include "material/gizmo.h" #include "utils/NameComponentManager.h" +#include "Gizmo.hpp" #include "ResourceBuffer.hpp" #include "components/CollisionComponentManager.hpp" #include "components/AnimationComponentManager.hpp" #include "tsl/robin_map.h" +#include "Aabb2.h" namespace thermion_filament { @@ -37,7 +41,8 @@ namespace thermion_filament class SceneManager { public: - SceneManager(const ResourceLoaderWrapperImpl *const loader, + SceneManager(View* view, + const ResourceLoaderWrapperImpl *const loader, Engine *engine, Scene *scene, const char *uberArchivePath); @@ -146,7 +151,7 @@ namespace thermion_filament void addCollisionComponent(EntityId entity, void (*onCollisionCallback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform); void removeCollisionComponent(EntityId entityId); EntityId getParent(EntityId child); - void setParent(EntityId child, EntityId parent); + void setParent(EntityId child, EntityId parent, bool preserveScaling); bool addAnimationComponent(EntityId entity); void removeAnimationComponent(EntityId entity); @@ -165,11 +170,18 @@ namespace thermion_filament void setPriority(EntityId entity, int priority); /// @brief returns the gizmo entity, used to manipulate the global transform for entities - /// @param out a pointer to an array of three EntityId {x, y, z} + /// @param out a pointer sized large enough to hold three EntityId values (representing the x, y, and z axis of the translation gizmo). /// @return /// void getGizmo(EntityId *out); + + /// @brief returns the 2D min/max viewport coordinates of the bounding box for the specified enitty; + /// @param out a pointer large enough to store four floats (the min/max coordinates of the bounding box) + /// @return + /// + Aabb2 getBoundingBox(EntityId entity); + friend class FilamentViewer; private: @@ -177,6 +189,7 @@ namespace thermion_filament const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; Engine *_engine; Scene *_scene; + View* _view; gltfio::MaterialProvider *_ubershaderProvider = nullptr; gltfio::ResourceLoader *_gltfResourceLoader = nullptr; gltfio::TextureProvider *_stbDecoder = nullptr; @@ -203,9 +216,8 @@ namespace thermion_filament const char *entityName); EntityId addGizmo(); - utils::Entity _gizmo[3]; - Material* _gizmoMaterial; - MaterialInstance* _gizmoMaterialInstances[3]; + Gizmo* _gizmo = nullptr; + }; } diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 4a7c4c76..c6c1226a 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -47,6 +47,7 @@ #endif #include "ResourceBuffer.hpp" +#include "Aabb2.h" typedef int32_t EntityId; typedef int32_t _ManipulatorMode; @@ -244,10 +245,11 @@ extern "C" EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const viewer, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath); EMSCRIPTEN_KEEPALIVE EntityId get_parent(void *const sceneManager, EntityId child); - EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent); + EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling); EMSCRIPTEN_KEEPALIVE void test_collisions(void *const sceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE void set_priority(void *const sceneManager, EntityId entityId, int priority); EMSCRIPTEN_KEEPALIVE void get_gizmo(void *const sceneManager, EntityId *out); + EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity); #ifdef __cplusplus } diff --git a/thermion_dart/native/src/Gizmo.cpp b/thermion_dart/native/src/Gizmo.cpp new file mode 100644 index 00000000..9544699c --- /dev/null +++ b/thermion_dart/native/src/Gizmo.cpp @@ -0,0 +1,199 @@ +#include "Gizmo.hpp" + +#include +#include +#include +#include +#include + +#include "material/gizmo.h" +#include "Log.hpp" + +Gizmo::Gizmo(Engine* const engine) +{ + _material = + Material::Builder() + .package(GIZMO_GIZMO_DATA, GIZMO_GIZMO_SIZE) + .build(*engine); + + // Line and arrow vertices + float lineLength = 0.8f; + float lineWidth = 0.005f; + float arrowLength = 0.2f; + float arrowWidth = 0.03f; + float *vertices = new float[13 * 3]{ + // Line vertices (8 vertices) + -lineWidth, -lineWidth, 0.0f, + lineWidth, -lineWidth, 0.0f, + lineWidth, lineWidth, 0.0f, + -lineWidth, lineWidth, 0.0f, + -lineWidth, -lineWidth, lineLength, + lineWidth, -lineWidth, lineLength, + lineWidth, lineWidth, lineLength, + -lineWidth, lineWidth, lineLength, + // Arrow vertices (5 vertices) + 0.0f, 0.0f, lineLength + arrowLength, // Tip of the arrow + -arrowWidth, -arrowWidth, lineLength, // Base of the arrow + arrowWidth, -arrowWidth, lineLength, + arrowWidth, arrowWidth, lineLength, + -arrowWidth, arrowWidth, lineLength}; + + // Line and arrow indices + uint16_t *indices = new uint16_t[54]{ + // Line indices (24 indices) + 0, 1, 5, 5, 4, 0, + 1, 2, 6, 6, 5, 1, + 2, 3, 7, 7, 6, 2, + 3, 0, 4, 4, 7, 3, + // Arrow indices (30 indices) + 8, 9, 10, // Front face + 8, 10, 11, // Right face + 8, 11, 12, // Back face + 8, 12, 9, // Left face + 9, 12, 11, 11, 10, 9 // Base of the arrow + }; + + auto vb = VertexBuffer::Builder() + .vertexCount(13) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) + .build(*engine); + + vb->setBufferAt(*engine, 0, VertexBuffer::BufferDescriptor(vertices, 13 * sizeof(filament::math::float3), [](void *buffer, size_t size, void *) + { delete[] static_cast(buffer); })); + + auto ib = IndexBuffer::Builder().indexCount(54).bufferType(IndexBuffer::IndexType::USHORT).build(*engine); + ib->setBuffer(*engine, IndexBuffer::BufferDescriptor( + indices, 54 * sizeof(uint16_t), + [](void *buffer, size_t size, void *) + { delete[] static_cast(buffer); })); + + auto &entityManager = EntityManager::get(); + + // Create the three axes + for (int i = 0; i < 3; i++) + { + _entities[i] = entityManager.create(); + _materialInstances[i] = _material->createInstance(); + + math::float3 color; + math::mat4f transform; + + switch (i) + { + case 0: // X-axis (Red) + color = {1.0f, 0.0f, 0.0f}; + transform = math::mat4f::rotation(math::F_PI_2, math::float3{0, 1, 0}); + break; + case 1: // Y-axis (Green) + color = {0.0f, 1.0f, 0.0f}; + transform = math::mat4f::rotation(-math::F_PI_2, math::float3{1, 0, 0}); + break; + case 2: // Z-axis (Blue) + color = {0.0f, 0.0f, 1.0f}; + break; + } + + _materialInstances[i]->setParameter("color", color); + + RenderableManager::Builder(1) + .boundingBox({{0, 0, (lineLength + arrowLength) / 2}, {arrowWidth / 2, arrowWidth / 2, (lineLength + arrowLength) / 2}}) + .material(0, _materialInstances[i]) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, ib, 0, 54) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .build(*engine, _entities[i]); + + auto &transformManager = engine->getTransformManager(); + auto instance = transformManager.getInstance(_entities[i]); + transformManager.setTransform(instance, transform); + } + + // Create the black cube (center cube) + _entities[3] = entityManager.create(); + _materialInstances[3] = _material->createInstance(); + _materialInstances[3]->setParameter("color", math::float3{0.0f, 0.0f, 0.0f}); // Black color + + // Create center cube vertices + float centerCubeSize = 0.05f; + float *centerCubeVertices = new float[8 * 3]{ + -centerCubeSize, -centerCubeSize, -centerCubeSize, + centerCubeSize, -centerCubeSize, -centerCubeSize, + centerCubeSize, centerCubeSize, -centerCubeSize, + -centerCubeSize, centerCubeSize, -centerCubeSize, + -centerCubeSize, -centerCubeSize, centerCubeSize, + centerCubeSize, -centerCubeSize, centerCubeSize, + centerCubeSize, centerCubeSize, centerCubeSize, + -centerCubeSize, centerCubeSize, centerCubeSize}; + + // Create center cube indices + uint16_t *centerCubeIndices = new uint16_t[36]{ + 0, 1, 2, 2, 3, 0, + 1, 5, 6, 6, 2, 1, + 5, 4, 7, 7, 6, 5, + 4, 0, 3, 3, 7, 4, + 3, 2, 6, 6, 7, 3, + 4, 5, 1, 1, 0, 4}; + + auto centerCubeVb = VertexBuffer::Builder() + .vertexCount(8) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) + .build(*engine); + + centerCubeVb->setBufferAt(*engine, 0, VertexBuffer::BufferDescriptor(centerCubeVertices, 8 * sizeof(filament::math::float3), [](void *buffer, size_t size, void *) + { delete[] static_cast(buffer); })); + + auto centerCubeIb = IndexBuffer::Builder().indexCount(36).bufferType(IndexBuffer::IndexType::USHORT).build(*engine); + centerCubeIb->setBuffer(*engine, IndexBuffer::BufferDescriptor( + centerCubeIndices, 36 * sizeof(uint16_t), + [](void *buffer, size_t size, void *) + { delete[] static_cast(buffer); })); + + RenderableManager::Builder(1) + .boundingBox({{}, {centerCubeSize, centerCubeSize, centerCubeSize}}) + .material(0, _materialInstances[3]) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, centerCubeVb, centerCubeIb, 0, 36) + .culling(false) + .build(*engine, _entities[3]); + + auto &rm = engine->getRenderableManager(); + for (int i = 0; i < 4; i++) + { + rm.setPriority(rm.getInstance(_entities[i]), 7); + } + +} + +void Gizmo::destroy(Engine *const engine) { + + for (int i = 0; i < 4; i++) + { + engine->destroy(_entities[i]); + engine->destroy(_materialInstances[i]); + } + + engine->destroy(_material); +} + +void Gizmo::updateTransform() +{ + Log("Updating gizmo transform"); + // // Get screen-space position of the entity + // math::float4 entityScreenPos = _view->getViewProjectionMatrix() * entityWorldPosition; + + // // Convert to NDC space + // entityScreenPos /= entityScreenPos.w; + + // // Convert to screen space + // float screenX = (entityScreenPos.x * 0.5f + 0.5f) * viewportWidth; + // float screenY = (entityScreenPos.y * 0.5f + 0.5f) * viewportHeight; + + // // Set gizmo position + // gizmo->setPosition({screenX, screenY, 0}); + + // // Scale gizmo based on viewport size + // float scale = viewportHeight * 0.1f; // 10% of screen height, for example + // gizmo->setScale({scale, scale, 1}); +} \ No newline at end of file diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 7fe0eeea..1f4da40a 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -43,11 +44,13 @@ namespace thermion_filament using namespace filament::gltfio; using std::unique_ptr; - SceneManager::SceneManager(const ResourceLoaderWrapperImpl *const resourceLoaderWrapper, + SceneManager::SceneManager(View *view, + const ResourceLoaderWrapperImpl *const resourceLoaderWrapper, Engine *engine, Scene *scene, const char *uberArchivePath) - : _resourceLoaderWrapper(resourceLoaderWrapper), + : _view(view), + _resourceLoaderWrapper(resourceLoaderWrapper), _engine(engine), _scene(scene) { @@ -76,9 +79,9 @@ namespace thermion_filament utils::EntityManager &em = utils::EntityManager::get(); _ncm = new NameComponentManager(em); - + _assetLoader = AssetLoader::create({_engine, _ubershaderProvider, _ncm, &em}); - + _gltfResourceLoader->addTextureProvider("image/ktx2", _ktxDecoder); _gltfResourceLoader->addTextureProvider("image/png", _stbDecoder); _gltfResourceLoader->addTextureProvider("image/jpeg", _stbDecoder); @@ -87,24 +90,20 @@ namespace thermion_filament _collisionComponentManager = new CollisionComponentManager(tm); _animationComponentManager = new AnimationComponentManager(tm, _engine->getRenderableManager()); - - addGizmo(); + + _gizmo = new Gizmo(_engine); } SceneManager::~SceneManager() { - + destroyAll(); - - for(int i =0; i < 3; i++) { - _engine->destroy(_gizmo[i]); - _engine->destroy(_gizmoMaterialInstances[i]); - } - - _engine->destroy(_gizmoMaterial); + + _gizmo->destroy(_engine); + _gltfResourceLoader->asyncCancelLoad(); _ubershaderProvider->destroyMaterials(); - + delete _animationComponentManager; delete _collisionComponentManager; delete _ncm; @@ -114,7 +113,6 @@ namespace thermion_filament delete _ktxDecoder; delete _ubershaderProvider; AssetLoader::destroy(&_assetLoader); - } int SceneManager::getInstanceCount(EntityId entityId) @@ -454,7 +452,8 @@ namespace thermion_filament for (auto &asset : _assets) { auto numInstances = asset.second->getAssetInstanceCount(); - for(int i = 0; i < numInstances; i++) { + for (int i = 0; i < numInstances; i++) + { auto instance = asset.second->getAssetInstances()[i]; for (int j = 0; j < instance->getEntityCount(); j++) { @@ -499,21 +498,24 @@ namespace thermion_filament return pos->second; } - math::mat4f SceneManager::getLocalTransform(EntityId entityId) { + math::mat4f SceneManager::getLocalTransform(EntityId entityId) + { auto entity = Entity::import(entityId); - auto& tm = _engine->getTransformManager(); - auto transformInstance = tm.getInstance(entity); + auto &tm = _engine->getTransformManager(); + auto transformInstance = tm.getInstance(entity); return tm.getTransform(transformInstance); } - math::mat4f SceneManager::getWorldTransform(EntityId entityId) { + math::mat4f SceneManager::getWorldTransform(EntityId entityId) + { auto entity = Entity::import(entityId); - auto& tm = _engine->getTransformManager(); - auto transformInstance = tm.getInstance(entity); + auto &tm = _engine->getTransformManager(); + auto transformInstance = tm.getInstance(entity); return tm.getWorldTransform(transformInstance); } - EntityId SceneManager::getBone(EntityId entityId, int skinIndex, int boneIndex) { + EntityId SceneManager::getBone(EntityId entityId, int skinIndex, int boneIndex) + { auto *instance = getInstanceByEntityId(entityId); if (!instance) { @@ -533,7 +535,8 @@ namespace thermion_filament return Entity::smuggle(joint); } - math::mat4f SceneManager::getInverseBindMatrix(EntityId entityId, int skinIndex, int boneIndex) { + math::mat4f SceneManager::getInverseBindMatrix(EntityId entityId, int skinIndex, int boneIndex) + { auto *instance = getInstanceByEntityId(entityId); if (!instance) { @@ -552,7 +555,6 @@ namespace thermion_filament return inverseBindMatrix; } - bool SceneManager::setBoneTransform(EntityId entityId, int32_t skinIndex, int boneIndex, math::mat4f transform) { std::lock_guard lock(_mutex); @@ -781,7 +783,7 @@ namespace thermion_filament return true; } - void SceneManager::clearMorphAnimationBuffer( + void SceneManager::clearMorphAnimationBuffer( EntityId entityId) { std::lock_guard lock(_mutex); @@ -865,12 +867,12 @@ namespace thermion_filament TransformManager &transformManager = _engine->getTransformManager(); // - // To reset the skeleton to its rest pose, we could just call animator->resetBoneMatrices(), - // which sets all bone matrices to the identity matrix. However, any subsequent calls to animator->updateBoneMatrices() - // may result in unexpected poses, because that method uses each bone's transform to calculate + // To reset the skeleton to its rest pose, we could just call animator->resetBoneMatrices(), + // which sets all bone matrices to the identity matrix. However, any subsequent calls to animator->updateBoneMatrices() + // may result in unexpected poses, because that method uses each bone's transform to calculate // the bone matrices (and resetBoneMatrices does not affect this transform). // To "fully" reset the bone, we need to set its local transform (i.e. relative to its parent) - // to its original orientation in rest pose. + // to its original orientation in rest pose. // // This can be calculated as: // @@ -879,7 +881,7 @@ namespace thermion_filament // (where bindMatrix is the inverse of the inverseBindMatrix). // // The only requirement is that parent bone transforms are reset before child bone transforms. - // glTF/Filament does not guarantee that parent bones are listed before child bones under a FilamentInstance. + // glTF/Filament does not guarantee that parent bones are listed before child bones under a FilamentInstance. // We ensure that parents are reset before children by: // - pushing all bones onto a stack // - iterate over the stack @@ -891,16 +893,16 @@ namespace thermion_filament // - pop the bone, reset its transform and mark it as completed for (int skinIndex = 0; skinIndex < skinCount; skinIndex++) { - std::unordered_set joints; - std::unordered_set completed; + std::unordered_set joints; + std::unordered_set completed; std::stack stack; auto transforms = getBoneRestTranforms(entityId, skinIndex); - + for (int i = 0; i < instance->getJointCountAt(skinIndex); i++) { auto restTransform = transforms->at(i); - const auto& joint = instance->getJointsAt(skinIndex)[i]; + const auto &joint = instance->getJointsAt(skinIndex)[i]; auto transformInstance = transformManager.getInstance(joint); transformManager.setTransform(transformInstance, restTransform); } @@ -908,7 +910,8 @@ namespace thermion_filament instance->getAnimator()->updateBoneMatrices(); } - std::unique_ptr> SceneManager::getBoneRestTranforms(EntityId entityId, int skinIndex) { + std::unique_ptr> SceneManager::getBoneRestTranforms(EntityId entityId, int skinIndex) + { auto transforms = std::make_unique>(); @@ -933,12 +936,12 @@ namespace thermion_filament transforms->resize(instance->getJointCountAt(skinIndex)); // - // To reset the skeleton to its rest pose, we could just call animator->resetBoneMatrices(), - // which sets all bone matrices to the identity matrix. However, any subsequent calls to animator->updateBoneMatrices() - // may result in unexpected poses, because that method uses each bone's transform to calculate + // To reset the skeleton to its rest pose, we could just call animator->resetBoneMatrices(), + // which sets all bone matrices to the identity matrix. However, any subsequent calls to animator->updateBoneMatrices() + // may result in unexpected poses, because that method uses each bone's transform to calculate // the bone matrices (and resetBoneMatrices does not affect this transform). // To "fully" reset the bone, we need to set its local transform (i.e. relative to its parent) - // to its original orientation in rest pose. + // to its original orientation in rest pose. // // This can be calculated as: // @@ -947,7 +950,7 @@ namespace thermion_filament // (where bindMatrix is the inverse of the inverseBindMatrix). // // The only requirement is that parent bone transforms are reset before child bone transforms. - // glTF/Filament does not guarantee that parent bones are listed before child bones under a FilamentInstance. + // glTF/Filament does not guarantee that parent bones are listed before child bones under a FilamentInstance. // We ensure that parents are reset before children by: // - pushing all bones onto a stack // - iterate over the stack @@ -958,22 +961,23 @@ namespace thermion_filament // - otherwise // - pop the bone, reset its transform and mark it as completed std::vector joints; - std::unordered_set completed; + std::unordered_set completed; std::stack stack; - + for (int i = 0; i < instance->getJointCountAt(skinIndex); i++) { - const auto& joint = instance->getJointsAt(skinIndex)[i]; + const auto &joint = instance->getJointsAt(skinIndex)[i]; joints.push_back(joint); stack.push(joint); } - while(!stack.empty()) + while (!stack.empty()) { - const auto& joint = stack.top(); + const auto &joint = stack.top(); // if we've already handled this node previously (e.g. when we encountered it as a parent), then skip - if(completed.find(joint) != completed.end()) { + if (completed.find(joint) != completed.end()) + { stack.pop(); continue; } @@ -981,23 +985,25 @@ namespace thermion_filament const auto transformInstance = transformManager.getInstance(joint); auto parent = transformManager.getParent(transformInstance); - // we need to handle parent joints before handling their children - // therefore, if this joint has a parent that hasn't been handled yet, + // we need to handle parent joints before handling their children + // therefore, if this joint has a parent that hasn't been handled yet, // push the parent to the top of the stack and start the loop again - const auto& jointIter = std::find(joints.begin(), joints.end(), joint); + const auto &jointIter = std::find(joints.begin(), joints.end(), joint); auto parentIter = std::find(joints.begin(), joints.end(), parent); - if(parentIter != joints.end() && completed.find(parent) == completed.end()) { + if (parentIter != joints.end() && completed.find(parent) == completed.end()) + { stack.push(parent); continue; } - - // otherwise let's get the inverse bind matrix for the joint + + // otherwise let's get the inverse bind matrix for the joint math::mat4f inverseBindMatrix; bool found = false; for (int i = 0; i < instance->getJointCountAt(skinIndex); i++) { - if(instance->getJointsAt(skinIndex)[i] == joint) { + if (instance->getJointsAt(skinIndex)[i] == joint) + { inverseBindMatrix = instance->getInverseBindMatricesAt(skinIndex)[i]; found = true; break; @@ -1007,7 +1013,8 @@ namespace thermion_filament // now we need to ascend back up the hierarchy to calculate the modelSpaceTransform math::mat4f modelSpaceTransform; - while(parentIter != joints.end()) { + while (parentIter != joints.end()) + { const auto transformInstance = transformManager.getInstance(parent); const auto parentIndex = distance(joints.begin(), parentIter); const auto transform = transforms->at(parentIndex); @@ -1016,9 +1023,9 @@ namespace thermion_filament parentIter = std::find(joints.begin(), joints.end(), parent); } - const auto bindMatrix = inverse(inverseBindMatrix); - - const auto inverseModelSpaceTransform = inverse(modelSpaceTransform); + const auto bindMatrix = inverse(inverseBindMatrix); + + const auto inverseModelSpaceTransform = inverse(modelSpaceTransform); const auto jointIndex = distance(joints.begin(), jointIter); transforms->at(jointIndex) = inverseModelSpaceTransform * bindMatrix; @@ -1028,7 +1035,8 @@ namespace thermion_filament return transforms; } - bool SceneManager::updateBoneMatrices(EntityId entityId) { + bool SceneManager::updateBoneMatrices(EntityId entityId) + { auto *instance = getInstanceByEntityId(entityId); if (!instance) { @@ -1046,11 +1054,13 @@ namespace thermion_filament return true; } - bool SceneManager::setTransform(EntityId entityId, math::mat4f transform) { - auto& tm = _engine->getTransformManager(); - const auto& entity = Entity::import(entityId); + bool SceneManager::setTransform(EntityId entityId, math::mat4f transform) + { + auto &tm = _engine->getTransformManager(); + const auto &entity = Entity::import(entityId); auto transformInstance = tm.getInstance(entity); - if(!transformInstance) { + if (!transformInstance) + { return false; } tm.setTransform(transformInstance, transform); @@ -1059,11 +1069,11 @@ namespace thermion_filament bool SceneManager::addBoneAnimation(EntityId parentEntity, int skinIndex, - int boneIndex, + int boneIndex, const float *const frameData, int numFrames, float frameLengthInMs, - float fadeOutInSecs, + float fadeOutInSecs, float fadeInInSecs, float maxDelta) { @@ -1122,7 +1132,8 @@ namespace thermion_filament animation.fadeInInSecs = fadeInInSecs; animation.maxDelta = maxDelta; animation.skinIndex = skinIndex; - if(!_animationComponentManager->hasComponent(instance->getRoot())) { + if (!_animationComponentManager->hasComponent(instance->getRoot())) + { Log("ERROR: specified entity is not animatable (has no animation component attached)."); return false; } @@ -1135,7 +1146,7 @@ namespace thermion_filament return true; } - + void SceneManager::playAnimation(EntityId entityId, int index, bool loop, bool reverse, bool replaceActive, float crossfade, float startOffset) { std::lock_guard lock(_mutex); @@ -1160,7 +1171,7 @@ namespace thermion_filament } } - if (!_animationComponentManager->hasComponent(instance->getRoot())) + if (!_animationComponentManager->hasComponent(instance->getRoot())) { Log("ERROR: specified entity is not animatable (has no animation component attached)."); return; @@ -1210,13 +1221,16 @@ namespace thermion_filament bool found = false; // don't play the animation if it's already running - for(int i=0; i < animationComponent.gltfAnimations.size(); i++) { - if(animationComponent.gltfAnimations[i].index == index) { + for (int i = 0; i < animationComponent.gltfAnimations.size(); i++) + { + if (animationComponent.gltfAnimations[i].index == index) + { found = true; break; } } - if(!found) { + if (!found) + { animationComponent.gltfAnimations.push_back(animation); } } @@ -1244,9 +1258,9 @@ namespace thermion_filament auto &animationComponent = _animationComponentManager->elementAt<0>(animationComponentInstance); auto erased = std::remove_if(animationComponent.gltfAnimations.begin(), - animationComponent.gltfAnimations.end(), - [=](GltfAnimation &anim) - { return anim.index == index; }); + animationComponent.gltfAnimations.end(), + [=](GltfAnimation &anim) + { return anim.index == index; }); animationComponent.gltfAnimations.erase(erased, animationComponent.gltfAnimations.end()); } @@ -1391,7 +1405,7 @@ namespace thermion_filament unique_ptr> names = std::make_unique>(); const auto *instance = getInstanceByEntityId(assetEntityId); - + if (!instance) { auto asset = getAssetByEntityId(assetEntityId); @@ -1401,7 +1415,8 @@ namespace thermion_filament return names; } instance = asset->getInstance(); - if(!instance) { + if (!instance) + { Log("Warning - failed to find instance for specified asset. This is unexpected and probably indicates you are passing the wrong entity"); return names; } @@ -1415,7 +1430,7 @@ namespace thermion_filament for (int i = 0; i < asset->getEntityCount(); i++) { - + utils::Entity e = entities[i]; if (e == target) { @@ -1431,7 +1446,8 @@ namespace thermion_filament return names; } - unique_ptr> SceneManager::getBoneNames(EntityId assetEntityId, int skinIndex) { + unique_ptr> SceneManager::getBoneNames(EntityId assetEntityId, int skinIndex) + { unique_ptr> names = std::make_unique>(); @@ -1468,7 +1484,6 @@ namespace thermion_filament return names; } - void SceneManager::transformToUnitCube(EntityId entityId) { const auto *instance = getInstanceByEntityId(entityId); @@ -1496,7 +1511,8 @@ namespace thermion_filament tm.setTransform(tm.getInstance(instance->getRoot()), transform); } - EntityId SceneManager::getParent(EntityId childEntityId) { + EntityId SceneManager::getParent(EntityId childEntityId) + { auto &tm = _engine->getTransformManager(); const auto child = Entity::import(childEntityId); const auto &childInstance = tm.getInstance(child); @@ -1504,7 +1520,7 @@ namespace thermion_filament return Entity::smuggle(parent); } - void SceneManager::setParent(EntityId childEntityId, EntityId parentEntityId) + void SceneManager::setParent(EntityId childEntityId, EntityId parentEntityId, bool preserveScaling) { auto &tm = _engine->getTransformManager(); const auto child = Entity::import(childEntityId); @@ -1512,6 +1528,31 @@ namespace thermion_filament const auto &parentInstance = tm.getInstance(parent); const auto &childInstance = tm.getInstance(child); + + if (preserveScaling) + { + auto parentTransform = tm.getWorldTransform(parentInstance); + math::float3 parentTranslation; + math::quatf parentRotation; + math::float3 parentScale; + + decomposeMatrix(parentTransform, &parentTranslation, &parentRotation, &parentScale); + + auto childTransform = tm.getTransform(childInstance); + math::float3 childTranslation; + math::quatf childRotation; + math::float3 childScale; + + decomposeMatrix(childTransform, &childTranslation, &childRotation, &childScale); + + childScale = childScale * (1 / parentScale); + + childTransform = composeMatrix(childTranslation, childRotation, childScale); + + tm.setTransform(childInstance, childTransform); + } + + // auto scale = childInstance. tm.setParent(childInstance, parentInstance); } @@ -1587,12 +1628,16 @@ namespace thermion_filament _animationComponentManager->update(); } + + void SceneManager::updateTransforms() { std::lock_guard lock(_mutex); auto &tm = _engine->getTransformManager(); + _gizmo->updateTransform(); + for (const auto &[entityId, transformUpdate] : _transformUpdates) { const auto &pos = _instances.find(entityId); @@ -1751,25 +1796,77 @@ namespace thermion_filament tm.setTransform(transformInstance, newTransform); } - void SceneManager::queuePositionUpdate(EntityId entity, float x, float y, float z, bool relative) + void SceneManager::queuePositionUpdate(EntityId entity, float x, float y, float z, bool relative) +{ + std::lock_guard lock(_mutex); + + const auto &pos = _transformUpdates.find(entity); + if (pos == _transformUpdates.end()) { - std::lock_guard lock(_mutex); - - const auto &pos = _transformUpdates.find(entity); - if (pos == _transformUpdates.end()) - { - _transformUpdates.emplace(entity, std::make_tuple(math::float3(), true, math::quatf(1.0f), true, 1.0f)); - } - auto curr = _transformUpdates[entity]; - auto &trans = std::get<0>(curr); - trans.x = x; - trans.y = y; - trans.z = z; - - auto &isRelative = std::get<1>(curr); - isRelative = relative; - _transformUpdates[entity] = curr; + _transformUpdates.emplace(entity, std::make_tuple(math::float3(), true, math::quatf(1.0f), true, 1.0f)); } + auto curr = _transformUpdates[entity]; + auto &trans = std::get<0>(curr); + + const auto &tm = _engine->getTransformManager(); + auto transformInstance = tm.getInstance(Entity::import(entity)); + auto transform = tm.getTransform(transformInstance); + math::double4 position { 0.0f, 0.0f, 0.0f, 1.0f}; + math::mat4 worldTransform = tm.getWorldTransformAccurate(transformInstance); + position = worldTransform * position; + + // Get camera's view matrix and its inverse + const Camera &camera = _view->getCamera(); + + math::mat4 viewMatrix = camera.getViewMatrix(); + math::mat4 invViewMatrix = inverse(viewMatrix); + + // Transform object position to view space + math::double4 viewSpacePos = viewMatrix * position; + + Log("viewSpacePos %f %f %f %f", viewSpacePos.x, viewSpacePos.y, viewSpacePos.z, viewSpacePos.w); + + // Calculate plane distance from camera + float planeDistance = -viewSpacePos.z; + + const auto &vp = _view->getViewport(); + + // Calculate viewport to world scale at the object's distance + float viewportToWorldScale = planeDistance * std::tan(camera.getFieldOfViewInDegrees(Camera::Fov::VERTICAL) * 0.5f * M_PI / 180.0f) * 2.0f / vp.height; + + Log("viewportToWorldScale %f", viewportToWorldScale); + + // Calculate view space delta + math::float4 viewSpaceDelta( + x * viewportToWorldScale, + -y * viewportToWorldScale, // Invert y-axis + z * viewportToWorldScale, + 0.0f); // Use 0 for the w component as it's a direction, not a position + + Log("viewSpaceDelta %f %f %f", viewSpaceDelta.x, viewSpaceDelta.y, viewSpaceDelta.z); + + // Transform delta to world space + math::float4 worldDelta = invViewMatrix * viewSpaceDelta; + + Log("worldDelta %f %f %f", worldDelta.x, worldDelta.y, worldDelta.z); + + if (relative) + { + trans.x += worldDelta.x; + trans.y += worldDelta.y; + trans.z += worldDelta.z; + } + else + { + trans.x = worldDelta.x; + trans.y = worldDelta.y; + trans.z = worldDelta.z; + } + + auto &isRelative = std::get<1>(curr); + isRelative = relative; + _transformUpdates[entity] = curr; +} void SceneManager::queueRotationUpdate(EntityId entity, float rads, float x, float y, float z, float w, bool relative) { @@ -2011,131 +2108,86 @@ namespace thermion_filament Log("Set instance renderable priority to %d", priority); } - EntityId SceneManager::addGizmo() + Aabb2 SceneManager::getBoundingBox(EntityId entityId) { - _gizmoMaterial = - Material::Builder() - .package(GIZMO_GIZMO_DATA, GIZMO_GIZMO_SIZE) - .build(*_engine); + const auto &camera = _view->getCamera(); + const auto &viewport = _view->getViewport(); - auto vertexCount = 9; + auto &tcm = _engine->getTransformManager(); + auto &rcm = _engine->getRenderableManager(); - float *vertices = new float[vertexCount * 3]{ - -0.05, 0.0f, 0.05f, - 0.05f, 0.0f, 0.05f, - 0.05f, 0.0f, -0.05f, - -0.05f, 0.0f, -0.05f, - -0.05f, 1.0f, 0.05f, - 0.05f, 1.0f, 0.05f, - 0.05f, 1.0f, -0.05f, - -0.05f, 1.0f, -0.05f, - 0.00f, 1.1f, 0.0f}; + // Get the projection and view matrices + math::mat4 projMatrix = camera.getProjectionMatrix(); + math::mat4 viewMatrix = camera.getViewMatrix(); + math::mat4 vpMatrix = projMatrix * viewMatrix; - VertexBuffer::BufferDescriptor::Callback vertexCallback = [](void *buf, size_t, - void *data) + auto entity = Entity::import(entityId); + + auto renderable = rcm.getInstance(entity); + auto worldTransform = tcm.getWorldTransform(tcm.getInstance(entity)); + + // Get the axis-aligned bounding box in model space + Box aabb = rcm.getAxisAlignedBoundingBox(renderable); + + auto min = aabb.getMin(); + auto max = aabb.getMax(); + + Log("min %f %f %f max %f %f %f", min.x, min.y, min.z, max.x, max.y, max.z); + + // Transform the 8 corners of the AABB to clip space + std::array corners = { + worldTransform * math::float4(min.x, min.y, min.z, 1.0f), + worldTransform * math::float4(max.x, min.y, min.z, 1.0f), + worldTransform * math::float4(min.x, max.y, min.z, 1.0f), + worldTransform * math::float4(max.x, max.y, min.z, 1.0f), + worldTransform * math::float4(min.x, min.y, max.z, 1.0f), + worldTransform * math::float4(max.x, min.y, max.z, 1.0f), + worldTransform * math::float4(min.x, max.y, max.z, 1.0f), + worldTransform * math::float4(max.x, max.y, max.z, 1.0f)}; + + // Project corners to clip space and convert to viewport space + float minX = std::numeric_limits::max(); + float minY = std::numeric_limits::max(); + float maxX = std::numeric_limits::lowest(); + float maxY = std::numeric_limits::lowest(); + + for (const auto &corner : corners) { - free((void *)buf); - }; - auto indexCount = 42; - uint16_t *indices = new uint16_t[indexCount]{ - // bottom quad - 0, 1, 2, - 0, 2, 3, - // top "cone" - 4, 5, 8, - 5, 6, 8, - 4, 7, 8, - 6, 7, 8, - // front - 0, 1, 4, - 1, 5, 4, - // right - 1, 2, 5, - 2, 6, 5, - // back - 2, 6, 7, - 7, 3, 2, - // left - 0, 4, 7, - 7, 3, 0 + math::float4 clipSpace = vpMatrix * corner; - }; + // Check if the point is behind the camera + if (clipSpace.w <= 0) + { + continue; // Skip this point + } - IndexBuffer::BufferDescriptor::Callback indexCallback = [](void *buf, size_t, - void *data) - { - free((void *)buf); - }; + // Perform perspective division + math::float3 ndcSpace = clipSpace.xyz / clipSpace.w; - auto vb = VertexBuffer::Builder() - .vertexCount(vertexCount) - .bufferCount(1) - .attribute( - VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) - .build(*_engine); + // Clamp NDC coordinates to [-1, 1] range + ndcSpace.x = std::max(-1.0f, std::min(1.0f, ndcSpace.x)); + ndcSpace.y = std::max(-1.0f, std::min(1.0f, ndcSpace.y)); - vb->setBufferAt( - *_engine, - 0, - VertexBuffer::BufferDescriptor(vertices, vb->getVertexCount() * sizeof(filament::math::float3), 0, vertexCallback)); + // Convert NDC to viewport space + float viewportX = (ndcSpace.x * 0.5f + 0.5f) * viewport.width; + float viewportY = (1.0f - (ndcSpace.y * 0.5f + 0.5f)) * viewport.height; // Flip Y-axis - auto ib = IndexBuffer::Builder().indexCount(indexCount).bufferType(IndexBuffer::IndexType::USHORT).build(*_engine); - ib->setBuffer(*_engine, IndexBuffer::BufferDescriptor(indices, ib->getIndexCount() * sizeof(uint16_t), 0, indexCallback)); + minX = std::min(minX, viewportX); + minY = std::min(minY, viewportY); + maxX = std::max(maxX, viewportX); + maxY = std::max(maxY, viewportY); + } - auto &entityManager = EntityManager::get(); - - _gizmo[1] = entityManager.create(); - _gizmoMaterialInstances[1] = _gizmoMaterial->createInstance(); - _gizmoMaterialInstances[1]->setParameter("color", math::float3{1.0f, 0.0f, 0.0f}); - RenderableManager::Builder(1) - .boundingBox({{}, {1.0f, 1.0f, 1.0f}}) - .material(0, _gizmoMaterialInstances[1]) - .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, - ib, 0, indexCount) - .culling(false) - .build(*_engine, _gizmo[1]); - - _gizmo[0] = entityManager.create(); - _gizmoMaterialInstances[0] = _gizmoMaterial->createInstance(); - _gizmoMaterialInstances[0]->setParameter("color", math::float3{0.0f, 1.0f, 0.0f}); - auto xTransform = math::mat4f::translation(math::float3{0.0f, 0.05f, -0.05f}) * math::mat4f::rotation(-math::F_PI_2, math::float3{0, 0, 1}); - auto *instanceBufferX = InstanceBuffer::Builder(1).localTransforms(&xTransform).build(*_engine); - RenderableManager::Builder(1) - .boundingBox({{}, {1.0f, 1.0f, 1.0f}}) - .instances(1, instanceBufferX) - .material(0, _gizmoMaterialInstances[0]) - .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, - ib, 0, indexCount) - .culling(false) - .build(*_engine, _gizmo[0]); - - _gizmo[2] = entityManager.create(); - _gizmoMaterialInstances[2] = _gizmoMaterial->createInstance(); - _gizmoMaterialInstances[2]->setParameter("color", math::float3{0.0f, 0.0f, 1.0f}); - auto zTransform = math::mat4f::translation(math::float3{0.0f, 0.05f, -0.05f}) * math::mat4f::rotation(3 * math::F_PI_2, math::float3{1, 0, 0}); - auto *instanceBufferZ = InstanceBuffer::Builder(1).localTransforms(&zTransform).build(*_engine); - RenderableManager::Builder(1) - .boundingBox({{}, {1.0f, 1.0f, 1.0f}}) - .instances(1, instanceBufferZ) - .material(0, _gizmoMaterialInstances[2]) - .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, - ib, 0, indexCount) - .culling(false) - .build(*_engine, _gizmo[2]); - - auto &rm = _engine->getRenderableManager(); - rm.setPriority(rm.getInstance(_gizmo[0]), 7); - rm.setPriority(rm.getInstance(_gizmo[1]), 7); - rm.setPriority(rm.getInstance(_gizmo[2]), 7); - return Entity::smuggle(_gizmo[0]); + return Aabb2{minX, minY, maxX, maxY}; } void SceneManager::getGizmo(EntityId *out) { - out[0] = Entity::smuggle(_gizmo[0]); - out[1] = Entity::smuggle(_gizmo[1]); - out[2] = Entity::smuggle(_gizmo[2]); + out[0] = Entity::smuggle(_gizmo->x()); + out[1] = Entity::smuggle(_gizmo->y()); + out[2] = Entity::smuggle(_gizmo->z()); + out[3] = Entity::smuggle(_gizmo->center()); } } // namespace thermion_filament diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index b72d0c25..4b6a4811 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -822,9 +822,9 @@ extern "C" return ((SceneManager *)sceneManager)->getParent(child); } - EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent) + EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling) { - ((SceneManager *)sceneManager)->setParent(child, parent); + ((SceneManager *)sceneManager)->setParent(child, parent, preserveScaling); } EMSCRIPTEN_KEEPALIVE void test_collisions(void *const sceneManager, EntityId entity) @@ -841,4 +841,10 @@ extern "C" { return ((SceneManager *)sceneManager)->getGizmo(out); } + + EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity) { + return ((SceneManager *)sceneManager)->getBoundingBox(entity); + } + + } diff --git a/thermion_dart/native/web/CMakeLists.txt b/thermion_dart/native/web/CMakeLists.txt index af98c836..1fe65068 100644 --- a/thermion_dart/native/web/CMakeLists.txt +++ b/thermion_dart/native/web/CMakeLists.txt @@ -55,6 +55,7 @@ add_executable(${MODULE_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/../src/FilamentViewer.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/ThermionDartApi.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/ThermionDartFFIApi.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../src/Gizmo.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/StreamBufferAdapter.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/TimeIt.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/camutils/Manipulator.cpp" From 8f20a8a8590906a73e838787753ae24bc267c028 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 15:21:36 +0800 Subject: [PATCH 004/232] chore: don't use shader to overlay gizmo --- materials/gizmo.mat | 4 +- thermion_dart/native/src/Gizmo.cpp | 259 ++++++++++++++++++----------- 2 files changed, 165 insertions(+), 98 deletions(-) diff --git a/materials/gizmo.mat b/materials/gizmo.mat index 5b7bc75b..7ee85818 100644 --- a/materials/gizmo.mat +++ b/materials/gizmo.mat @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3158461d081f058dcb9582ce19cc2daedc73abbe758ba5094c94df89028d8c4d -size 981 +oid sha256:1ce59256956f5dbb76f6ac3c51e4811f71483427db689afae5f0fd982a53b90f +size 647 diff --git a/thermion_dart/native/src/Gizmo.cpp b/thermion_dart/native/src/Gizmo.cpp index 9544699c..0bdc12f6 100644 --- a/thermion_dart/native/src/Gizmo.cpp +++ b/thermion_dart/native/src/Gizmo.cpp @@ -5,22 +5,86 @@ #include #include #include +#include #include "material/gizmo.h" #include "Log.hpp" -Gizmo::Gizmo(Engine* const engine) +namespace thermion_filament { + +using namespace filament::gltfio; + +Gizmo::Gizmo(Engine &engine) : _engine(engine) { + auto &entityManager = EntityManager::get(); + + auto &transformManager = engine.getTransformManager(); + _material = Material::Builder() .package(GIZMO_GIZMO_DATA, GIZMO_GIZMO_SIZE) - .build(*engine); + .build(engine); + + // First, create the black cube at the center + // The axes widgets will be parented to this entity + _entities[3] = entityManager.create(); + _materialInstances[3] = _material->createInstance(); + _materialInstances[3]->setParameter("color", math::float3{0.0f, 0.0f, 0.0f}); // Black color + + // Create center cube vertices + float centerCubeSize = 0.05f; + float *centerCubeVertices = new float[8 * 3]{ + -centerCubeSize, -centerCubeSize, -centerCubeSize, + centerCubeSize, -centerCubeSize, -centerCubeSize, + centerCubeSize, centerCubeSize, -centerCubeSize, + -centerCubeSize, centerCubeSize, -centerCubeSize, + -centerCubeSize, -centerCubeSize, centerCubeSize, + centerCubeSize, -centerCubeSize, centerCubeSize, + centerCubeSize, centerCubeSize, centerCubeSize, + -centerCubeSize, centerCubeSize, centerCubeSize}; + + // Create center cube indices + uint16_t *centerCubeIndices = new uint16_t[36]{ + 0, 1, 2, 2, 3, 0, + 1, 5, 6, 6, 2, 1, + 5, 4, 7, 7, 6, 5, + 4, 0, 3, 3, 7, 4, + 3, 2, 6, 6, 7, 3, + 4, 5, 1, 1, 0, 4}; + + auto centerCubeVb = VertexBuffer::Builder() + .vertexCount(8) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) + .build(engine); + + centerCubeVb->setBufferAt(engine, 0, VertexBuffer::BufferDescriptor(centerCubeVertices, 8 * sizeof(filament::math::float3), [](void *buffer, size_t size, void *) + { delete[] static_cast(buffer); })); + + auto centerCubeIb = IndexBuffer::Builder().indexCount(36).bufferType(IndexBuffer::IndexType::USHORT).build(engine); + centerCubeIb->setBuffer(engine, IndexBuffer::BufferDescriptor( + centerCubeIndices, 36 * sizeof(uint16_t), + [](void *buffer, size_t size, void *) + { delete[] static_cast(buffer); })); + + RenderableManager::Builder(1) + .boundingBox({{}, {centerCubeSize, centerCubeSize, centerCubeSize}}) + .material(0, _materialInstances[3]) + .layerMask(0xFF, 2) + .priority(0) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, centerCubeVb, centerCubeIb, 0, 36) + .culling(false) + .build(engine, _entities[3]); + + auto cubeTransformInstance = transformManager.getInstance(_entities[3]); + math::mat4f cubeTransform; + transformManager.setTransform(cubeTransformInstance, cubeTransform); // Line and arrow vertices float lineLength = 0.8f; - float lineWidth = 0.005f; + float lineWidth = 0.01f; float arrowLength = 0.2f; - float arrowWidth = 0.03f; + float arrowWidth = 0.06f; float *vertices = new float[13 * 3]{ // Line vertices (8 vertices) -lineWidth, -lineWidth, 0.0f, @@ -57,18 +121,16 @@ Gizmo::Gizmo(Engine* const engine) .vertexCount(13) .bufferCount(1) .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) - .build(*engine); + .build(engine); - vb->setBufferAt(*engine, 0, VertexBuffer::BufferDescriptor(vertices, 13 * sizeof(filament::math::float3), [](void *buffer, size_t size, void *) - { delete[] static_cast(buffer); })); + vb->setBufferAt(engine, 0, VertexBuffer::BufferDescriptor(vertices, 13 * sizeof(filament::math::float3), [](void *buffer, size_t size, void *) + { delete[] static_cast(buffer); })); - auto ib = IndexBuffer::Builder().indexCount(54).bufferType(IndexBuffer::IndexType::USHORT).build(*engine); - ib->setBuffer(*engine, IndexBuffer::BufferDescriptor( - indices, 54 * sizeof(uint16_t), - [](void *buffer, size_t size, void *) - { delete[] static_cast(buffer); })); - - auto &entityManager = EntityManager::get(); + auto ib = IndexBuffer::Builder().indexCount(54).bufferType(IndexBuffer::IndexType::USHORT).build(engine); + ib->setBuffer(engine, IndexBuffer::BufferDescriptor( + indices, 54 * sizeof(uint16_t), + [](void *buffer, size_t size, void *) + { delete[] static_cast(buffer); })); // Create the three axes for (int i = 0; i < 3; i++) @@ -100,100 +162,105 @@ Gizmo::Gizmo(Engine* const engine) .boundingBox({{0, 0, (lineLength + arrowLength) / 2}, {arrowWidth / 2, arrowWidth / 2, (lineLength + arrowLength) / 2}}) .material(0, _materialInstances[i]) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, ib, 0, 54) + .priority(0) + .layerMask(0xFF, 2) .culling(false) .receiveShadows(false) .castShadows(false) - .build(*engine, _entities[i]); + .build(engine, _entities[i]); + - auto &transformManager = engine->getTransformManager(); auto instance = transformManager.getInstance(_entities[i]); transformManager.setTransform(instance, transform); + + // parent the axis to the center cube + transformManager.setParent(instance, cubeTransformInstance); } - - // Create the black cube (center cube) - _entities[3] = entityManager.create(); - _materialInstances[3] = _material->createInstance(); - _materialInstances[3]->setParameter("color", math::float3{0.0f, 0.0f, 0.0f}); // Black color - - // Create center cube vertices - float centerCubeSize = 0.05f; - float *centerCubeVertices = new float[8 * 3]{ - -centerCubeSize, -centerCubeSize, -centerCubeSize, - centerCubeSize, -centerCubeSize, -centerCubeSize, - centerCubeSize, centerCubeSize, -centerCubeSize, - -centerCubeSize, centerCubeSize, -centerCubeSize, - -centerCubeSize, -centerCubeSize, centerCubeSize, - centerCubeSize, -centerCubeSize, centerCubeSize, - centerCubeSize, centerCubeSize, centerCubeSize, - -centerCubeSize, centerCubeSize, centerCubeSize}; - - // Create center cube indices - uint16_t *centerCubeIndices = new uint16_t[36]{ - 0, 1, 2, 2, 3, 0, - 1, 5, 6, 6, 2, 1, - 5, 4, 7, 7, 6, 5, - 4, 0, 3, 3, 7, 4, - 3, 2, 6, 6, 7, 3, - 4, 5, 1, 1, 0, 4}; - - auto centerCubeVb = VertexBuffer::Builder() - .vertexCount(8) - .bufferCount(1) - .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) - .build(*engine); - - centerCubeVb->setBufferAt(*engine, 0, VertexBuffer::BufferDescriptor(centerCubeVertices, 8 * sizeof(filament::math::float3), [](void *buffer, size_t size, void *) - { delete[] static_cast(buffer); })); - - auto centerCubeIb = IndexBuffer::Builder().indexCount(36).bufferType(IndexBuffer::IndexType::USHORT).build(*engine); - centerCubeIb->setBuffer(*engine, IndexBuffer::BufferDescriptor( - centerCubeIndices, 36 * sizeof(uint16_t), - [](void *buffer, size_t size, void *) - { delete[] static_cast(buffer); })); - - RenderableManager::Builder(1) - .boundingBox({{}, {centerCubeSize, centerCubeSize, centerCubeSize}}) - .material(0, _materialInstances[3]) - .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, centerCubeVb, centerCubeIb, 0, 36) - .culling(false) - .build(*engine, _entities[3]); - - auto &rm = engine->getRenderableManager(); - for (int i = 0; i < 4; i++) - { - rm.setPriority(rm.getInstance(_entities[i]), 7); - } - } -void Gizmo::destroy(Engine *const engine) { - - for (int i = 0; i < 4; i++) - { - engine->destroy(_entities[i]); - engine->destroy(_materialInstances[i]); - } - - engine->destroy(_material); -} - -void Gizmo::updateTransform() +void Gizmo::destroy() { - Log("Updating gizmo transform"); - // // Get screen-space position of the entity - // math::float4 entityScreenPos = _view->getViewProjectionMatrix() * entityWorldPosition; + auto& rm = _engine.getRenderableManager(); + auto& tm = _engine.getTransformManager(); + + for (int i = 0; i < 4; i++) + { + rm.destroy(_entities[i]); + tm.destroy(_entities[i]); + _engine.destroy(_entities[i]); + _engine.destroy(_materialInstances[i]); + } - // // Convert to NDC space - // entityScreenPos /= entityScreenPos.w; + _engine.destroy(_material); +} - // // Convert to screen space - // float screenX = (entityScreenPos.x * 0.5f + 0.5f) * viewportWidth; - // float screenY = (entityScreenPos.y * 0.5f + 0.5f) * viewportHeight; - // // Set gizmo position - // gizmo->setPosition({screenX, screenY, 0}); +void Gizmo::updateTransform(Camera& camera, const Viewport &vp) +{ + auto & transformManager = _engine.getTransformManager(); + auto transformInstance = transformManager.getInstance(_entities[3]); - // // Scale gizmo based on viewport size - // float scale = viewportHeight * 0.1f; // 10% of screen height, for example - // gizmo->setScale({scale, scale, 1}); + if(!transformInstance.isValid()) { + Log("No valid gizmo transform"); + return; + } + + auto worldTransform = transformManager.getWorldTransform(transformInstance); + math::float4 worldPosition { 0.0f, 0.0f, 0.0f, 1.0f }; + worldPosition = worldTransform * worldPosition; + + // Calculate distance + float distance = length(worldPosition.xyz - camera.getPosition()); + + const float desiredScreenSize = 3.0f; // Desired height in pixels + const float baseSize = 0.1f; // Base size in world units + + // Get the vertical field of view of the camera (assuming it's in radians) + float fovY = camera.getFieldOfViewInDegrees(filament::Camera::Fov::VERTICAL); + + // Calculate the scale needed to maintain the desired screen size + float newScale = (2.0f * distance * tan(fovY * 0.5f) * desiredScreenSize) / (baseSize * vp.height); + + if(std::isnan(newScale)) { + newScale = 1.0f; + } + + // Log("Distance %f, newscale %f", distance, newScale); + + auto localTransform = transformManager.getTransform(transformInstance); + + // Apply scale to gizmo + math::float3 translation; + math::quatf rotation; + math::float3 scale; + + decomposeMatrix(localTransform, &translation, &rotation, &scale); + + scale = math::float3 { newScale, newScale, newScale }; + + auto scaledTransform = composeMatrix(translation, rotation, scale); + + transformManager.setTransform(transformInstance, scaledTransform); + + // The following code for logging screen position remains unchanged + auto viewSpacePos = camera.getViewMatrix() * worldPosition; + math::float4 entityScreenPos = camera.getProjectionMatrix() * viewSpacePos; + entityScreenPos /= entityScreenPos.w; + float screenX = (entityScreenPos.x * 0.5f + 0.5f) * vp.width; + float screenY = (entityScreenPos.y * 0.5f + 0.5f) * vp.height; + // Log("gizmo %f %f", screenX, screenY); +} + + + // Log("scaledTransform %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", + // scaledTransform[0][0], scaledTransform[0][1], scaledTransform[0][2], scaledTransform[0][3], + // scaledTransform[1][0], scaledTransform[1][1], scaledTransform[1][2], scaledTransform[1][3], + // scaledTransform[2][0], scaledTransform[2][1], scaledTransform[2][2], scaledTransform[2][3], + // scaledTransform[3][0], scaledTransform[3][1], scaledTransform[3][2], scaledTransform[3][3]); + + // Log("localTransform %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", + // localTransform[0][0], localTransform[0][1], localTransform[0][2], localTransform[0][3], + // localTransform[1][0], localTransform[1][1], localTransform[1][2], localTransform[1][3], + // localTransform[2][0], localTransform[2][1], localTransform[2][2], localTransform[2][3], + // localTransform[3][0], localTransform[3][1], localTransform[3][2], localTransform[3][3]); } \ No newline at end of file From 731c4981c9039f353b8955fb9c8cb7533b5b0c05 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 15:58:49 +0800 Subject: [PATCH 005/232] use inactive/active color gizmo --- materials/gizmo.mat | 4 +- thermion_dart/native/include/Gizmo.hpp | 31 +++++++++++++--- thermion_dart/native/src/Gizmo.cpp | 51 +++++++++++++++++++++----- 3 files changed, 69 insertions(+), 17 deletions(-) diff --git a/materials/gizmo.mat b/materials/gizmo.mat index 7ee85818..5b7bc75b 100644 --- a/materials/gizmo.mat +++ b/materials/gizmo.mat @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1ce59256956f5dbb76f6ac3c51e4811f71483427db689afae5f0fd982a53b90f -size 647 +oid sha256:3158461d081f058dcb9582ce19cc2daedc73abbe758ba5094c94df89028d8c4d +size 981 diff --git a/thermion_dart/native/include/Gizmo.hpp b/thermion_dart/native/include/Gizmo.hpp index b138f3ec..4ca793e9 100644 --- a/thermion_dart/native/include/Gizmo.hpp +++ b/thermion_dart/native/include/Gizmo.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -20,15 +21,19 @@ #include "Aabb2.h" +namespace thermion_filament { + using namespace filament; using namespace utils; - class Gizmo { + + enum Axis { X, Y, Z}; + public: - Gizmo(Engine* const engine); - void updateTransform(); - void destroy(Engine* const engine); + Gizmo(Engine& engine); + void updateTransform(Camera& camera, const Viewport& vp); + void destroy(); Entity x() { return _entities[0]; }; @@ -41,8 +46,24 @@ class Gizmo { Entity center() { return _entities[3]; }; + + void highlight(Entity entity); + void unhighlight(); private: + Engine &_engine; utils::Entity _entities[4]; Material* _material; MaterialInstance* _materialInstances[4]; -}; \ No newline at end of file + math::float3 inactiveColors[3] { + math::float3 { 0.75f, 0.0f, 0.0f }, + math::float3 { 0.0f, 0.75f, 0.0f }, + math::float3 { 0.0f, 0.0f, 0.75f }, + }; + math::float3 activeColors[3] { + math::float3 { 1.0f, 0.0f, 0.0f }, + math::float3 { 0.0f, 1.0f, 0.0f }, + math::float3 { 0.0f, 0.0f, 1.0f }, + }; +}; + +} \ No newline at end of file diff --git a/thermion_dart/native/src/Gizmo.cpp b/thermion_dart/native/src/Gizmo.cpp index 0bdc12f6..39bd255e 100644 --- a/thermion_dart/native/src/Gizmo.cpp +++ b/thermion_dart/native/src/Gizmo.cpp @@ -68,7 +68,8 @@ Gizmo::Gizmo(Engine &engine) : _engine(engine) { delete[] static_cast(buffer); })); RenderableManager::Builder(1) - .boundingBox({{}, {centerCubeSize, centerCubeSize, centerCubeSize}}) + .boundingBox({{-centerCubeSize, -centerCubeSize, -centerCubeSize}, + {centerCubeSize, centerCubeSize, centerCubeSize}}) .material(0, _materialInstances[3]) .layerMask(0xFF, 2) .priority(0) @@ -138,28 +139,27 @@ Gizmo::Gizmo(Engine &engine) : _engine(engine) _entities[i] = entityManager.create(); _materialInstances[i] = _material->createInstance(); - math::float3 color; + auto baseColor = inactiveColors[i]; + math::mat4f transform; switch (i) { - case 0: // X-axis (Red) - color = {1.0f, 0.0f, 0.0f}; + case Axis::X: transform = math::mat4f::rotation(math::F_PI_2, math::float3{0, 1, 0}); break; - case 1: // Y-axis (Green) - color = {0.0f, 1.0f, 0.0f}; + case 1: transform = math::mat4f::rotation(-math::F_PI_2, math::float3{1, 0, 0}); break; - case 2: // Z-axis (Blue) - color = {0.0f, 0.0f, 1.0f}; + case 2: break; } - _materialInstances[i]->setParameter("color", color); + _materialInstances[i]->setParameter("color", baseColor); RenderableManager::Builder(1) - .boundingBox({{0, 0, (lineLength + arrowLength) / 2}, {arrowWidth / 2, arrowWidth / 2, (lineLength + arrowLength) / 2}}) + .boundingBox({{-arrowWidth, -arrowWidth, 0}, + {arrowWidth, arrowWidth, lineLength + arrowLength}}) .material(0, _materialInstances[i]) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, ib, 0, 54) .priority(0) @@ -178,6 +178,37 @@ Gizmo::Gizmo(Engine &engine) : _engine(engine) } } +void Gizmo::highlight(Entity entity) { + auto &rm = _engine.getRenderableManager(); + auto renderableInstance = rm.getInstance(entity); + auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, 0); + + math::float3 baseColor; + if(entity == x()) { + baseColor = activeColors[Axis::X]; + } else if(entity == y()) { + baseColor = activeColors[Axis::Y]; + } else if(entity == z()) { + baseColor = activeColors[Axis::Z]; + } else { + baseColor = math::float3 { 1.0f, 1.0f, 1.0f }; + } + + materialInstance->setParameter("color", baseColor); +} + +void Gizmo::unhighlight() { + auto &rm = _engine.getRenderableManager(); + + for(int i = 0; i < 3; i++) { + auto renderableInstance = rm.getInstance(_entities[i]); + auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, 0); + + math::float3 baseColor = inactiveColors[i]; + materialInstance->setParameter("color", baseColor); + } +} + void Gizmo::destroy() { auto& rm = _engine.getRenderableManager(); From 5a3517f953b2ae0272a56d13019e63ba28a37ab0 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 15:59:04 +0800 Subject: [PATCH 006/232] add grid overlay --- thermion_dart/native/include/GridOverlay.hpp | 53 ++++++ thermion_dart/native/src/GridOverlay.cpp | 189 +++++++++++++++++++ 2 files changed, 242 insertions(+) create mode 100644 thermion_dart/native/include/GridOverlay.hpp create mode 100644 thermion_dart/native/src/GridOverlay.cpp diff --git a/thermion_dart/native/include/GridOverlay.hpp b/thermion_dart/native/include/GridOverlay.hpp new file mode 100644 index 00000000..faf1ef6b --- /dev/null +++ b/thermion_dart/native/include/GridOverlay.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "material/gizmo.h" + +#include "Aabb2.h" + +namespace thermion_filament { + +using namespace filament; +using namespace utils; + +class GridOverlay { + public: + GridOverlay(Engine& engine); + void destroy(); + + utils::Entity sphere() { + return _sphereEntity; + } + + utils::Entity grid() { + return _gridEntity; + } + + private: + Engine &_engine; + utils::Entity _gridEntity; + utils::Entity _sphereEntity; + Material* _material; + MaterialInstance* _materialInstance; + MaterialInstance* _sphereMaterialInstance; +}; + +} \ No newline at end of file diff --git a/thermion_dart/native/src/GridOverlay.cpp b/thermion_dart/native/src/GridOverlay.cpp new file mode 100644 index 00000000..fa804f47 --- /dev/null +++ b/thermion_dart/native/src/GridOverlay.cpp @@ -0,0 +1,189 @@ +#include "GridOverlay.hpp" + +#include +#include +#include +#include +#include +#include + +#include "material/gizmo.h" +#include "Log.hpp" + +namespace thermion_filament { + +using namespace filament::gltfio; + +GridOverlay::GridOverlay(Engine &engine) : _engine(engine) +{ + auto &entityManager = EntityManager::get(); + auto &transformManager = engine.getTransformManager(); + + const int gridSize = 100; + const float gridSpacing = 1.0f; + int vertexCount = (gridSize + 1) * 4; // 2 axes, 2 vertices per line + + float* gridVertices = new float[vertexCount * 3]; + int index = 0; + + // Create grid lines + for (int i = 0; i <= gridSize; ++i) { + float pos = i * gridSpacing - (gridSize * gridSpacing / 2); + + // X-axis lines + gridVertices[index++] = pos; + gridVertices[index++] = 0; + gridVertices[index++] = -(gridSize * gridSpacing / 2); + + gridVertices[index++] = pos; + gridVertices[index++] = 0; + gridVertices[index++] = (gridSize * gridSpacing / 2); + + // Z-axis lines + gridVertices[index++] = -(gridSize * gridSpacing / 2); + gridVertices[index++] = 0; + gridVertices[index++] = pos; + + gridVertices[index++] = (gridSize * gridSpacing / 2); + gridVertices[index++] = 0; + gridVertices[index++] = pos; + } + + auto vb = VertexBuffer::Builder() + .vertexCount(vertexCount) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) + .build(engine); + + vb->setBufferAt(engine, 0, VertexBuffer::BufferDescriptor( + gridVertices, vertexCount * sizeof(filament::math::float3), + [](void* buffer, size_t size, void*) { delete[] static_cast(buffer); } + )); + + uint32_t* gridIndices = new uint32_t[vertexCount]; + for (uint32_t i = 0; i < vertexCount; ++i) { + gridIndices[i] = i; + } + + auto ib = IndexBuffer::Builder() + .indexCount(vertexCount) + .bufferType(IndexBuffer::IndexType::UINT) + .build(engine); + + ib->setBuffer(engine, IndexBuffer::BufferDescriptor( + gridIndices, vertexCount * sizeof(uint32_t), + [](void* buffer, size_t size, void*) { delete[] static_cast(buffer); } + )); + + _gridEntity = entityManager.create(); + // _materialInstance = _material->createInstance(); + // _materialInstance->setParameter("color", math::float3{0.5f, 0.5f, 0.5f}); // Gray color for the grid + + RenderableManager::Builder(1) + .boundingBox({{-gridSize * gridSpacing / 2, 0, -gridSize * gridSpacing / 2}, + {gridSize * gridSpacing / 2, 0, gridSize * gridSpacing / 2}}) + // .material(0, _materialInstance) + .geometry(0, RenderableManager::PrimitiveType::LINES, vb, ib, 0, vertexCount) + .priority(6) + .layerMask(0xFF, 4) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .build(engine, _gridEntity); +const float sphereRadius = 0.05f; +const int sphereSegments = 16; +const int sphereRings = 16; + +vertexCount = (sphereRings + 1) * (sphereSegments + 1); +int indexCount = sphereRings * sphereSegments * 6; + +math::float3* vertices = new math::float3[vertexCount]; +uint32_t* indices = new uint32_t[indexCount]; + +int vertexIndex = 0; +// Generate sphere vertices +for (int ring = 0; ring <= sphereRings; ++ring) { + float theta = ring * M_PI / sphereRings; + float sinTheta = std::sin(theta); + float cosTheta = std::cos(theta); + + for (int segment = 0; segment <= sphereSegments; ++segment) { + float phi = segment * 2 * M_PI / sphereSegments; + float sinPhi = std::sin(phi); + float cosPhi = std::cos(phi); + + float x = cosPhi * sinTheta; + float y = cosTheta; + float z = sinPhi * sinTheta; + + vertices[vertexIndex++] = {x * sphereRadius, y * sphereRadius, z * sphereRadius}; + } +} + +int indexIndex = 0; +// Generate sphere indices +for (int ring = 0; ring < sphereRings; ++ring) { + for (int segment = 0; segment < sphereSegments; ++segment) { + uint32_t current = ring * (sphereSegments + 1) + segment; + uint32_t next = current + sphereSegments + 1; + + indices[indexIndex++] = current; + indices[indexIndex++] = next; + indices[indexIndex++] = current + 1; + + indices[indexIndex++] = current + 1; + indices[indexIndex++] = next; + indices[indexIndex++] = next + 1; + } +} + +auto sphereVb = VertexBuffer::Builder() + .vertexCount(vertexCount) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) + .build(engine); + +sphereVb->setBufferAt(engine, 0, VertexBuffer::BufferDescriptor( + vertices, vertexCount * sizeof(math::float3), + [](void* buffer, size_t size, void*) { delete[] static_cast(buffer); } +)); + +auto sphereIb = IndexBuffer::Builder() + .indexCount(indexCount) + .bufferType(IndexBuffer::IndexType::UINT) + .build(engine); + +sphereIb->setBuffer(engine, IndexBuffer::BufferDescriptor( + indices, indexCount * sizeof(uint32_t), + [](void* buffer, size_t size, void*) { delete[] static_cast(buffer); } +)); + +_sphereEntity = entityManager.create(); + +RenderableManager::Builder(1) + .boundingBox({{-sphereRadius, -sphereRadius, -sphereRadius}, + {sphereRadius, sphereRadius, sphereRadius}}) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, sphereVb, sphereIb, 0, indexCount) + .priority(6) + .layerMask(0xFF, 4) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .build(engine, _sphereEntity); + +} + + +void GridOverlay::destroy() +{ + auto &rm = _engine.getRenderableManager(); + auto &tm = _engine.getTransformManager(); + rm.destroy(_sphereEntity); + rm.destroy(_gridEntity); + tm.destroy(_sphereEntity); + tm.destroy(_gridEntity); + _engine.destroy(_sphereEntity); + _engine.destroy(_gridEntity); +} + +} // namespace thermion_filament \ No newline at end of file From 9512b74008f0606e9d7b62e85b2d73827e98b5bc Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 15:59:36 +0800 Subject: [PATCH 007/232] fix: update material output path in Makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 2534cd72..7098feb3 100644 --- a/Makefile +++ b/Makefile @@ -23,9 +23,9 @@ bindings: materials: FORCE @echo "Using Filament build from ${FILAMENT_PATH}" ${FILAMENT_PATH}/matc -a opengl -a metal -o materials/image.filamat materials/image.mat - $(FILAMENT_PATH)/resgen -c -p image -x ios/include/material/ materials/image.filamat + $(FILAMENT_PATH)/resgen -c -p image -x thermion_dart/native/include/material/ materials/image.filamat $(FILAMENT_PATH)/matc -a opengl -a metal -o materials/gizmo.filamat materials/gizmo.mat - $(FILAMENT_PATH)/resgen -c -p gizmo -x ios/include/material/ materials/gizmo.filamat + $(FILAMENT_PATH)/resgen -c -p gizmo -x thermion_dart/native/include/material/ materials/gizmo.filamat #rm materials/*.filamat FORCE: ; From f7b765c5d0c9c2ed480c4be67c7acdfe0665d7d1 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 15:59:55 +0800 Subject: [PATCH 008/232] chore: rebuild materials --- thermion_dart/native/include/material/gizmo.c | 28222 +---------- thermion_dart/native/include/material/gizmo.h | 7 +- thermion_dart/native/include/material/image.c | 39284 +--------------- thermion_dart/native/include/material/image.h | 7 +- 4 files changed, 3219 insertions(+), 64301 deletions(-) diff --git a/thermion_dart/native/include/material/gizmo.c b/thermion_dart/native/include/material/gizmo.c index f2c45a7c..7cd93ac9 100644 --- a/thermion_dart/native/include/material/gizmo.c +++ b/thermion_dart/native/include/material/gizmo.c @@ -1,26883 +1,1351 @@ #include #include "gizmo.h" const uint8_t GIZMO_PACKAGE[] = { - // GIZMO - 0x53, - 0x52, - 0x45, - 0x56, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0x33, - 0x00, - 0x00, - 0x00, - 0x54, - 0x41, - 0x45, - 0x46, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x45, - 0x4d, - 0x41, - 0x4e, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x06, - 0x00, - 0x00, - 0x00, - 0x47, - 0x69, - 0x7a, - 0x6d, - 0x6f, - 0x00, - 0x4c, - 0x44, - 0x4d, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x4d, - 0x4f, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x54, - 0x4c, - 0x46, - 0x56, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0x2c, - 0x00, - 0x00, - 0x00, - 0x46, - 0x49, - 0x4e, - 0x55, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x98, - 0x00, - 0x00, - 0x00, - 0x09, - 0x46, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x00, - 0x4f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x01, - 0x4c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x73, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x04, - 0x53, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x05, - 0x46, - 0x72, - 0x6f, - 0x78, - 0x65, - 0x6c, - 0x52, - 0x65, - 0x63, - 0x6f, - 0x72, - 0x64, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x06, - 0x46, - 0x72, - 0x6f, - 0x78, - 0x65, - 0x6c, - 0x73, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x07, - 0x42, - 0x6f, - 0x6e, - 0x65, - 0x73, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x02, - 0x4d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x69, - 0x6e, - 0x67, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x03, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x08, - 0x50, - 0x4d, - 0x41, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0xcb, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x02, - 0x07, - 0x07, - 0x01, - 0x02, - 0x09, - 0x07, - 0x00, - 0x09, - 0x01, - 0x01, - 0x0a, - 0x00, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x4d, - 0x61, - 0x70, - 0x00, - 0x01, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x44, - 0x46, - 0x47, - 0x00, - 0x02, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x53, - 0x70, - 0x65, - 0x63, - 0x75, - 0x6c, - 0x61, - 0x72, - 0x00, - 0x03, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x61, - 0x6f, - 0x00, - 0x04, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x72, - 0x00, - 0x05, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x75, - 0x72, - 0x65, - 0x00, - 0x06, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x00, - 0x07, - 0x6d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x54, - 0x61, - 0x72, - 0x67, - 0x65, - 0x74, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x73, - 0x00, - 0x08, - 0x6d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x54, - 0x61, - 0x72, - 0x67, - 0x65, - 0x74, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x5f, - 0x74, - 0x61, - 0x6e, - 0x67, - 0x65, - 0x6e, - 0x74, - 0x73, - 0x00, - 0x09, - 0x62, - 0x6f, - 0x6e, - 0x65, - 0x73, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x69, - 0x63, - 0x65, - 0x73, - 0x41, - 0x6e, - 0x64, - 0x57, - 0x65, - 0x69, - 0x67, - 0x68, - 0x74, - 0x73, - 0x00, - 0x20, - 0x42, - 0x49, - 0x55, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x3b, - 0x00, - 0x00, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x11, - 0x02, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x20, - 0x42, - 0x49, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x17, - 0x00, - 0x00, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x53, - 0x4e, - 0x4f, - 0x43, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x08, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x20, - 0x42, - 0x55, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x17, - 0x00, - 0x00, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x53, - 0x53, - 0x4f, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x49, - 0x53, - 0x4f, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x45, - 0x4c, - 0x42, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x44, - 0x4d, - 0x52, - 0x54, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4c, - 0x46, - 0x45, - 0x52, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x49, - 0x52, - 0x57, - 0x43, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x53, - 0x57, - 0x45, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x49, - 0x52, - 0x57, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x53, - 0x45, - 0x54, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x54, - 0x53, - 0x4e, - 0x49, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x53, - 0x43, - 0x32, - 0x41, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x43, - 0x32, - 0x41, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x4d, - 0x55, - 0x43, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x50, - 0x4f, - 0x52, - 0x50, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x08, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x44, - 0x49, - 0x55, - 0x55, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x08, - 0x00, - 0x00, - 0x00, - 0xfe, - 0x16, - 0xc9, - 0x46, - 0x7d, - 0x50, - 0x8b, - 0x83, - 0x44, - 0x41, - 0x48, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4c, - 0x4d, - 0x48, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4d, - 0x46, - 0x45, - 0x52, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x54, - 0x46, - 0x45, - 0x52, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x52, - 0x4f, - 0x49, - 0x43, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x41, - 0x51, - 0x45, - 0x52, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x41, - 0x41, - 0x50, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x52, - 0x41, - 0x56, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0x9a, - 0x99, - 0x19, - 0x3e, - 0x52, - 0x48, - 0x54, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0xcd, - 0xcc, - 0x4c, - 0x3e, - 0x4f, - 0x44, - 0x45, - 0x56, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x52, - 0x54, - 0x4e, - 0x49, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x50, - 0x44, - 0x53, - 0x43, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x54, - 0x58, - 0x45, - 0x54, - 0x5f, - 0x43, - 0x49, - 0x44, - 0x74, - 0x53, - 0x00, - 0x00, - 0x49, - 0x02, - 0x00, - 0x00, - 0x23, - 0x76, - 0x65, - 0x72, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x33, - 0x30, - 0x30, - 0x20, - 0x65, - 0x73, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x00, - 0x7b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x7d, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x50, - 0x65, - 0x72, - 0x52, - 0x65, - 0x6e, - 0x64, - 0x65, - 0x72, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x44, - 0x61, - 0x74, - 0x61, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x54, - 0x61, - 0x72, - 0x67, - 0x65, - 0x74, - 0x43, - 0x6f, - 0x75, - 0x6e, - 0x74, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x66, - 0x6c, - 0x61, - 0x67, - 0x73, - 0x43, - 0x68, - 0x61, - 0x6e, - 0x6e, - 0x65, - 0x6c, - 0x73, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x49, - 0x64, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x73, - 0x65, - 0x72, - 0x44, - 0x61, - 0x74, - 0x61, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x72, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x5b, - 0x38, - 0x5d, - 0x3b, - 0x00, - 0x23, - 0x69, - 0x66, - 0x6e, - 0x64, - 0x65, - 0x66, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x31, - 0x00, - 0x23, - 0x64, - 0x65, - 0x66, - 0x69, - 0x6e, - 0x65, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x31, - 0x20, - 0x36, - 0x34, - 0x00, - 0x23, - 0x65, - 0x6e, - 0x64, - 0x69, - 0x66, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x4d, - 0x41, - 0x58, - 0x5f, - 0x49, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x43, - 0x45, - 0x53, - 0x20, - 0x3d, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x31, - 0x3b, - 0x00, - 0x23, - 0x69, - 0x66, - 0x6e, - 0x64, - 0x65, - 0x66, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x35, - 0x00, - 0x23, - 0x64, - 0x65, - 0x66, - 0x69, - 0x6e, - 0x65, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x35, - 0x20, - 0x66, - 0x61, - 0x6c, - 0x73, - 0x65, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x50, - 0x4f, - 0x57, - 0x45, - 0x52, - 0x5f, - 0x56, - 0x52, - 0x5f, - 0x53, - 0x48, - 0x41, - 0x44, - 0x45, - 0x52, - 0x5f, - 0x57, - 0x4f, - 0x52, - 0x4b, - 0x41, - 0x52, - 0x4f, - 0x55, - 0x4e, - 0x44, - 0x53, - 0x20, - 0x3d, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x35, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x73, - 0x74, - 0x64, - 0x31, - 0x34, - 0x30, - 0x29, - 0x20, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x4f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x50, - 0x65, - 0x72, - 0x52, - 0x65, - 0x6e, - 0x64, - 0x65, - 0x72, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x44, - 0x61, - 0x74, - 0x61, - 0x20, - 0x61, - 0x5b, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x4d, - 0x41, - 0x58, - 0x5f, - 0x49, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x43, - 0x45, - 0x53, - 0x5d, - 0x3b, - 0x00, - 0x7d, - 0x20, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x73, - 0x74, - 0x64, - 0x31, - 0x34, - 0x30, - 0x29, - 0x20, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x46, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x61, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x62, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x63, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x64, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x65, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x66, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x67, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x68, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x69, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6b, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6c, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6d, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6f, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x70, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x71, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x72, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x76, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x77, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x78, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x79, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x61, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x75, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x62, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x63, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x64, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x67, - 0x7a, - 0x5b, - 0x39, - 0x5d, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x68, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x69, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6b, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6c, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6f, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x70, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x71, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x72, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x76, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x77, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x78, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x61, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x62, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x63, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x64, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x67, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x68, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x20, - 0x69, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6a, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6b, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6c, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6f, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x70, - 0x7a, - 0x7a, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x71, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x72, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x75, - 0x7a, - 0x7a, - 0x5b, - 0x34, - 0x30, - 0x5d, - 0x3b, - 0x00, - 0x7d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x29, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x61, - 0x74, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x3b, - 0x00, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x6f, - 0x69, - 0x64, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x28, - 0x29, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x50, - 0x4f, - 0x57, - 0x45, - 0x52, - 0x5f, - 0x56, - 0x52, - 0x5f, - 0x53, - 0x48, - 0x41, - 0x44, - 0x45, - 0x52, - 0x5f, - 0x57, - 0x4f, - 0x52, - 0x4b, - 0x41, - 0x52, - 0x4f, - 0x55, - 0x4e, - 0x44, - 0x53, - 0x29, - 0x00, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x31, - 0x20, - 0x2b, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x49, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x49, - 0x44, - 0x29, - 0x20, - 0x2d, - 0x20, - 0x31, - 0x3b, - 0x00, - 0x7d, - 0x00, - 0x65, - 0x6c, - 0x73, - 0x65, - 0x00, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x49, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x49, - 0x44, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x31, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x5b, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x5d, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x31, - 0x36, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x2e, - 0x39, - 0x39, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x31, - 0x36, - 0x29, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x32, - 0x30, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x36, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x30, - 0x35, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x30, - 0x35, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x30, - 0x35, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x36, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x37, - 0x3b, - 0x00, - 0x5f, - 0x32, - 0x31, - 0x37, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x31, - 0x37, - 0x2e, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x78, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x31, - 0x37, - 0x2e, - 0x77, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x79, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x37, - 0x3b, - 0x00, - 0x70, - 0x72, - 0x65, - 0x63, - 0x69, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3b, - 0x00, - 0x70, - 0x72, - 0x65, - 0x63, - 0x69, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x65, - 0x6d, - 0x69, - 0x73, - 0x73, - 0x69, - 0x76, - 0x65, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x63, - 0x6c, - 0x65, - 0x61, - 0x72, - 0x43, - 0x6f, - 0x61, - 0x74, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x63, - 0x6c, - 0x65, - 0x61, - 0x72, - 0x43, - 0x6f, - 0x61, - 0x74, - 0x52, - 0x6f, - 0x75, - 0x67, - 0x68, - 0x6e, - 0x65, - 0x73, - 0x73, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x61, - 0x6e, - 0x69, - 0x73, - 0x6f, - 0x74, - 0x72, - 0x6f, - 0x70, - 0x79, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x61, - 0x6e, - 0x69, - 0x73, - 0x6f, - 0x74, - 0x72, - 0x6f, - 0x70, - 0x79, - 0x44, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x36, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x37, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x38, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x73, - 0x74, - 0x64, - 0x31, - 0x34, - 0x30, - 0x29, - 0x20, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x61, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x62, - 0x3b, - 0x00, - 0x7d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x29, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x36, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x38, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x36, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x38, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x36, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x37, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x38, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x62, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x63, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x64, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x65, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x66, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x67, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x68, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x69, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6b, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6c, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6d, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6e, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6f, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x70, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x71, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x72, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x76, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x77, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x78, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x79, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x61, - 0x7a, - 0x3b, - 0x00, - 0x75, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x62, - 0x7a, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x63, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x64, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x67, - 0x7a, - 0x5b, - 0x39, - 0x5d, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x68, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x69, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6a, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6b, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6c, - 0x7a, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6f, - 0x7a, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x70, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x71, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x72, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x7a, - 0x3b, - 0x00, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x76, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x77, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x78, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x61, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x62, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x63, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x64, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x67, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x68, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x20, - 0x69, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6a, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6b, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6c, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6f, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x70, - 0x7a, - 0x7a, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x71, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x72, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x75, - 0x7a, - 0x7a, - 0x5b, - 0x34, - 0x30, - 0x5d, - 0x3b, - 0x00, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x43, - 0x75, - 0x62, - 0x65, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x20, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x28, - 0x69, - 0x6e, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2c, - 0x20, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x6c, - 0x65, - 0x6e, - 0x67, - 0x74, - 0x68, - 0x28, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x3e, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x7a, - 0x7a, - 0x29, - 0x00, - 0x72, - 0x65, - 0x74, - 0x75, - 0x72, - 0x6e, - 0x20, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x29, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x30, - 0x31, - 0x32, - 0x35, - 0x29, - 0x00, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x7a, - 0x2e, - 0x7a, - 0x20, - 0x2d, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x7a, - 0x2e, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x7a, - 0x2e, - 0x79, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x29, - 0x29, - 0x29, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x7a, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x34, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x78, - 0x7a, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x32, - 0x34, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x34, - 0x37, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x69, - 0x6e, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x32, - 0x34, - 0x37, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x36, - 0x30, - 0x36, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x64, - 0x7a, - 0x7a, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x7a, - 0x7a, - 0x29, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x68, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x32, - 0x37, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x34, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x75, - 0x6e, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x48, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x78, - 0x31, - 0x36, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x7a, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x30, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x4c, - 0x6f, - 0x64, - 0x28, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x2c, - 0x20, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x70, - 0x6f, - 0x73, - 0x65, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x30, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x31, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x32, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x2c, - 0x20, - 0x6d, - 0x69, - 0x78, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x2e, - 0x79, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x2e, - 0x78, - 0x2c, - 0x20, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x32, - 0x37, - 0x34, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x30, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x30, - 0x36, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x34, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x36, - 0x30, - 0x38, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x7a, - 0x7a, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x7a, - 0x7a, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x33, - 0x34, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x31, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x64, - 0x6f, - 0x74, - 0x28, - 0x6e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x69, - 0x7a, - 0x65, - 0x28, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x68, - 0x7a, - 0x29, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x33, - 0x35, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x37, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x30, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x32, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6a, - 0x7a, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6a, - 0x7a, - 0x2e, - 0x77, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x70, - 0x6f, - 0x77, - 0x28, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x33, - 0x35, - 0x37, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x7a, - 0x7a, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x33, - 0x34, - 0x31, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x30, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x32, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x37, - 0x31, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x34, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x36, - 0x30, - 0x38, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x37, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x37, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x37, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x36, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x38, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x36, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x38, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x5f, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x5b, - 0x33, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x28, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x2c, - 0x20, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x5f, - 0x31, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x33, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x54, - 0x61, - 0x72, - 0x67, - 0x65, - 0x74, - 0x43, - 0x6f, - 0x75, - 0x6e, - 0x74, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x66, - 0x6c, - 0x61, - 0x67, - 0x73, - 0x43, - 0x68, - 0x61, - 0x6e, - 0x6e, - 0x65, - 0x6c, - 0x73, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x49, - 0x64, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x73, - 0x65, - 0x72, - 0x44, - 0x61, - 0x74, - 0x61, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x72, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x5b, - 0x38, - 0x5d, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x36, - 0x35, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x29, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x20, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x42, - 0x69, - 0x74, - 0x73, - 0x54, - 0x6f, - 0x46, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x5b, - 0x5f, - 0x31, - 0x36, - 0x35, - 0x5d, - 0x2e, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x49, - 0x64, - 0x29, - 0x3b, - 0x00, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x2f, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x23, - 0x65, - 0x78, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x47, - 0x4c, - 0x5f, - 0x45, - 0x58, - 0x54, - 0x5f, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x5f, - 0x63, - 0x75, - 0x6c, - 0x6c, - 0x5f, - 0x64, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x20, - 0x3a, - 0x20, - 0x72, - 0x65, - 0x71, - 0x75, - 0x69, - 0x72, - 0x65, - 0x00, - 0x23, - 0x69, - 0x66, - 0x6e, - 0x64, - 0x65, - 0x66, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x38, - 0x00, - 0x23, - 0x64, - 0x65, - 0x66, - 0x69, - 0x6e, - 0x65, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x38, - 0x20, - 0x32, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x20, - 0x3d, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x38, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x37, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x2f, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x5b, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x5b, - 0x5f, - 0x37, - 0x35, - 0x5d, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x34, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x2e, - 0x39, - 0x39, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x39, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x38, - 0x34, - 0x29, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x39, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x30, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x31, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x31, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x31, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x5b, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x39, - 0x30, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x32, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x35, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x31, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x36, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x34, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x28, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x36, - 0x20, - 0x2f, - 0x20, - 0x32, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x31, - 0x31, - 0x30, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x31, - 0x31, - 0x30, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x31, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x2d, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x36, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x34, - 0x20, - 0x2b, - 0x20, - 0x31, - 0x29, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x78, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x77, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x79, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x35, - 0x3b, - 0x00, - 0x23, - 0x76, - 0x65, - 0x72, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x34, - 0x31, - 0x30, - 0x00, - 0x23, - 0x65, - 0x78, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x47, - 0x4c, - 0x5f, - 0x41, - 0x52, - 0x42, - 0x5f, - 0x73, - 0x68, - 0x61, - 0x64, - 0x69, - 0x6e, - 0x67, - 0x5f, - 0x6c, - 0x61, - 0x6e, - 0x67, - 0x75, - 0x61, - 0x67, - 0x65, - 0x5f, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x20, - 0x3a, - 0x20, - 0x65, - 0x6e, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x38, - 0x29, - 0x20, - 0x66, - 0x6c, - 0x61, - 0x74, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x34, - 0x29, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x37, - 0x29, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x31, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x5b, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x5d, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x31, - 0x37, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x2e, - 0x39, - 0x39, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x31, - 0x37, - 0x29, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x32, - 0x30, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x37, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x37, - 0x3b, - 0x00, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x43, - 0x75, - 0x62, - 0x65, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x34, - 0x29, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x28, - 0x69, - 0x6e, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x6c, - 0x65, - 0x6e, - 0x67, - 0x74, - 0x68, - 0x28, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x69, - 0x6e, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x78, - 0x7a, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x75, - 0x6e, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x48, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x78, - 0x31, - 0x36, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x7a, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x30, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x4c, - 0x6f, - 0x64, - 0x28, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x2c, - 0x20, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x70, - 0x6f, - 0x73, - 0x65, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x30, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x31, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x32, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x2c, - 0x20, - 0x6d, - 0x69, - 0x78, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x2e, - 0x79, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x2e, - 0x78, - 0x2c, - 0x20, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x7a, - 0x7a, - 0x29, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x68, - 0x7a, - 0x7a, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x30, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x32, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6a, - 0x7a, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6a, - 0x7a, - 0x2e, - 0x77, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x70, - 0x6f, - 0x77, - 0x28, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x64, - 0x6f, - 0x74, - 0x28, - 0x6e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x69, - 0x7a, - 0x65, - 0x28, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x68, - 0x7a, - 0x29, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x7a, - 0x7a, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x7a, - 0x7a, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x5f, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x5b, - 0x33, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x29, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x37, - 0x29, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x2f, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x38, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x5b, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x5b, - 0x5f, - 0x31, - 0x39, - 0x38, - 0x5d, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x38, - 0x39, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x2e, - 0x39, - 0x39, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x38, - 0x39, - 0x29, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x37, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x32, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x32, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x32, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x5b, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x37, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x32, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x32, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x34, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x33, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x32, - 0x32, - 0x39, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x32, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x28, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x33, - 0x33, - 0x20, - 0x2f, - 0x20, - 0x32, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x32, - 0x34, - 0x34, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x32, - 0x34, - 0x34, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x31, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x2d, - 0x28, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x33, - 0x33, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x32, - 0x32, - 0x39, - 0x20, - 0x2b, - 0x20, - 0x31, - 0x29, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x78, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2e, - 0x77, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x79, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x38, - 0x3b, - 0x00, - 0x23, - 0x69, - 0x6e, - 0x63, - 0x6c, - 0x75, - 0x64, - 0x65, - 0x20, - 0x3c, - 0x6d, - 0x65, - 0x74, - 0x61, - 0x6c, - 0x5f, - 0x73, - 0x74, - 0x64, - 0x6c, - 0x69, - 0x62, - 0x3e, - 0x00, - 0x23, - 0x69, - 0x6e, - 0x63, - 0x6c, - 0x75, - 0x64, - 0x65, - 0x20, - 0x3c, - 0x73, - 0x69, - 0x6d, - 0x64, - 0x2f, - 0x73, - 0x69, - 0x6d, - 0x64, - 0x2e, - 0x68, - 0x3e, - 0x00, - 0x00, - 0x75, - 0x73, - 0x69, - 0x6e, - 0x67, - 0x20, - 0x6e, - 0x61, - 0x6d, - 0x65, - 0x73, - 0x70, - 0x61, - 0x63, - 0x65, - 0x20, - 0x6d, - 0x65, - 0x74, - 0x61, - 0x6c, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x78, - 0x33, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x54, - 0x61, - 0x72, - 0x67, - 0x65, - 0x74, - 0x43, - 0x6f, - 0x75, - 0x6e, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x66, - 0x6c, - 0x61, - 0x67, - 0x73, - 0x43, - 0x68, - 0x61, - 0x6e, - 0x6e, - 0x65, - 0x6c, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x49, - 0x64, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x73, - 0x65, - 0x72, - 0x44, - 0x61, - 0x74, - 0x61, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x72, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x5b, - 0x38, - 0x5d, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x4d, - 0x41, - 0x58, - 0x5f, - 0x49, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x43, - 0x45, - 0x53, - 0x20, - 0x3d, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x31, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x4f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x50, - 0x65, - 0x72, - 0x52, - 0x65, - 0x6e, - 0x64, - 0x65, - 0x72, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x44, - 0x61, - 0x74, - 0x61, - 0x20, - 0x64, - 0x61, - 0x74, - 0x61, - 0x5b, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x4d, - 0x41, - 0x58, - 0x5f, - 0x49, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x43, - 0x45, - 0x53, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x46, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x56, - 0x69, - 0x65, - 0x77, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x56, - 0x69, - 0x65, - 0x77, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x54, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x43, - 0x6f, - 0x6e, - 0x74, - 0x72, - 0x6f, - 0x6c, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x69, - 0x6d, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x65, - 0x6d, - 0x70, - 0x6f, - 0x72, - 0x61, - 0x6c, - 0x4e, - 0x6f, - 0x69, - 0x73, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x75, - 0x73, - 0x65, - 0x72, - 0x54, - 0x69, - 0x6d, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x72, - 0x65, - 0x73, - 0x6f, - 0x6c, - 0x75, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x6c, - 0x6f, - 0x67, - 0x69, - 0x63, - 0x61, - 0x6c, - 0x56, - 0x69, - 0x65, - 0x77, - 0x70, - 0x6f, - 0x72, - 0x74, - 0x53, - 0x63, - 0x61, - 0x6c, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x6c, - 0x6f, - 0x67, - 0x69, - 0x63, - 0x61, - 0x6c, - 0x56, - 0x69, - 0x65, - 0x77, - 0x70, - 0x6f, - 0x72, - 0x74, - 0x4f, - 0x66, - 0x66, - 0x73, - 0x65, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6c, - 0x6f, - 0x64, - 0x42, - 0x69, - 0x61, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x72, - 0x65, - 0x66, - 0x72, - 0x61, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x4c, - 0x6f, - 0x64, - 0x4f, - 0x66, - 0x66, - 0x73, - 0x65, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x64, - 0x65, - 0x72, - 0x69, - 0x76, - 0x61, - 0x74, - 0x69, - 0x76, - 0x65, - 0x73, - 0x53, - 0x63, - 0x61, - 0x6c, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6f, - 0x6e, - 0x65, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x65, - 0x61, - 0x72, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x63, - 0x61, - 0x6d, - 0x65, - 0x72, - 0x61, - 0x46, - 0x61, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x78, - 0x70, - 0x6f, - 0x73, - 0x75, - 0x72, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x76, - 0x31, - 0x30, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x65, - 0x65, - 0x64, - 0x73, - 0x41, - 0x6c, - 0x70, - 0x68, - 0x61, - 0x43, - 0x68, - 0x61, - 0x6e, - 0x6e, - 0x65, - 0x6c, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x61, - 0x6f, - 0x53, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x69, - 0x6e, - 0x67, - 0x51, - 0x75, - 0x61, - 0x6c, - 0x69, - 0x74, - 0x79, - 0x41, - 0x6e, - 0x64, - 0x45, - 0x64, - 0x67, - 0x65, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x61, - 0x6f, - 0x42, - 0x65, - 0x6e, - 0x74, - 0x4e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x7a, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x65, - 0x64, - 0x5f, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x33, - 0x20, - 0x66, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x68, - 0x61, - 0x6e, - 0x6e, - 0x65, - 0x6c, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x66, - 0x72, - 0x6f, - 0x78, - 0x65, - 0x6c, - 0x43, - 0x6f, - 0x75, - 0x6e, - 0x74, - 0x58, - 0x59, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x69, - 0x62, - 0x6c, - 0x4c, - 0x75, - 0x6d, - 0x69, - 0x6e, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x69, - 0x62, - 0x6c, - 0x52, - 0x6f, - 0x75, - 0x67, - 0x68, - 0x6e, - 0x65, - 0x73, - 0x73, - 0x4f, - 0x6e, - 0x65, - 0x4c, - 0x65, - 0x76, - 0x65, - 0x6c, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x69, - 0x62, - 0x6c, - 0x53, - 0x48, - 0x5b, - 0x39, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x65, - 0x64, - 0x5f, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x44, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x70, - 0x61, - 0x64, - 0x64, - 0x69, - 0x6e, - 0x67, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x49, - 0x6e, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x73, - 0x75, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x46, - 0x61, - 0x72, - 0x41, - 0x74, - 0x74, - 0x65, - 0x6e, - 0x75, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x64, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x61, - 0x6c, - 0x53, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x73, - 0x43, - 0x6f, - 0x6e, - 0x74, - 0x61, - 0x63, - 0x74, - 0x53, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x63, - 0x61, - 0x73, - 0x63, - 0x61, - 0x64, - 0x65, - 0x53, - 0x70, - 0x6c, - 0x69, - 0x74, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x63, - 0x61, - 0x73, - 0x63, - 0x61, - 0x64, - 0x65, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x50, - 0x65, - 0x6e, - 0x75, - 0x6d, - 0x62, - 0x72, - 0x61, - 0x52, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x53, - 0x63, - 0x61, - 0x6c, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x46, - 0x61, - 0x72, - 0x41, - 0x74, - 0x74, - 0x65, - 0x6e, - 0x75, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x76, - 0x73, - 0x6d, - 0x45, - 0x78, - 0x70, - 0x6f, - 0x6e, - 0x65, - 0x6e, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x76, - 0x73, - 0x6d, - 0x44, - 0x65, - 0x70, - 0x74, - 0x68, - 0x53, - 0x63, - 0x61, - 0x6c, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x76, - 0x73, - 0x6d, - 0x4c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x42, - 0x6c, - 0x65, - 0x65, - 0x64, - 0x52, - 0x65, - 0x64, - 0x75, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x53, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x69, - 0x6e, - 0x67, - 0x54, - 0x79, - 0x70, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x65, - 0x64, - 0x5f, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x44, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x61, - 0x78, - 0x4f, - 0x70, - 0x61, - 0x63, - 0x69, - 0x74, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x69, - 0x6e, - 0x4d, - 0x61, - 0x78, - 0x4d, - 0x69, - 0x70, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x48, - 0x65, - 0x69, - 0x67, - 0x68, - 0x74, - 0x46, - 0x61, - 0x6c, - 0x6c, - 0x6f, - 0x66, - 0x66, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x75, - 0x74, - 0x4f, - 0x66, - 0x66, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x65, - 0x64, - 0x5f, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x49, - 0x62, - 0x6c, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x69, - 0x7a, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x4f, - 0x6e, - 0x65, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x78, - 0x33, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x73, - 0x73, - 0x72, - 0x52, - 0x65, - 0x70, - 0x72, - 0x6f, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x73, - 0x73, - 0x72, - 0x55, - 0x76, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x56, - 0x69, - 0x65, - 0x77, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x73, - 0x72, - 0x54, - 0x68, - 0x69, - 0x63, - 0x6b, - 0x6e, - 0x65, - 0x73, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x73, - 0x72, - 0x42, - 0x69, - 0x61, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x73, - 0x72, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x73, - 0x72, - 0x53, - 0x74, - 0x72, - 0x69, - 0x64, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x63, - 0x75, - 0x73, - 0x74, - 0x6f, - 0x6d, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x72, - 0x65, - 0x63, - 0x37, - 0x30, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x73, - 0x32, - 0x52, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x73, - 0x32, - 0x52, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x73, - 0x32, - 0x52, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x72, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x5b, - 0x34, - 0x30, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x75, - 0x73, - 0x65, - 0x72, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x6e, - 0x34, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x75, - 0x73, - 0x65, - 0x72, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x6e, - 0x37, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x5b, - 0x5b, - 0x75, - 0x73, - 0x65, - 0x72, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x6e, - 0x38, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x69, - 0x6e, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x61, - 0x74, - 0x74, - 0x72, - 0x69, - 0x62, - 0x75, - 0x74, - 0x65, - 0x28, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x69, - 0x6e, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x73, - 0x74, - 0x61, - 0x67, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x46, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x31, - 0x37, - 0x29, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x4f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x31, - 0x38, - 0x29, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x49, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x49, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x64, - 0x5d, - 0x5d, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x3d, - 0x20, - 0x7b, - 0x7d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x28, - 0x67, - 0x6c, - 0x5f, - 0x49, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x49, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x64, - 0x61, - 0x74, - 0x61, - 0x5b, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x5d, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x35, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x2e, - 0x39, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x35, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x39, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x39, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x39, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x30, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x30, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x30, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x72, - 0x65, - 0x74, - 0x75, - 0x72, - 0x6e, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x28, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x6d, - 0x65, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x32, - 0x35, - 0x29, - 0x5d, - 0x5d, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x2c, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x6d, - 0x65, - 0x6e, - 0x74, - 0x20, - 0x76, - 0x6f, - 0x69, - 0x64, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x29, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x31, - 0x20, - 0x7b, - 0x00, - 0x64, - 0x65, - 0x70, - 0x74, - 0x68, - 0x32, - 0x64, - 0x5f, - 0x61, - 0x72, - 0x72, - 0x61, - 0x79, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x4d, - 0x61, - 0x70, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x4d, - 0x61, - 0x70, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x31, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x32, - 0x64, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x44, - 0x46, - 0x47, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x32, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x44, - 0x46, - 0x47, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x33, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x63, - 0x75, - 0x62, - 0x65, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x53, - 0x70, - 0x65, - 0x63, - 0x75, - 0x6c, - 0x61, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x34, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x53, - 0x70, - 0x65, - 0x63, - 0x75, - 0x6c, - 0x61, - 0x72, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x35, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x32, - 0x64, - 0x5f, - 0x61, - 0x72, - 0x72, - 0x61, - 0x79, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x61, - 0x6f, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x36, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x61, - 0x6f, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x37, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x32, - 0x64, - 0x5f, - 0x61, - 0x72, - 0x72, - 0x61, - 0x79, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x38, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x72, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x39, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x32, - 0x64, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x75, - 0x72, - 0x65, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x31, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x75, - 0x72, - 0x65, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x31, - 0x31, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x63, - 0x75, - 0x62, - 0x65, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x31, - 0x32, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x31, - 0x33, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x6d, - 0x65, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x69, - 0x6e, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x73, - 0x74, - 0x61, - 0x67, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x31, - 0x26, - 0x20, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x31, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x32, - 0x37, - 0x29, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x46, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x31, - 0x37, - 0x29, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x32, - 0x35, - 0x29, - 0x5d, - 0x5d, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x33, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x34, - 0x34, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x69, - 0x6e, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x56, - 0x69, - 0x65, - 0x77, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x33, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x64, - 0x6f, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x7b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x6c, - 0x65, - 0x6e, - 0x67, - 0x74, - 0x68, - 0x28, - 0x5f, - 0x34, - 0x34, - 0x38, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x3e, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x75, - 0x74, - 0x4f, - 0x66, - 0x66, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x7b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x72, - 0x65, - 0x61, - 0x6b, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x7d, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x36, - 0x32, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x34, - 0x38, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x36, - 0x32, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x48, - 0x65, - 0x69, - 0x67, - 0x68, - 0x74, - 0x46, - 0x61, - 0x6c, - 0x6c, - 0x6f, - 0x66, - 0x66, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x36, - 0x32, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x37, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x36, - 0x32, - 0x32, - 0x29, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x30, - 0x31, - 0x32, - 0x35, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x2d, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x44, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x5b, - 0x30, - 0x5d, - 0x2c, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x2d, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x48, - 0x65, - 0x69, - 0x67, - 0x68, - 0x74, - 0x46, - 0x61, - 0x6c, - 0x6c, - 0x6f, - 0x66, - 0x66, - 0x2c, - 0x20, - 0x5f, - 0x36, - 0x32, - 0x31, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x44, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x5b, - 0x31, - 0x5d, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x44, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x5b, - 0x32, - 0x5d, - 0x29, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x36, - 0x32, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x65, - 0x6c, - 0x73, - 0x65, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x44, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x5b, - 0x32, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x69, - 0x6e, - 0x28, - 0x5f, - 0x38, - 0x31, - 0x33, - 0x20, - 0x2d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x37, - 0x39, - 0x37, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x61, - 0x78, - 0x4f, - 0x70, - 0x61, - 0x63, - 0x69, - 0x74, - 0x79, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x38, - 0x32, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x49, - 0x62, - 0x6c, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x20, - 0x5f, - 0x38, - 0x32, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x61, - 0x73, - 0x5f, - 0x74, - 0x79, - 0x70, - 0x65, - 0x3c, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x3e, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x69, - 0x6e, - 0x4d, - 0x61, - 0x78, - 0x4d, - 0x69, - 0x70, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x32, - 0x38, - 0x20, - 0x2a, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x31, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x2e, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x31, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x2c, - 0x20, - 0x28, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x70, - 0x6f, - 0x73, - 0x65, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x78, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x30, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x31, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x32, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x34, - 0x34, - 0x38, - 0x29, - 0x2c, - 0x20, - 0x6c, - 0x65, - 0x76, - 0x65, - 0x6c, - 0x28, - 0x6d, - 0x69, - 0x78, - 0x28, - 0x5f, - 0x38, - 0x32, - 0x30, - 0x2e, - 0x79, - 0x2c, - 0x20, - 0x5f, - 0x38, - 0x32, - 0x30, - 0x2e, - 0x78, - 0x2c, - 0x20, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4f, - 0x6e, - 0x65, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x2c, - 0x20, - 0x2d, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x33, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x32, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x38, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x62, - 0x6c, - 0x4c, - 0x75, - 0x6d, - 0x69, - 0x6e, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x69, - 0x7a, - 0x65, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x34, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x49, - 0x6e, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x49, - 0x6e, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x70, - 0x6f, - 0x77, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x64, - 0x6f, - 0x74, - 0x28, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x69, - 0x7a, - 0x65, - 0x28, - 0x5f, - 0x34, - 0x34, - 0x38, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x44, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x69, - 0x7a, - 0x65, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x5f, - 0x38, - 0x31, - 0x33, - 0x20, - 0x2d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x37, - 0x39, - 0x37, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x33, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x37, - 0x35, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x38, - 0x33, - 0x37, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x5f, - 0x38, - 0x31, - 0x33, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x33, - 0x37, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x32, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x35, - 0x30, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x32, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x35, - 0x30, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x32, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x35, - 0x30, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x72, - 0x65, - 0x61, - 0x6b, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x7d, - 0x20, - 0x77, - 0x68, - 0x69, - 0x6c, - 0x65, - 0x28, - 0x66, - 0x61, - 0x6c, - 0x73, - 0x65, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x29, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x36, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x7b, - 0x7d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x20, - 0x5b, - 0x5b, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x28, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x6d, - 0x65, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x69, - 0x6e, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x73, - 0x74, - 0x61, - 0x67, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x4f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x31, - 0x38, - 0x29, - 0x5d, - 0x5d, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x61, - 0x73, - 0x5f, - 0x74, - 0x79, - 0x70, - 0x65, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x64, - 0x61, - 0x74, - 0x61, - 0x5b, - 0x5f, - 0x31, - 0x36, - 0x35, - 0x5d, - 0x2e, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x49, - 0x64, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x2f, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x6d, - 0x65, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5f, - 0x74, - 0x6d, - 0x70, - 0x20, - 0x5b, - 0x5b, - 0x66, - 0x75, - 0x6e, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x5f, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x28, - 0x38, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x73, - 0x5f, - 0x66, - 0x75, - 0x6e, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x5f, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x5f, - 0x64, - 0x65, - 0x66, - 0x69, - 0x6e, - 0x65, - 0x64, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5f, - 0x74, - 0x6d, - 0x70, - 0x29, - 0x20, - 0x3f, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5f, - 0x74, - 0x6d, - 0x70, - 0x20, - 0x3a, - 0x20, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x20, - 0x5b, - 0x5b, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x5f, - 0x64, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5d, - 0x5d, - 0x20, - 0x5b, - 0x32, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x30, - 0x20, - 0x5b, - 0x5b, - 0x75, - 0x73, - 0x65, - 0x72, - 0x28, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x31, - 0x20, - 0x5b, - 0x5b, - 0x75, - 0x73, - 0x65, - 0x72, - 0x28, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x31, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x2f, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x64, - 0x61, - 0x74, - 0x61, - 0x5b, - 0x5f, - 0x36, - 0x35, - 0x5d, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x2e, - 0x39, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x39, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x39, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x39, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x39, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x39, - 0x31, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x39, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x38, - 0x39, - 0x2e, - 0x78, - 0x2c, - 0x20, - 0x5f, - 0x39, - 0x34, - 0x2c, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x32, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x39, - 0x32, - 0x2c, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x2c, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x39, - 0x34, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x2d, - 0x32, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x39, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x2c, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x2c, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x31, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x31, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x2d, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x39, - 0x31, - 0x20, - 0x2b, - 0x20, - 0x31, - 0x29, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x2c, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x31, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x31, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x64, - 0x61, - 0x74, - 0x61, - 0x5b, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x5d, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x36, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x2e, - 0x39, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x30, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x30, - 0x30, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x30, - 0x30, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x30, - 0x30, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x30, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x30, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x69, - 0x6e, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x37, - 0x39, - 0x37, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x61, - 0x78, - 0x4f, - 0x70, - 0x61, - 0x63, - 0x69, - 0x74, - 0x79, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x61, - 0x73, - 0x5f, - 0x74, - 0x79, - 0x70, - 0x65, - 0x3c, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x3e, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x69, - 0x6e, - 0x4d, - 0x61, - 0x78, - 0x4d, - 0x69, - 0x70, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x31, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x2e, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x31, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x2c, - 0x20, - 0x28, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x70, - 0x6f, - 0x73, - 0x65, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x78, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x30, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x31, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x32, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x34, - 0x34, - 0x38, - 0x29, - 0x2c, - 0x20, - 0x6c, - 0x65, - 0x76, - 0x65, - 0x6c, - 0x28, - 0x6d, - 0x69, - 0x78, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x38, - 0x31, - 0x37, - 0x2e, - 0x79, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x38, - 0x31, - 0x37, - 0x2e, - 0x78, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4f, - 0x6e, - 0x65, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x2c, - 0x20, - 0x2d, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x29, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x38, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x62, - 0x6c, - 0x4c, - 0x75, - 0x6d, - 0x69, - 0x6e, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x34, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x49, - 0x6e, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x49, - 0x6e, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x2e, - 0x77, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x70, - 0x6f, - 0x77, - 0x28, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x64, - 0x6f, - 0x74, - 0x28, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x69, - 0x7a, - 0x65, - 0x28, - 0x5f, - 0x34, - 0x34, - 0x38, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x44, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x69, - 0x7a, - 0x65, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x37, - 0x39, - 0x37, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x36, - 0x30, - 0x35, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x37, - 0x35, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x34, - 0x35, - 0x30, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x2f, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x36, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x64, - 0x61, - 0x74, - 0x61, - 0x5b, - 0x5f, - 0x31, - 0x39, - 0x30, - 0x5d, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x36, - 0x39, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x2e, - 0x39, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x36, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x33, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x33, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x33, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5d, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x32, - 0x32, - 0x31, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x34, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x36, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x32, - 0x31, - 0x36, - 0x2e, - 0x78, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x39, - 0x2c, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x32, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x35, - 0x2c, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x39, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x32, - 0x34, - 0x38, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x33, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x2d, - 0x32, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x34, - 0x32, - 0x39, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x35, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x34, - 0x38, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x32, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x31, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x2d, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x34, - 0x32, - 0x39, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x32, - 0x32, - 0x31, - 0x20, - 0x2b, - 0x20, - 0x31, - 0x29, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x34, - 0x38, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x32, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x30, - 0x3b, - 0x00, - 0x4c, - 0x53, - 0x4c, - 0x47, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0xb2, - 0x08, - 0x00, - 0x00, - 0x12, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x86, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x01, - 0x90, - 0x01, - 0x00, - 0x00, - 0x01, - 0x10, - 0x00, - 0x86, - 0x00, - 0x00, - 0x00, - 0x01, - 0x10, - 0x01, - 0xca, - 0x01, - 0x00, - 0x00, - 0x01, - 0x20, - 0x01, - 0xde, - 0x01, - 0x00, - 0x00, - 0x01, - 0x30, - 0x01, - 0x26, - 0x03, - 0x00, - 0x00, - 0x01, - 0x44, - 0x01, - 0x68, - 0x03, - 0x00, - 0x00, - 0x01, - 0x80, - 0x00, - 0x80, - 0x03, - 0x00, - 0x00, - 0x01, - 0x90, - 0x00, - 0x80, - 0x03, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0xa8, - 0x04, - 0x00, - 0x00, - 0x02, - 0x00, - 0x01, - 0xb4, - 0x05, - 0x00, - 0x00, - 0x02, - 0x10, - 0x00, - 0xa8, - 0x04, - 0x00, - 0x00, - 0x02, - 0x10, - 0x01, - 0xec, - 0x05, - 0x00, - 0x00, - 0x02, - 0x20, - 0x01, - 0xfe, - 0x05, - 0x00, - 0x00, - 0x02, - 0x30, - 0x01, - 0x34, - 0x07, - 0x00, - 0x00, - 0x02, - 0x44, - 0x01, - 0x74, - 0x07, - 0x00, - 0x00, - 0x02, - 0x80, - 0x00, - 0x8a, - 0x07, - 0x00, - 0x00, - 0x02, - 0x90, - 0x00, - 0x8a, - 0x07, - 0x00, - 0x00, - 0x8a, - 0x09, - 0x00, - 0x00, - 0x81, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x02, - 0x00, - 0x03, - 0x00, - 0x04, - 0x00, - 0x05, - 0x00, - 0x02, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x08, - 0x00, - 0x09, - 0x00, - 0x0a, - 0x00, - 0x0b, - 0x00, - 0x0c, - 0x00, - 0x04, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x11, - 0x00, - 0x12, - 0x00, - 0x0f, - 0x00, - 0x13, - 0x00, - 0x14, - 0x00, - 0x02, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x17, - 0x00, - 0x02, - 0x00, - 0x18, - 0x00, - 0x19, - 0x00, - 0x1a, - 0x00, - 0x1b, - 0x00, - 0x1c, - 0x00, - 0x1d, - 0x00, - 0x1e, - 0x00, - 0x1f, - 0x00, - 0x20, - 0x00, - 0x21, - 0x00, - 0x22, - 0x00, - 0x23, - 0x00, - 0x24, - 0x00, - 0x25, - 0x00, - 0x26, - 0x00, - 0x27, - 0x00, - 0x28, - 0x00, - 0x29, - 0x00, - 0x2a, - 0x00, - 0x2b, - 0x00, - 0x2c, - 0x00, - 0x2d, - 0x00, - 0x2e, - 0x00, - 0x2f, - 0x00, - 0x30, - 0x00, - 0x31, - 0x00, - 0x32, - 0x00, - 0x33, - 0x00, - 0x34, - 0x00, - 0x35, - 0x00, - 0x36, - 0x00, - 0x37, - 0x00, - 0x38, - 0x00, - 0x39, - 0x00, - 0x3a, - 0x00, - 0x3b, - 0x00, - 0x3c, - 0x00, - 0x3d, - 0x00, - 0x3e, - 0x00, - 0x3f, - 0x00, - 0x40, - 0x00, - 0x41, - 0x00, - 0x42, - 0x00, - 0x43, - 0x00, - 0x44, - 0x00, - 0x45, - 0x00, - 0x46, - 0x00, - 0x47, - 0x00, - 0x48, - 0x00, - 0x49, - 0x00, - 0x4a, - 0x00, - 0x4b, - 0x00, - 0x4c, - 0x00, - 0x4d, - 0x00, - 0x4e, - 0x00, - 0x4f, - 0x00, - 0x50, - 0x00, - 0x51, - 0x00, - 0x52, - 0x00, - 0x53, - 0x00, - 0x54, - 0x00, - 0x55, - 0x00, - 0x56, - 0x00, - 0x57, - 0x00, - 0x58, - 0x00, - 0x59, - 0x00, - 0x5a, - 0x00, - 0x5b, - 0x00, - 0x5c, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x5f, - 0x00, - 0x60, - 0x00, - 0x61, - 0x00, - 0x62, - 0x00, - 0x63, - 0x00, - 0x64, - 0x00, - 0x65, - 0x00, - 0x66, - 0x00, - 0x02, - 0x00, - 0x67, - 0x00, - 0x02, - 0x00, - 0x68, - 0x00, - 0x69, - 0x00, - 0x6a, - 0x00, - 0x02, - 0x00, - 0x6b, - 0x00, - 0x69, - 0x00, - 0x6c, - 0x00, - 0x6d, - 0x00, - 0x6e, - 0x00, - 0x6f, - 0x00, - 0x70, - 0x00, - 0x71, - 0x00, - 0x72, - 0x00, - 0x73, - 0x00, - 0x74, - 0x00, - 0x75, - 0x00, - 0x76, - 0x00, - 0x69, - 0x00, - 0x16, - 0x02, - 0x00, - 0x00, - 0x19, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x77, - 0x00, - 0x78, - 0x00, - 0x79, - 0x00, - 0x02, - 0x00, - 0x7a, - 0x00, - 0x7b, - 0x00, - 0x7c, - 0x00, - 0x7d, - 0x00, - 0x7e, - 0x00, - 0x7f, - 0x00, - 0x04, - 0x00, - 0x80, - 0x00, - 0x81, - 0x00, - 0x82, - 0x00, - 0x83, - 0x00, - 0x02, - 0x00, - 0x84, - 0x00, - 0x85, - 0x00, - 0x86, - 0x00, - 0x87, - 0x00, - 0x66, - 0x00, - 0x02, - 0x00, - 0x88, - 0x00, - 0x69, - 0x00, - 0x51, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x77, - 0x00, - 0x78, - 0x00, - 0x66, - 0x00, - 0x02, - 0x00, - 0x69, - 0x00, - 0x9b, - 0x0c, - 0x00, - 0x00, - 0xa0, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x77, - 0x00, - 0x78, - 0x00, - 0x79, - 0x00, - 0x02, - 0x00, - 0x7a, - 0x00, - 0x7b, - 0x00, - 0x7c, - 0x00, - 0x7d, - 0x00, - 0x7e, - 0x00, - 0x7f, - 0x00, - 0x04, - 0x00, - 0x89, - 0x00, - 0x8a, - 0x00, - 0x8b, - 0x00, - 0x17, - 0x00, - 0x02, - 0x00, - 0x84, - 0x00, - 0x8c, - 0x00, - 0x8d, - 0x00, - 0x8e, - 0x00, - 0x8f, - 0x00, - 0x90, - 0x00, - 0x91, - 0x00, - 0x92, - 0x00, - 0x93, - 0x00, - 0x94, - 0x00, - 0x95, - 0x00, - 0x96, - 0x00, - 0x97, - 0x00, - 0x98, - 0x00, - 0x99, - 0x00, - 0x9a, - 0x00, - 0x9b, - 0x00, - 0x9c, - 0x00, - 0x9d, - 0x00, - 0x9e, - 0x00, - 0x9f, - 0x00, - 0xa0, - 0x00, - 0xa1, - 0x00, - 0xa2, - 0x00, - 0xa3, - 0x00, - 0xa4, - 0x00, - 0xa5, - 0x00, - 0xa6, - 0x00, - 0xa7, - 0x00, - 0xa8, - 0x00, - 0xa9, - 0x00, - 0xaa, - 0x00, - 0xab, - 0x00, - 0xac, - 0x00, - 0xad, - 0x00, - 0xae, - 0x00, - 0xaf, - 0x00, - 0xb0, - 0x00, - 0xb1, - 0x00, - 0xb2, - 0x00, - 0xb3, - 0x00, - 0xb4, - 0x00, - 0xb5, - 0x00, - 0xb6, - 0x00, - 0xb7, - 0x00, - 0xb8, - 0x00, - 0xb9, - 0x00, - 0xba, - 0x00, - 0xbb, - 0x00, - 0xbc, - 0x00, - 0xbd, - 0x00, - 0xbe, - 0x00, - 0xbf, - 0x00, - 0xc0, - 0x00, - 0xc1, - 0x00, - 0xc2, - 0x00, - 0xc3, - 0x00, - 0xc4, - 0x00, - 0xc5, - 0x00, - 0xc6, - 0x00, - 0xc7, - 0x00, - 0xc8, - 0x00, - 0xc9, - 0x00, - 0xca, - 0x00, - 0xcb, - 0x00, - 0xcc, - 0x00, - 0xcd, - 0x00, - 0xce, - 0x00, - 0xcf, - 0x00, - 0xd0, - 0x00, - 0xd1, - 0x00, - 0xd2, - 0x00, - 0xd3, - 0x00, - 0x61, - 0x00, - 0x83, - 0x00, - 0x02, - 0x00, - 0x84, - 0x00, - 0x85, - 0x00, - 0x86, - 0x00, - 0xd4, - 0x00, - 0xd5, - 0x00, - 0x87, - 0x00, - 0xd6, - 0x00, - 0x02, - 0x00, - 0xd7, - 0x00, - 0xd8, - 0x00, - 0x02, - 0x00, - 0xd9, - 0x00, - 0x69, - 0x00, - 0xda, - 0x00, - 0xdb, - 0x00, - 0xdc, - 0x00, - 0x02, - 0x00, - 0xdd, - 0x00, - 0x69, - 0x00, - 0x6a, - 0x00, - 0x02, - 0x00, - 0xde, - 0x00, - 0x69, - 0x00, - 0xdf, - 0x00, - 0xe0, - 0x00, - 0xe1, - 0x00, - 0xe2, - 0x00, - 0xe3, - 0x00, - 0x02, - 0x00, - 0xe4, - 0x00, - 0xe5, - 0x00, - 0xe6, - 0x00, - 0xe7, - 0x00, - 0x69, - 0x00, - 0x6a, - 0x00, - 0x02, - 0x00, - 0xe8, - 0x00, - 0x69, - 0x00, - 0xe9, - 0x00, - 0xea, - 0x00, - 0xeb, - 0x00, - 0x02, - 0x00, - 0xec, - 0x00, - 0xed, - 0x00, - 0xee, - 0x00, - 0xef, - 0x00, - 0xf0, - 0x00, - 0x69, - 0x00, - 0x6a, - 0x00, - 0x02, - 0x00, - 0xf1, - 0x00, - 0x69, - 0x00, - 0xf2, - 0x00, - 0xf3, - 0x00, - 0xf4, - 0x00, - 0xf5, - 0x00, - 0xf6, - 0x00, - 0xd9, - 0x00, - 0x69, - 0x00, - 0x66, - 0x00, - 0x02, - 0x00, - 0xf7, - 0x00, - 0xf8, - 0x00, - 0xf9, - 0x00, - 0xfa, - 0x00, - 0xfb, - 0x00, - 0x69, - 0x00, - 0xec, - 0x02, - 0x00, - 0x00, - 0x1d, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x77, - 0x00, - 0x78, - 0x00, - 0x05, - 0x00, - 0x02, - 0x00, - 0xfc, - 0x00, - 0xfd, - 0x00, - 0xfe, - 0x00, - 0xff, - 0x00, - 0x00, - 0x01, - 0x01, - 0x01, - 0x02, - 0x01, - 0x04, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x03, - 0x01, - 0x14, - 0x00, - 0x02, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x04, - 0x01, - 0x05, - 0x01, - 0x66, - 0x00, - 0x02, - 0x00, - 0x06, - 0x01, - 0x07, - 0x01, - 0x69, - 0x00, - 0x91, - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x77, - 0x00, - 0x78, - 0x00, - 0x87, - 0x00, - 0x66, - 0x00, - 0x02, - 0x00, - 0x08, - 0x01, - 0x69, - 0x00, - 0x48, - 0x0c, - 0x00, - 0x00, - 0x90, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x09, - 0x01, - 0x01, - 0x00, - 0x02, - 0x00, - 0x03, - 0x00, - 0x04, - 0x00, - 0x05, - 0x00, - 0x02, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x08, - 0x00, - 0x09, - 0x00, - 0x0a, - 0x00, - 0x0b, - 0x00, - 0x0c, - 0x00, - 0x04, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x0a, - 0x01, - 0x0b, - 0x01, - 0x0f, - 0x00, - 0x0c, - 0x01, - 0x11, - 0x00, - 0x12, - 0x00, - 0x0f, - 0x00, - 0x13, - 0x00, - 0x14, - 0x00, - 0x02, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x17, - 0x00, - 0x02, - 0x00, - 0x18, - 0x00, - 0x19, - 0x00, - 0x1a, - 0x00, - 0x1b, - 0x00, - 0x1c, - 0x00, - 0x1d, - 0x00, - 0x1e, - 0x00, - 0x1f, - 0x00, - 0x20, - 0x00, - 0x21, - 0x00, - 0x22, - 0x00, - 0x23, - 0x00, - 0x24, - 0x00, - 0x25, - 0x00, - 0x26, - 0x00, - 0x27, - 0x00, - 0x28, - 0x00, - 0x29, - 0x00, - 0x2a, - 0x00, - 0x2b, - 0x00, - 0x2c, - 0x00, - 0x2d, - 0x00, - 0x2e, - 0x00, - 0x2f, - 0x00, - 0x30, - 0x00, - 0x31, - 0x00, - 0x32, - 0x00, - 0x33, - 0x00, - 0x34, - 0x00, - 0x35, - 0x00, - 0x36, - 0x00, - 0x37, - 0x00, - 0x38, - 0x00, - 0x39, - 0x00, - 0x3a, - 0x00, - 0x3b, - 0x00, - 0x3c, - 0x00, - 0x3d, - 0x00, - 0x3e, - 0x00, - 0x3f, - 0x00, - 0x40, - 0x00, - 0x41, - 0x00, - 0x42, - 0x00, - 0x43, - 0x00, - 0x44, - 0x00, - 0x45, - 0x00, - 0x46, - 0x00, - 0x47, - 0x00, - 0x48, - 0x00, - 0x49, - 0x00, - 0x4a, - 0x00, - 0x4b, - 0x00, - 0x4c, - 0x00, - 0x4d, - 0x00, - 0x4e, - 0x00, - 0x4f, - 0x00, - 0x50, - 0x00, - 0x51, - 0x00, - 0x52, - 0x00, - 0x53, - 0x00, - 0x54, - 0x00, - 0x55, - 0x00, - 0x56, - 0x00, - 0x57, - 0x00, - 0x58, - 0x00, - 0x59, - 0x00, - 0x5a, - 0x00, - 0x5b, - 0x00, - 0x5c, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x5f, - 0x00, - 0x60, - 0x00, - 0x61, - 0x00, - 0x63, - 0x00, - 0x62, - 0x00, - 0x64, - 0x00, - 0x65, - 0x00, - 0x66, - 0x00, - 0x02, - 0x00, - 0x67, - 0x00, - 0x02, - 0x00, - 0x68, - 0x00, - 0x69, - 0x00, - 0x6a, - 0x00, - 0x02, - 0x00, - 0x6b, - 0x00, - 0x69, - 0x00, - 0x0d, - 0x01, - 0x0e, - 0x01, - 0x0f, - 0x01, - 0x10, - 0x01, - 0x11, - 0x01, - 0x12, - 0x01, - 0x13, - 0x01, - 0x14, - 0x01, - 0x15, - 0x01, - 0x16, - 0x01, - 0x17, - 0x01, - 0x18, - 0x01, - 0x19, - 0x01, - 0x1a, - 0x01, - 0x1b, - 0x01, - 0x1c, - 0x01, - 0x1d, - 0x01, - 0x1e, - 0x01, - 0x1f, - 0x01, - 0x20, - 0x01, - 0x21, - 0x01, - 0x69, - 0x00, - 0xca, - 0x08, - 0x00, - 0x00, - 0x82, - 0x00, - 0x00, - 0x00, - 0x22, - 0x01, - 0x23, - 0x01, - 0x01, - 0x00, - 0x02, - 0x00, - 0x03, - 0x00, - 0x04, - 0x00, - 0x05, - 0x00, - 0x02, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x08, - 0x00, - 0x09, - 0x00, - 0x0a, - 0x00, - 0x0b, - 0x00, - 0x0c, - 0x00, - 0x04, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x11, - 0x00, - 0x12, - 0x00, - 0x0f, - 0x00, - 0x13, - 0x00, - 0x14, - 0x00, - 0x02, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x17, - 0x00, - 0x02, - 0x00, - 0x18, - 0x00, - 0x19, - 0x00, - 0x1a, - 0x00, - 0x1b, - 0x00, - 0x1c, - 0x00, - 0x1d, - 0x00, - 0x1e, - 0x00, - 0x1f, - 0x00, - 0x20, - 0x00, - 0x21, - 0x00, - 0x22, - 0x00, - 0x23, - 0x00, - 0x24, - 0x00, - 0x25, - 0x00, - 0x26, - 0x00, - 0x9a, - 0x00, - 0x9b, - 0x00, - 0x9c, - 0x00, - 0x2a, - 0x00, - 0x2b, - 0x00, - 0x2c, - 0x00, - 0x2d, - 0x00, - 0xa1, - 0x00, - 0xa2, - 0x00, - 0xa3, - 0x00, - 0xa4, - 0x00, - 0xa5, - 0x00, - 0xa6, - 0x00, - 0xa7, - 0x00, - 0xa8, - 0x00, - 0xa9, - 0x00, - 0xaa, - 0x00, - 0xab, - 0x00, - 0x39, - 0x00, - 0xad, - 0x00, - 0xae, - 0x00, - 0xaf, - 0x00, - 0x3d, - 0x00, - 0xb1, - 0x00, - 0xb2, - 0x00, - 0x40, - 0x00, - 0xb4, - 0x00, - 0xb5, - 0x00, - 0x43, - 0x00, - 0xb7, - 0x00, - 0xb8, - 0x00, - 0xb9, - 0x00, - 0xba, - 0x00, - 0x48, - 0x00, - 0x49, - 0x00, - 0xbd, - 0x00, - 0x4b, - 0x00, - 0x4c, - 0x00, - 0x4d, - 0x00, - 0xc1, - 0x00, - 0xc2, - 0x00, - 0x50, - 0x00, - 0xc4, - 0x00, - 0x52, - 0x00, - 0x53, - 0x00, - 0x54, - 0x00, - 0x55, - 0x00, - 0x56, - 0x00, - 0xca, - 0x00, - 0xcb, - 0x00, - 0xcc, - 0x00, - 0xcd, - 0x00, - 0x5b, - 0x00, - 0xcf, - 0x00, - 0xd0, - 0x00, - 0xd1, - 0x00, - 0xd2, - 0x00, - 0xd3, - 0x00, - 0x61, - 0x00, - 0x62, - 0x00, - 0x24, - 0x01, - 0x25, - 0x01, - 0x26, - 0x01, - 0x66, - 0x00, - 0x02, - 0x00, - 0x67, - 0x00, - 0x02, - 0x00, - 0x68, - 0x00, - 0x69, - 0x00, - 0x6a, - 0x00, - 0x02, - 0x00, - 0x6b, - 0x00, - 0x69, - 0x00, - 0x27, - 0x01, - 0x28, - 0x01, - 0x29, - 0x01, - 0x2a, - 0x01, - 0x70, - 0x00, - 0x71, - 0x00, - 0x72, - 0x00, - 0x2b, - 0x01, - 0x74, - 0x00, - 0x75, - 0x00, - 0x76, - 0x00, - 0x69, - 0x00, - 0x11, - 0x02, - 0x00, - 0x00, - 0x18, - 0x00, - 0x00, - 0x00, - 0x22, - 0x01, - 0x23, - 0x01, - 0x79, - 0x00, - 0x02, - 0x00, - 0x7a, - 0x00, - 0x7b, - 0x00, - 0x7c, - 0x00, - 0x7d, - 0x00, - 0x7e, - 0x00, - 0x7f, - 0x00, - 0x04, - 0x00, - 0x80, - 0x00, - 0x81, - 0x00, - 0x82, - 0x00, - 0x83, - 0x00, - 0x02, - 0x00, - 0x18, - 0x00, - 0x85, - 0x00, - 0x86, - 0x00, - 0x87, - 0x00, - 0x66, - 0x00, - 0x02, - 0x00, - 0x88, - 0x00, - 0x69, - 0x00, - 0x52, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x00, - 0x00, - 0x22, - 0x01, - 0x23, - 0x01, - 0x66, - 0x00, - 0x02, - 0x00, - 0x69, - 0x00, - 0xbf, - 0x0a, - 0x00, - 0x00, - 0x97, - 0x00, - 0x00, - 0x00, - 0x22, - 0x01, - 0x23, - 0x01, - 0x79, - 0x00, - 0x02, - 0x00, - 0x7a, - 0x00, - 0x7b, - 0x00, - 0x7c, - 0x00, - 0x7d, - 0x00, - 0x7e, - 0x00, - 0x7f, - 0x00, - 0x04, - 0x00, - 0x89, - 0x00, - 0x8a, - 0x00, - 0x8b, - 0x00, - 0x17, - 0x00, - 0x02, - 0x00, - 0x18, - 0x00, - 0x19, - 0x00, - 0x1a, - 0x00, - 0x1b, - 0x00, - 0x1c, - 0x00, - 0x1d, - 0x00, - 0x1e, - 0x00, - 0x1f, - 0x00, - 0x20, - 0x00, - 0x21, - 0x00, - 0x22, - 0x00, - 0x23, - 0x00, - 0x24, - 0x00, - 0x25, - 0x00, - 0x26, - 0x00, - 0x9a, - 0x00, - 0x9b, - 0x00, - 0x9c, - 0x00, - 0x2a, - 0x00, - 0x2b, - 0x00, - 0x2c, - 0x00, - 0x2d, - 0x00, - 0xa1, - 0x00, - 0xa2, - 0x00, - 0xa3, - 0x00, - 0xa4, - 0x00, - 0xa5, - 0x00, - 0xa6, - 0x00, - 0xa7, - 0x00, - 0xa8, - 0x00, - 0xa9, - 0x00, - 0xaa, - 0x00, - 0xab, - 0x00, - 0x39, - 0x00, - 0xad, - 0x00, - 0xae, - 0x00, - 0xaf, - 0x00, - 0x3d, - 0x00, - 0xb1, - 0x00, - 0xb2, - 0x00, - 0x40, - 0x00, - 0xb4, - 0x00, - 0xb5, - 0x00, - 0x43, - 0x00, - 0xb7, - 0x00, - 0xb8, - 0x00, - 0xb9, - 0x00, - 0xba, - 0x00, - 0x48, - 0x00, - 0x49, - 0x00, - 0xbd, - 0x00, - 0x4b, - 0x00, - 0x4c, - 0x00, - 0x4d, - 0x00, - 0xc1, - 0x00, - 0xc2, - 0x00, - 0x50, - 0x00, - 0xc4, - 0x00, - 0x52, - 0x00, - 0x53, - 0x00, - 0x54, - 0x00, - 0x55, - 0x00, - 0x56, - 0x00, - 0xca, - 0x00, - 0xcb, - 0x00, - 0xcc, - 0x00, - 0xcd, - 0x00, - 0x5b, - 0x00, - 0xcf, - 0x00, - 0xd0, - 0x00, - 0xd1, - 0x00, - 0xd2, - 0x00, - 0xd3, - 0x00, - 0x61, - 0x00, - 0x83, - 0x00, - 0x02, - 0x00, - 0x18, - 0x00, - 0x85, - 0x00, - 0x86, - 0x00, - 0x2c, - 0x01, - 0x2d, - 0x01, - 0x87, - 0x00, - 0x2e, - 0x01, - 0x02, - 0x00, - 0x2f, - 0x01, - 0xd8, - 0x00, - 0x02, - 0x00, - 0xd9, - 0x00, - 0x69, - 0x00, - 0x30, - 0x01, - 0x31, - 0x01, - 0xdc, - 0x00, - 0x02, - 0x00, - 0xdd, - 0x00, - 0x69, - 0x00, - 0x6a, - 0x00, - 0x02, - 0x00, - 0xde, - 0x00, - 0x69, - 0x00, - 0x32, - 0x01, - 0xe2, - 0x00, - 0xe3, - 0x00, - 0x02, - 0x00, - 0x33, - 0x01, - 0x34, - 0x01, - 0x69, - 0x00, - 0x6a, - 0x00, - 0x02, - 0x00, - 0xe8, - 0x00, - 0x69, - 0x00, - 0xe9, - 0x00, - 0xea, - 0x00, - 0xeb, - 0x00, - 0x02, - 0x00, - 0x35, - 0x01, - 0x69, - 0x00, - 0x6a, - 0x00, - 0x02, - 0x00, - 0xf1, - 0x00, - 0x69, - 0x00, - 0xf2, - 0x00, - 0xf3, - 0x00, - 0xf4, - 0x00, - 0xf5, - 0x00, - 0xf6, - 0x00, - 0xd9, - 0x00, - 0x69, - 0x00, - 0x66, - 0x00, - 0x02, - 0x00, - 0xf7, - 0x00, - 0xf8, - 0x00, - 0x36, - 0x01, - 0xfa, - 0x00, - 0xfb, - 0x00, - 0x69, - 0x00, - 0xcc, - 0x02, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0x22, - 0x01, - 0x23, - 0x01, - 0x05, - 0x00, - 0x02, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x08, - 0x00, - 0x09, - 0x00, - 0x0a, - 0x00, - 0x0b, - 0x00, - 0x0c, - 0x00, - 0x04, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x03, - 0x01, - 0x14, - 0x00, - 0x02, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x37, - 0x01, - 0x38, - 0x01, - 0x66, - 0x00, - 0x02, - 0x00, - 0x06, - 0x01, - 0x07, - 0x01, - 0x69, - 0x00, - 0x92, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x22, - 0x01, - 0x23, - 0x01, - 0x87, - 0x00, - 0x66, - 0x00, - 0x02, - 0x00, - 0x08, - 0x01, - 0x69, - 0x00, - 0x66, - 0x0b, - 0x00, - 0x00, - 0x90, - 0x00, - 0x00, - 0x00, - 0x22, - 0x01, - 0x23, - 0x01, - 0x01, - 0x00, - 0x02, - 0x00, - 0x03, - 0x00, - 0x04, - 0x00, - 0x05, - 0x00, - 0x02, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x08, - 0x00, - 0x09, - 0x00, - 0x0a, - 0x00, - 0x0b, - 0x00, - 0x0c, - 0x00, - 0x04, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x0a, - 0x01, - 0x0b, - 0x01, - 0x0f, - 0x00, - 0x0c, - 0x01, - 0x11, - 0x00, - 0x12, - 0x00, - 0x0f, - 0x00, - 0x13, - 0x00, - 0x14, - 0x00, - 0x02, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x17, - 0x00, - 0x02, - 0x00, - 0x18, - 0x00, - 0x19, - 0x00, - 0x1a, - 0x00, - 0x1b, - 0x00, - 0x1c, - 0x00, - 0x1d, - 0x00, - 0x1e, - 0x00, - 0x1f, - 0x00, - 0x20, - 0x00, - 0x21, - 0x00, - 0x22, - 0x00, - 0x23, - 0x00, - 0x24, - 0x00, - 0x25, - 0x00, - 0x26, - 0x00, - 0x9a, - 0x00, - 0x9b, - 0x00, - 0x9c, - 0x00, - 0x2a, - 0x00, - 0x2b, - 0x00, - 0x2c, - 0x00, - 0x2d, - 0x00, - 0xa1, - 0x00, - 0xa2, - 0x00, - 0xa3, - 0x00, - 0xa4, - 0x00, - 0xa5, - 0x00, - 0xa6, - 0x00, - 0xa7, - 0x00, - 0xa8, - 0x00, - 0xa9, - 0x00, - 0xaa, - 0x00, - 0xab, - 0x00, - 0x39, - 0x00, - 0xad, - 0x00, - 0xae, - 0x00, - 0xaf, - 0x00, - 0x3d, - 0x00, - 0xb1, - 0x00, - 0xb2, - 0x00, - 0x40, - 0x00, - 0xb4, - 0x00, - 0xb5, - 0x00, - 0x43, - 0x00, - 0xb7, - 0x00, - 0xb8, - 0x00, - 0xb9, - 0x00, - 0xba, - 0x00, - 0x48, - 0x00, - 0x49, - 0x00, - 0xbd, - 0x00, - 0x4b, - 0x00, - 0x4c, - 0x00, - 0x4d, - 0x00, - 0xc1, - 0x00, - 0xc2, - 0x00, - 0x50, - 0x00, - 0xc4, - 0x00, - 0x52, - 0x00, - 0x53, - 0x00, - 0x54, - 0x00, - 0x55, - 0x00, - 0x56, - 0x00, - 0xca, - 0x00, - 0xcb, - 0x00, - 0xcc, - 0x00, - 0xcd, - 0x00, - 0x5b, - 0x00, - 0xcf, - 0x00, - 0xd0, - 0x00, - 0xd1, - 0x00, - 0xd2, - 0x00, - 0xd3, - 0x00, - 0x61, - 0x00, - 0x24, - 0x01, - 0x62, - 0x00, - 0x25, - 0x01, - 0x26, - 0x01, - 0x66, - 0x00, - 0x02, - 0x00, - 0x67, - 0x00, - 0x02, - 0x00, - 0x68, - 0x00, - 0x69, - 0x00, - 0x6a, - 0x00, - 0x02, - 0x00, - 0x6b, - 0x00, - 0x69, - 0x00, - 0x39, - 0x01, - 0x3a, - 0x01, - 0x3b, - 0x01, - 0x3c, - 0x01, - 0x3d, - 0x01, - 0x3e, - 0x01, - 0x3f, - 0x01, - 0x40, - 0x01, - 0x41, - 0x01, - 0x42, - 0x01, - 0x43, - 0x01, - 0x44, - 0x01, - 0x45, - 0x01, - 0x46, - 0x01, - 0x47, - 0x01, - 0x48, - 0x01, - 0x49, - 0x01, - 0x4a, - 0x01, - 0x4b, - 0x01, - 0x4c, - 0x01, - 0x4d, - 0x01, - 0x69, - 0x00, - 0x4c, - 0x54, - 0x45, - 0x4d, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0xc4, - 0x08, - 0x00, - 0x00, - 0x12, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x86, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x01, - 0x96, - 0x01, - 0x00, - 0x00, - 0x01, - 0x10, - 0x00, - 0x86, - 0x00, - 0x00, - 0x00, - 0x01, - 0x10, - 0x01, - 0xcc, - 0x01, - 0x00, - 0x00, - 0x01, - 0x20, - 0x01, - 0xe6, - 0x01, - 0x00, - 0x00, - 0x01, - 0x30, - 0x01, - 0x4e, - 0x03, - 0x00, - 0x00, - 0x01, - 0x44, - 0x01, - 0xb2, - 0x03, - 0x00, - 0x00, - 0x01, - 0x80, - 0x00, - 0xdc, - 0x03, - 0x00, - 0x00, - 0x01, - 0x90, - 0x00, - 0xdc, - 0x03, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x16, - 0x05, - 0x00, - 0x00, - 0x02, - 0x00, - 0x01, - 0x96, - 0x01, - 0x00, - 0x00, - 0x02, - 0x10, - 0x00, - 0x16, - 0x05, - 0x00, - 0x00, - 0x02, - 0x10, - 0x01, - 0xcc, - 0x01, - 0x00, - 0x00, - 0x02, - 0x20, - 0x01, - 0x26, - 0x06, - 0x00, - 0x00, - 0x02, - 0x30, - 0x01, - 0x4e, - 0x03, - 0x00, - 0x00, - 0x02, - 0x44, - 0x01, - 0xb2, - 0x03, - 0x00, - 0x00, - 0x02, - 0x80, - 0x00, - 0x8a, - 0x07, - 0x00, - 0x00, - 0x02, - 0x90, - 0x00, - 0x8a, - 0x07, - 0x00, - 0x00, - 0xea, - 0x0d, - 0x00, - 0x00, - 0x84, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x4f, - 0x01, - 0x50, - 0x01, - 0x51, - 0x01, - 0x50, - 0x01, - 0x05, - 0x00, - 0x02, - 0x00, - 0x52, - 0x01, - 0x53, - 0x01, - 0x54, - 0x01, - 0x55, - 0x01, - 0x56, - 0x01, - 0x57, - 0x01, - 0x58, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x59, - 0x01, - 0x50, - 0x01, - 0x5a, - 0x01, - 0x02, - 0x00, - 0x5b, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0x5c, - 0x01, - 0x02, - 0x00, - 0x5d, - 0x01, - 0x5e, - 0x01, - 0x5f, - 0x01, - 0x60, - 0x01, - 0x61, - 0x01, - 0x62, - 0x01, - 0x63, - 0x01, - 0x64, - 0x01, - 0x65, - 0x01, - 0x66, - 0x01, - 0x67, - 0x01, - 0x68, - 0x01, - 0x69, - 0x01, - 0x6a, - 0x01, - 0x6b, - 0x01, - 0x6c, - 0x01, - 0x6d, - 0x01, - 0x6e, - 0x01, - 0x6f, - 0x01, - 0x70, - 0x01, - 0x71, - 0x01, - 0x72, - 0x01, - 0x73, - 0x01, - 0x74, - 0x01, - 0x75, - 0x01, - 0x76, - 0x01, - 0x77, - 0x01, - 0x78, - 0x01, - 0x79, - 0x01, - 0x7a, - 0x01, - 0x7b, - 0x01, - 0x7c, - 0x01, - 0x7d, - 0x01, - 0x7e, - 0x01, - 0x7f, - 0x01, - 0x80, - 0x01, - 0x81, - 0x01, - 0x82, - 0x01, - 0x83, - 0x01, - 0x84, - 0x01, - 0x85, - 0x01, - 0x86, - 0x01, - 0x87, - 0x01, - 0x88, - 0x01, - 0x89, - 0x01, - 0x8a, - 0x01, - 0x8b, - 0x01, - 0x8c, - 0x01, - 0x8d, - 0x01, - 0x8e, - 0x01, - 0x8f, - 0x01, - 0x90, - 0x01, - 0x91, - 0x01, - 0x92, - 0x01, - 0x93, - 0x01, - 0x94, - 0x01, - 0x95, - 0x01, - 0x96, - 0x01, - 0x97, - 0x01, - 0x98, - 0x01, - 0x99, - 0x01, - 0x9a, - 0x01, - 0x9b, - 0x01, - 0x9c, - 0x01, - 0x9d, - 0x01, - 0x9e, - 0x01, - 0x9f, - 0x01, - 0xa0, - 0x01, - 0xa1, - 0x01, - 0xa2, - 0x01, - 0xa3, - 0x01, - 0xa4, - 0x01, - 0xa5, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xa6, - 0x01, - 0x02, - 0x00, - 0xa7, - 0x01, - 0xa8, - 0x01, - 0xa9, - 0x01, - 0xaa, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xab, - 0x01, - 0x02, - 0x00, - 0xac, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xad, - 0x01, - 0x02, - 0x00, - 0xae, - 0x01, - 0xaf, - 0x01, - 0xb0, - 0x01, - 0xb1, - 0x01, - 0xb2, - 0x01, - 0xb3, - 0x01, - 0xb4, - 0x01, - 0xb5, - 0x01, - 0xb6, - 0x01, - 0xb7, - 0x01, - 0xb8, - 0x01, - 0xb9, - 0x01, - 0x69, - 0x00, - 0x50, - 0x01, - 0x92, - 0x01, - 0x00, - 0x00, - 0x17, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x4f, - 0x01, - 0x50, - 0x01, - 0x51, - 0x01, - 0x50, - 0x01, - 0xba, - 0x01, - 0x02, - 0x00, - 0xbb, - 0x01, - 0xbc, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xa6, - 0x01, - 0x02, - 0x00, - 0xbd, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xbe, - 0x01, - 0x02, - 0x00, - 0xae, - 0x01, - 0xbf, - 0x01, - 0xb9, - 0x01, - 0x69, - 0x00, - 0x50, - 0x01, - 0x64, - 0x00, - 0x00, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x4f, - 0x01, - 0x50, - 0x01, - 0x51, - 0x01, - 0x50, - 0x01, - 0xc0, - 0x01, - 0x02, - 0x00, - 0x69, - 0x00, - 0x50, - 0x01, - 0x6a, - 0x16, - 0x00, - 0x00, - 0xb0, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x4f, - 0x01, - 0x50, - 0x01, - 0x51, - 0x01, - 0x50, - 0x01, - 0x5c, - 0x01, - 0x02, - 0x00, - 0x5d, - 0x01, - 0x5e, - 0x01, - 0x5f, - 0x01, - 0x60, - 0x01, - 0x61, - 0x01, - 0x62, - 0x01, - 0x63, - 0x01, - 0x64, - 0x01, - 0x65, - 0x01, - 0x66, - 0x01, - 0x67, - 0x01, - 0x68, - 0x01, - 0x69, - 0x01, - 0x6a, - 0x01, - 0x6b, - 0x01, - 0x6c, - 0x01, - 0x6d, - 0x01, - 0x6e, - 0x01, - 0x6f, - 0x01, - 0x70, - 0x01, - 0x71, - 0x01, - 0x72, - 0x01, - 0x73, - 0x01, - 0x74, - 0x01, - 0x75, - 0x01, - 0x76, - 0x01, - 0x77, - 0x01, - 0x78, - 0x01, - 0x79, - 0x01, - 0x7a, - 0x01, - 0x7b, - 0x01, - 0x7c, - 0x01, - 0x7d, - 0x01, - 0x7e, - 0x01, - 0x7f, - 0x01, - 0x80, - 0x01, - 0x81, - 0x01, - 0x82, - 0x01, - 0x83, - 0x01, - 0x84, - 0x01, - 0x85, - 0x01, - 0x86, - 0x01, - 0x87, - 0x01, - 0x88, - 0x01, - 0x89, - 0x01, - 0x8a, - 0x01, - 0x8b, - 0x01, - 0x8c, - 0x01, - 0x8d, - 0x01, - 0x8e, - 0x01, - 0x8f, - 0x01, - 0x90, - 0x01, - 0x91, - 0x01, - 0x92, - 0x01, - 0x93, - 0x01, - 0x94, - 0x01, - 0x95, - 0x01, - 0x96, - 0x01, - 0x97, - 0x01, - 0x98, - 0x01, - 0x99, - 0x01, - 0x9a, - 0x01, - 0x9b, - 0x01, - 0x9c, - 0x01, - 0x9d, - 0x01, - 0x9e, - 0x01, - 0x9f, - 0x01, - 0xa0, - 0x01, - 0xa1, - 0x01, - 0xa2, - 0x01, - 0xa3, - 0x01, - 0xa4, - 0x01, - 0xa5, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xba, - 0x01, - 0x02, - 0x00, - 0xbb, - 0x01, - 0xbc, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xc1, - 0x01, - 0xc2, - 0x01, - 0xc3, - 0x01, - 0xc4, - 0x01, - 0xc5, - 0x01, - 0xc6, - 0x01, - 0xc7, - 0x01, - 0xc8, - 0x01, - 0xc9, - 0x01, - 0xca, - 0x01, - 0xcb, - 0x01, - 0xcc, - 0x01, - 0xcd, - 0x01, - 0xce, - 0x01, - 0xcf, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xa6, - 0x01, - 0x02, - 0x00, - 0xbd, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xab, - 0x01, - 0x02, - 0x00, - 0xa7, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xd0, - 0x01, - 0x02, - 0x00, - 0xae, - 0x01, - 0xd1, - 0x01, - 0xd2, - 0x01, - 0xd3, - 0x01, - 0xd4, - 0x01, - 0xd5, - 0x01, - 0xd6, - 0x01, - 0xd7, - 0x01, - 0xd8, - 0x01, - 0xd9, - 0x01, - 0xda, - 0x01, - 0xdb, - 0x01, - 0xdc, - 0x01, - 0xdd, - 0x01, - 0xde, - 0x01, - 0xdf, - 0x01, - 0xe0, - 0x01, - 0xd9, - 0x01, - 0xe1, - 0x01, - 0xdc, - 0x01, - 0xe2, - 0x01, - 0xd9, - 0x01, - 0xe3, - 0x01, - 0xdc, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe6, - 0x01, - 0xe7, - 0x01, - 0xd9, - 0x01, - 0xe8, - 0x01, - 0xe9, - 0x01, - 0xdc, - 0x01, - 0xe2, - 0x01, - 0xd9, - 0x01, - 0xea, - 0x01, - 0xdc, - 0x01, - 0xeb, - 0x01, - 0xec, - 0x01, - 0xed, - 0x01, - 0xd9, - 0x01, - 0xee, - 0x01, - 0xdc, - 0x01, - 0xe2, - 0x01, - 0xd9, - 0x01, - 0xef, - 0x01, - 0xdc, - 0x01, - 0xf0, - 0x01, - 0xf1, - 0x01, - 0xf2, - 0x01, - 0xf3, - 0x01, - 0xf4, - 0x01, - 0xf5, - 0x01, - 0xf6, - 0x01, - 0xf7, - 0x01, - 0xf8, - 0x01, - 0xf9, - 0x01, - 0xb9, - 0x01, - 0x69, - 0x00, - 0x50, - 0x01, - 0xbc, - 0x03, - 0x00, - 0x00, - 0x2e, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x4f, - 0x01, - 0x50, - 0x01, - 0x51, - 0x01, - 0x50, - 0x01, - 0x05, - 0x00, - 0x02, - 0x00, - 0x52, - 0x01, - 0x53, - 0x01, - 0x54, - 0x01, - 0x55, - 0x01, - 0x56, - 0x01, - 0x57, - 0x01, - 0x58, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x59, - 0x01, - 0x50, - 0x01, - 0x5a, - 0x01, - 0x02, - 0x00, - 0x5b, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xfa, - 0x01, - 0x50, - 0x01, - 0xa6, - 0x01, - 0x02, - 0x00, - 0xfb, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xab, - 0x01, - 0x02, - 0x00, - 0xa8, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xfc, - 0x01, - 0x02, - 0x00, - 0xae, - 0x01, - 0xfd, - 0x01, - 0xfe, - 0x01, - 0xb9, - 0x01, - 0x69, - 0x00, - 0x50, - 0x01, - 0xec, - 0x00, - 0x00, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x4f, - 0x01, - 0x50, - 0x01, - 0x51, - 0x01, - 0x50, - 0x01, - 0xa6, - 0x01, - 0x02, - 0x00, - 0xbd, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xff, - 0x01, - 0x02, - 0x00, - 0xae, - 0x01, - 0x00, - 0x02, - 0xb9, - 0x01, - 0x69, - 0x00, - 0x50, - 0x01, - 0x1a, - 0x12, - 0x00, - 0x00, - 0x99, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x4f, - 0x01, - 0x50, - 0x01, - 0x51, - 0x01, - 0x50, - 0x01, - 0x05, - 0x00, - 0x02, - 0x00, - 0x52, - 0x01, - 0x53, - 0x01, - 0x54, - 0x01, - 0x55, - 0x01, - 0x56, - 0x01, - 0x57, - 0x01, - 0x58, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x59, - 0x01, - 0x50, - 0x01, - 0x5a, - 0x01, - 0x02, - 0x00, - 0x5b, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0x01, - 0x02, - 0x02, - 0x02, - 0x50, - 0x01, - 0x5c, - 0x01, - 0x02, - 0x00, - 0x5d, - 0x01, - 0x5e, - 0x01, - 0x5f, - 0x01, - 0x60, - 0x01, - 0x61, - 0x01, - 0x62, - 0x01, - 0x63, - 0x01, - 0x64, - 0x01, - 0x65, - 0x01, - 0x66, - 0x01, - 0x67, - 0x01, - 0x68, - 0x01, - 0x69, - 0x01, - 0x6a, - 0x01, - 0x6b, - 0x01, - 0x6c, - 0x01, - 0x6d, - 0x01, - 0x6e, - 0x01, - 0x6f, - 0x01, - 0x70, - 0x01, - 0x71, - 0x01, - 0x72, - 0x01, - 0x73, - 0x01, - 0x74, - 0x01, - 0x75, - 0x01, - 0x76, - 0x01, - 0x77, - 0x01, - 0x78, - 0x01, - 0x79, - 0x01, - 0x7a, - 0x01, - 0x7b, - 0x01, - 0x7c, - 0x01, - 0x7d, - 0x01, - 0x7e, - 0x01, - 0x7f, - 0x01, - 0x80, - 0x01, - 0x81, - 0x01, - 0x82, - 0x01, - 0x83, - 0x01, - 0x84, - 0x01, - 0x85, - 0x01, - 0x86, - 0x01, - 0x87, - 0x01, - 0x88, - 0x01, - 0x89, - 0x01, - 0x8a, - 0x01, - 0x8b, - 0x01, - 0x8c, - 0x01, - 0x8d, - 0x01, - 0x8e, - 0x01, - 0x8f, - 0x01, - 0x90, - 0x01, - 0x91, - 0x01, - 0x92, - 0x01, - 0x93, - 0x01, - 0x94, - 0x01, - 0x95, - 0x01, - 0x96, - 0x01, - 0x97, - 0x01, - 0x98, - 0x01, - 0x99, - 0x01, - 0x9a, - 0x01, - 0x9b, - 0x01, - 0x9c, - 0x01, - 0x9d, - 0x01, - 0x9e, - 0x01, - 0x9f, - 0x01, - 0xa0, - 0x01, - 0xa1, - 0x01, - 0xa2, - 0x01, - 0xa3, - 0x01, - 0xa4, - 0x01, - 0xa5, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xa6, - 0x01, - 0x02, - 0x00, - 0xa7, - 0x01, - 0xa8, - 0x01, - 0xa9, - 0x01, - 0xaa, - 0x01, - 0x03, - 0x02, - 0x04, - 0x02, - 0x05, - 0x02, - 0x04, - 0x00, - 0x50, - 0x01, - 0xab, - 0x01, - 0x02, - 0x00, - 0xac, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xad, - 0x01, - 0x02, - 0x00, - 0xae, - 0x01, - 0xaf, - 0x01, - 0x06, - 0x02, - 0x07, - 0x02, - 0x08, - 0x02, - 0x09, - 0x02, - 0x0a, - 0x02, - 0x0b, - 0x02, - 0x0c, - 0x02, - 0x0d, - 0x02, - 0x0e, - 0x02, - 0x0f, - 0x02, - 0x10, - 0x02, - 0x11, - 0x02, - 0x12, - 0x02, - 0x13, - 0x02, - 0x14, - 0x02, - 0x15, - 0x02, - 0x16, - 0x02, - 0x17, - 0x02, - 0x18, - 0x02, - 0x19, - 0x02, - 0x1a, - 0x02, - 0x1b, - 0x02, - 0x1c, - 0x02, - 0x1d, - 0x02, - 0xb9, - 0x01, - 0x69, - 0x00, - 0x50, - 0x01, - 0xea, - 0x0d, - 0x00, - 0x00, - 0x84, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x4f, - 0x01, - 0x50, - 0x01, - 0x51, - 0x01, - 0x50, - 0x01, - 0x05, - 0x00, - 0x02, - 0x00, - 0x52, - 0x01, - 0x53, - 0x01, - 0x54, - 0x01, - 0x55, - 0x01, - 0x56, - 0x01, - 0x57, - 0x01, - 0x58, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x59, - 0x01, - 0x50, - 0x01, - 0x5a, - 0x01, - 0x02, - 0x00, - 0x5b, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0x5c, - 0x01, - 0x02, - 0x00, - 0x5d, - 0x01, - 0x5e, - 0x01, - 0x5f, - 0x01, - 0x60, - 0x01, - 0x61, - 0x01, - 0x62, - 0x01, - 0x63, - 0x01, - 0x64, - 0x01, - 0x65, - 0x01, - 0x66, - 0x01, - 0x67, - 0x01, - 0x68, - 0x01, - 0x69, - 0x01, - 0x6a, - 0x01, - 0x6b, - 0x01, - 0x6c, - 0x01, - 0x6d, - 0x01, - 0x6e, - 0x01, - 0x6f, - 0x01, - 0x70, - 0x01, - 0x71, - 0x01, - 0x72, - 0x01, - 0x73, - 0x01, - 0x74, - 0x01, - 0x75, - 0x01, - 0x76, - 0x01, - 0x77, - 0x01, - 0x78, - 0x01, - 0x79, - 0x01, - 0x7a, - 0x01, - 0x7b, - 0x01, - 0x7c, - 0x01, - 0x7d, - 0x01, - 0x7e, - 0x01, - 0x7f, - 0x01, - 0x80, - 0x01, - 0x81, - 0x01, - 0x82, - 0x01, - 0x83, - 0x01, - 0x84, - 0x01, - 0x85, - 0x01, - 0x86, - 0x01, - 0x87, - 0x01, - 0x88, - 0x01, - 0x89, - 0x01, - 0x8a, - 0x01, - 0x8b, - 0x01, - 0x8c, - 0x01, - 0x8d, - 0x01, - 0x8e, - 0x01, - 0x8f, - 0x01, - 0x90, - 0x01, - 0x91, - 0x01, - 0x92, - 0x01, - 0x93, - 0x01, - 0x94, - 0x01, - 0x95, - 0x01, - 0x96, - 0x01, - 0x97, - 0x01, - 0x98, - 0x01, - 0x99, - 0x01, - 0x9a, - 0x01, - 0x9b, - 0x01, - 0x9c, - 0x01, - 0x9d, - 0x01, - 0x9e, - 0x01, - 0x9f, - 0x01, - 0xa0, - 0x01, - 0xa1, - 0x01, - 0xa2, - 0x01, - 0xa3, - 0x01, - 0xa4, - 0x01, - 0xa5, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xa6, - 0x01, - 0x02, - 0x00, - 0xa7, - 0x01, - 0xa8, - 0x01, - 0xa9, - 0x01, - 0xaa, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xab, - 0x01, - 0x02, - 0x00, - 0xac, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xad, - 0x01, - 0x02, - 0x00, - 0xae, - 0x01, - 0xaf, - 0x01, - 0x1e, - 0x02, - 0x1f, - 0x02, - 0x20, - 0x02, - 0x21, - 0x02, - 0x22, - 0x02, - 0x23, - 0x02, - 0x24, - 0x02, - 0xb7, - 0x01, - 0xb8, - 0x01, - 0xb9, - 0x01, - 0x69, - 0x00, - 0x50, - 0x01, - 0x12, - 0x16, - 0x00, - 0x00, - 0xae, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x4f, - 0x01, - 0x50, - 0x01, - 0x51, - 0x01, - 0x50, - 0x01, - 0x5c, - 0x01, - 0x02, - 0x00, - 0x5d, - 0x01, - 0x5e, - 0x01, - 0x5f, - 0x01, - 0x60, - 0x01, - 0x61, - 0x01, - 0x62, - 0x01, - 0x63, - 0x01, - 0x64, - 0x01, - 0x65, - 0x01, - 0x66, - 0x01, - 0x67, - 0x01, - 0x68, - 0x01, - 0x69, - 0x01, - 0x6a, - 0x01, - 0x6b, - 0x01, - 0x6c, - 0x01, - 0x6d, - 0x01, - 0x6e, - 0x01, - 0x6f, - 0x01, - 0x70, - 0x01, - 0x71, - 0x01, - 0x72, - 0x01, - 0x73, - 0x01, - 0x74, - 0x01, - 0x75, - 0x01, - 0x76, - 0x01, - 0x77, - 0x01, - 0x78, - 0x01, - 0x79, - 0x01, - 0x7a, - 0x01, - 0x7b, - 0x01, - 0x7c, - 0x01, - 0x7d, - 0x01, - 0x7e, - 0x01, - 0x7f, - 0x01, - 0x80, - 0x01, - 0x81, - 0x01, - 0x82, - 0x01, - 0x83, - 0x01, - 0x84, - 0x01, - 0x85, - 0x01, - 0x86, - 0x01, - 0x87, - 0x01, - 0x88, - 0x01, - 0x89, - 0x01, - 0x8a, - 0x01, - 0x8b, - 0x01, - 0x8c, - 0x01, - 0x8d, - 0x01, - 0x8e, - 0x01, - 0x8f, - 0x01, - 0x90, - 0x01, - 0x91, - 0x01, - 0x92, - 0x01, - 0x93, - 0x01, - 0x94, - 0x01, - 0x95, - 0x01, - 0x96, - 0x01, - 0x97, - 0x01, - 0x98, - 0x01, - 0x99, - 0x01, - 0x9a, - 0x01, - 0x9b, - 0x01, - 0x9c, - 0x01, - 0x9d, - 0x01, - 0x9e, - 0x01, - 0x9f, - 0x01, - 0xa0, - 0x01, - 0xa1, - 0x01, - 0xa2, - 0x01, - 0xa3, - 0x01, - 0xa4, - 0x01, - 0xa5, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xba, - 0x01, - 0x02, - 0x00, - 0xbb, - 0x01, - 0xbc, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xc1, - 0x01, - 0xc2, - 0x01, - 0xc3, - 0x01, - 0xc4, - 0x01, - 0xc5, - 0x01, - 0xc6, - 0x01, - 0xc7, - 0x01, - 0xc8, - 0x01, - 0xc9, - 0x01, - 0xca, - 0x01, - 0xcb, - 0x01, - 0xcc, - 0x01, - 0xcd, - 0x01, - 0xce, - 0x01, - 0xcf, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xa6, - 0x01, - 0x02, - 0x00, - 0xbd, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xab, - 0x01, - 0x02, - 0x00, - 0xa7, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xd0, - 0x01, - 0x02, - 0x00, - 0xae, - 0x01, - 0xbf, - 0x01, - 0xd3, - 0x01, - 0x25, - 0x02, - 0x26, - 0x02, - 0xd5, - 0x01, - 0xd6, - 0x01, - 0xd7, - 0x01, - 0xd8, - 0x01, - 0xd9, - 0x01, - 0x27, - 0x02, - 0xdb, - 0x01, - 0xdc, - 0x01, - 0xdd, - 0x01, - 0xde, - 0x01, - 0xdf, - 0x01, - 0xe0, - 0x01, - 0xd9, - 0x01, - 0xe1, - 0x01, - 0xdc, - 0x01, - 0xe2, - 0x01, - 0xd9, - 0x01, - 0xe3, - 0x01, - 0xdc, - 0x01, - 0x28, - 0x02, - 0x29, - 0x02, - 0xe7, - 0x01, - 0xd9, - 0x01, - 0x2a, - 0x02, - 0x2b, - 0x02, - 0xdc, - 0x01, - 0xe2, - 0x01, - 0xd9, - 0x01, - 0x2c, - 0x02, - 0xdc, - 0x01, - 0x2d, - 0x02, - 0x2e, - 0x02, - 0xed, - 0x01, - 0xd9, - 0x01, - 0x2f, - 0x02, - 0xdc, - 0x01, - 0xe2, - 0x01, - 0xd9, - 0x01, - 0xef, - 0x01, - 0xdc, - 0x01, - 0x30, - 0x02, - 0x31, - 0x02, - 0xf3, - 0x01, - 0xf4, - 0x01, - 0xf5, - 0x01, - 0xf6, - 0x01, - 0xf7, - 0x01, - 0xf8, - 0x01, - 0x32, - 0x02, - 0xb9, - 0x01, - 0x69, - 0x00, - 0x50, - 0x01, - 0x3b, - 0x12, - 0x00, - 0x00, - 0x99, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x4f, - 0x01, - 0x50, - 0x01, - 0x51, - 0x01, - 0x50, - 0x01, - 0x05, - 0x00, - 0x02, - 0x00, - 0x52, - 0x01, - 0x53, - 0x01, - 0x54, - 0x01, - 0x55, - 0x01, - 0x56, - 0x01, - 0x57, - 0x01, - 0x58, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x59, - 0x01, - 0x50, - 0x01, - 0x5a, - 0x01, - 0x02, - 0x00, - 0x5b, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0x01, - 0x02, - 0x02, - 0x02, - 0x50, - 0x01, - 0x5c, - 0x01, - 0x02, - 0x00, - 0x5d, - 0x01, - 0x5e, - 0x01, - 0x5f, - 0x01, - 0x60, - 0x01, - 0x61, - 0x01, - 0x62, - 0x01, - 0x63, - 0x01, - 0x64, - 0x01, - 0x65, - 0x01, - 0x66, - 0x01, - 0x67, - 0x01, - 0x68, - 0x01, - 0x69, - 0x01, - 0x6a, - 0x01, - 0x6b, - 0x01, - 0x6c, - 0x01, - 0x6d, - 0x01, - 0x6e, - 0x01, - 0x6f, - 0x01, - 0x70, - 0x01, - 0x71, - 0x01, - 0x72, - 0x01, - 0x73, - 0x01, - 0x74, - 0x01, - 0x75, - 0x01, - 0x76, - 0x01, - 0x77, - 0x01, - 0x78, - 0x01, - 0x79, - 0x01, - 0x7a, - 0x01, - 0x7b, - 0x01, - 0x7c, - 0x01, - 0x7d, - 0x01, - 0x7e, - 0x01, - 0x7f, - 0x01, - 0x80, - 0x01, - 0x81, - 0x01, - 0x82, - 0x01, - 0x83, - 0x01, - 0x84, - 0x01, - 0x85, - 0x01, - 0x86, - 0x01, - 0x87, - 0x01, - 0x88, - 0x01, - 0x89, - 0x01, - 0x8a, - 0x01, - 0x8b, - 0x01, - 0x8c, - 0x01, - 0x8d, - 0x01, - 0x8e, - 0x01, - 0x8f, - 0x01, - 0x90, - 0x01, - 0x91, - 0x01, - 0x92, - 0x01, - 0x93, - 0x01, - 0x94, - 0x01, - 0x95, - 0x01, - 0x96, - 0x01, - 0x97, - 0x01, - 0x98, - 0x01, - 0x99, - 0x01, - 0x9a, - 0x01, - 0x9b, - 0x01, - 0x9c, - 0x01, - 0x9d, - 0x01, - 0x9e, - 0x01, - 0x9f, - 0x01, - 0xa0, - 0x01, - 0xa1, - 0x01, - 0xa2, - 0x01, - 0xa3, - 0x01, - 0xa4, - 0x01, - 0xa5, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xa6, - 0x01, - 0x02, - 0x00, - 0xa7, - 0x01, - 0xa8, - 0x01, - 0xa9, - 0x01, - 0xaa, - 0x01, - 0x03, - 0x02, - 0x04, - 0x02, - 0x05, - 0x02, - 0x04, - 0x00, - 0x50, - 0x01, - 0xab, - 0x01, - 0x02, - 0x00, - 0xac, - 0x01, - 0x04, - 0x00, - 0x50, - 0x01, - 0xad, - 0x01, - 0x02, - 0x00, - 0xae, - 0x01, - 0xaf, - 0x01, - 0x33, - 0x02, - 0x34, - 0x02, - 0x35, - 0x02, - 0x36, - 0x02, - 0x37, - 0x02, - 0x38, - 0x02, - 0x39, - 0x02, - 0x3a, - 0x02, - 0x3b, - 0x02, - 0x3c, - 0x02, - 0x3d, - 0x02, - 0x3e, - 0x02, - 0x3f, - 0x02, - 0x40, - 0x02, - 0x41, - 0x02, - 0x42, - 0x02, - 0x43, - 0x02, - 0x44, - 0x02, - 0x45, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x48, - 0x02, - 0x1c, - 0x02, - 0x1d, - 0x02, - 0xb9, - 0x01, - 0x69, - 0x00, - 0x50, - 0x01, +// GIZMO +0x53, 0x52, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x54, 0x41, 0x45, 0x46, +0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x45, 0x4d, 0x41, 0x4e, 0x5f, 0x54, 0x41, 0x4d, 0x06, 0x00, 0x00, +0x00, 0x47, 0x69, 0x7a, 0x6d, 0x6f, 0x00, 0x4c, 0x44, 0x4d, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x4e, 0x4d, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4c, 0x46, 0x56, +0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x46, 0x49, 0x4e, 0x55, 0x5f, 0x54, 0x41, 0x4d, +0x98, 0x00, 0x00, 0x00, 0x09, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x00, +0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x01, 0x4c, 0x69, 0x67, 0x68, +0x74, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x04, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x05, 0x46, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x06, 0x46, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x73, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x07, 0x42, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x00, 0x02, 0x4d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x03, +0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x08, 0x50, 0x4d, 0x41, 0x53, +0x5f, 0x54, 0x41, 0x4d, 0xcb, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x07, 0x07, 0x01, 0x02, 0x09, 0x07, 0x00, 0x09, 0x01, +0x01, 0x0a, 0x00, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x00, 0x01, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x00, 0x02, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x00, 0x03, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, +0x73, 0x61, 0x6f, 0x00, 0x04, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x00, 0x05, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x00, 0x06, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, +0x6f, 0x67, 0x00, 0x07, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, +0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x00, 0x08, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, +0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x00, +0x09, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, +0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, 0x20, 0x42, 0x49, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x3b, +0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x11, 0x02, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x06, 0x00, 0x20, 0x42, 0x49, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x4e, 0x4f, +0x43, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, 0x55, +0x53, 0x5f, 0x54, 0x41, 0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, +0x61, 0x6d, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, +0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x45, +0x4c, 0x42, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x44, 0x4d, 0x52, 0x54, 0x5f, 0x54, 0x41, 0x4d, 0x01, +0x00, 0x00, 0x00, 0x00, 0x4c, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x52, 0x57, +0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, +0x00, 0x00, 0x01, 0x49, 0x52, 0x57, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x45, 0x54, 0x44, +0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x53, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, +0x00, 0x00, 0x53, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x43, 0x32, 0x41, 0x5f, +0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4d, 0x55, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, +0x00, 0x50, 0x4f, 0x52, 0x50, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x44, 0x49, 0x55, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0xfe, 0x16, 0xc9, 0x46, 0x7d, 0x50, 0x8b, +0x83, 0x44, 0x41, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, 0x5f, 0x54, +0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, +0x54, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x49, 0x43, 0x5f, 0x54, 0x41, +0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x41, 0x51, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x41, 0x41, 0x50, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x41, 0x56, 0x53, 0x5f, +0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x19, 0x3e, 0x52, 0x48, 0x54, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, +0x00, 0x00, 0x00, 0xcd, 0xcc, 0x4c, 0x3e, 0x4f, 0x44, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, +0x52, 0x54, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x44, 0x53, 0x43, 0x5f, 0x54, 0x41, +0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x74, 0x53, 0x00, 0x00, 0x49, 0x02, +0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x30, 0x30, 0x20, 0x65, 0x73, 0x00, 0x73, 0x74, +0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, +0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x7b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x7d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x50, 0x65, +0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x00, 0x6d, 0x61, 0x74, 0x34, +0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, +0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, +0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x69, 0x6e, +0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x69, 0x6e, 0x74, +0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, +0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, +0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, +0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x00, 0x23, +0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, +0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x20, 0x36, 0x34, 0x00, 0x23, 0x65, 0x6e, 0x64, +0x69, 0x66, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, +0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, +0x31, 0x3b, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, +0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x00, 0x23, 0x64, 0x65, +0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, +0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x00, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, +0x5f, 0x56, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x41, 0x52, 0x4f, 0x55, 0x4e, +0x44, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, +0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, +0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, +0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, +0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, +0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, +0x20, 0x62, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, +0x6d, 0x61, 0x74, 0x34, 0x20, 0x65, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, 0x6d, +0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, +0x69, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x32, 0x20, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x71, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, +0x72, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, +0x61, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, +0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, +0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, +0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, +0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, 0x00, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, +0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6b, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, +0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, +0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x6f, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, +0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x32, 0x20, 0x72, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x73, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, +0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, +0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, +0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, +0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, +0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, +0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, +0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x33, 0x20, +0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, +0x6b, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, +0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x7a, +0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, +0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x7a, 0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x75, 0x7a, 0x7a, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x66, 0x6c, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x00, +0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x6f, 0x69, +0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x56, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x52, 0x4b, +0x41, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x29, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x20, 0x2b, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x49, 0x44, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x00, 0x7d, 0x00, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x69, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x31, 0x36, 0x20, +0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, +0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x5f, 0x33, 0x31, 0x36, +0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x36, +0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, +0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, +0x2a, 0x20, 0x5f, 0x33, 0x31, 0x36, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x36, 0x2e, +0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, +0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x34, +0x36, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x31, 0x37, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x31, +0x37, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x37, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x3b, 0x00, 0x70, 0x72, 0x65, +0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, +0x69, 0x6e, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, +0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x65, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x33, 0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, +0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x36, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x3b, 0x00, 0x6c, +0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x3b, 0x00, 0x7d, +0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, +0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, +0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x66, 0x72, +0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, +0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, +0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, +0x62, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, +0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x29, 0x2e, 0x62, +0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, +0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x29, 0x2e, +0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x37, 0x36, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, +0x35, 0x37, 0x38, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, +0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x65, 0x5b, +0x34, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x6c, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x71, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x7a, 0x3b, 0x00, 0x75, 0x76, 0x65, +0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, +0x64, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x66, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6b, 0x7a, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x71, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, +0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6a, +0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6b, 0x7a, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x7a, 0x7a, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, +0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x7a, 0x7a, 0x5b, 0x34, +0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x7a, +0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x75, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, +0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x69, 0x6e, +0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, +0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, +0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, +0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, +0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x7a, 0x7a, 0x29, +0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, 0x35, 0x3b, 0x00, +0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, +0x31, 0x32, 0x35, 0x29, 0x00, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x79, 0x20, 0x2d, +0x20, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x3b, 0x00, 0x5f, 0x36, 0x30, +0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, +0x2e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x37, +0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, +0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, +0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x37, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, +0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, +0x36, 0x30, 0x36, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x64, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2a, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, +0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x37, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, +0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, +0x36, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, +0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, +0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, +0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, +0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, +0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x37, +0x34, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, +0x5f, 0x36, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x36, +0x30, 0x36, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x65, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x30, +0x38, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x66, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, +0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, 0x31, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, +0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, +0x37, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, +0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, +0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x35, 0x37, +0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, +0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, +0x31, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x33, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, +0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, +0x30, 0x38, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x2e, 0x78, +0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x2e, 0x79, 0x3b, 0x00, +0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x66, 0x72, +0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, +0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, +0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, +0x62, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x36, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, +0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x38, 0x29, 0x2e, 0x62, +0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x36, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, +0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x38, 0x29, 0x2e, +0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x61, 0x72, 0x61, +0x6d, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, +0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, +0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x33, 0x20, 0x3d, +0x20, 0x66, 0x6f, 0x67, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x29, +0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x33, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, +0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, +0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, +0x65, 0x6c, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x49, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, +0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, +0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x35, 0x3b, +0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, +0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, +0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, +0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x42, 0x69, +0x74, 0x73, 0x54, 0x6f, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, +0x64, 0x29, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, +0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, +0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x63, +0x6c, 0x69, 0x70, 0x5f, 0x63, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3a, 0x20, +0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, +0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, +0x38, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, +0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x20, 0x32, 0x00, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, +0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, +0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x3b, +0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, +0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, +0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x61, 0x5b, 0x5f, 0x37, 0x35, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x5f, 0x38, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, +0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x34, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x20, 0x3d, +0x20, 0x5f, 0x39, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x2e, 0x78, +0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, +0x39, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, +0x30, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, +0x20, 0x5f, 0x31, 0x30, 0x32, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, +0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, +0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, +0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x32, 0x2e, +0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x30, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x34, +0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x78, 0x20, 0x2a, +0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, +0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x31, 0x31, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, +0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, +0x31, 0x30, 0x32, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x31, 0x30, +0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, +0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x31, 0x30, 0x32, +0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x2a, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, +0x28, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x77, 0x20, 0x2a, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, +0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x3b, +0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, +0x35, 0x3b, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x31, 0x30, 0x00, 0x23, 0x65, 0x78, 0x74, +0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x69, 0x6e, +0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x3a, +0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x38, 0x29, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x00, 0x6c, 0x61, +0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x6f, +0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, +0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x5f, 0x33, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x29, 0x3b, 0x00, 0x5f, 0x33, 0x31, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, +0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x31, 0x37, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x31, +0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, +0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, +0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, +0x34, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, +0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, +0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, +0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, 0x35, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, +0x34, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, +0x5f, 0x36, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, +0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, +0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, +0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, +0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, +0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, +0x38, 0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, +0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, +0x78, 0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, +0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, +0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, +0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, +0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, +0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, +0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, +0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, +0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, +0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, +0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x69, +0x6e, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, +0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x38, +0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x61, 0x5b, 0x5f, 0x31, 0x39, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, +0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x5f, 0x33, 0x38, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x38, 0x39, 0x29, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, +0x32, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x79, +0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x32, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x32, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x3b, 0x00, 0x69, 0x6e, 0x74, +0x20, 0x5f, 0x32, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x32, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x32, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x33, 0x32, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x33, 0x20, 0x2a, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x32, 0x39, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, +0x33, 0x32, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x33, +0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x5f, +0x32, 0x32, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x77, +0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, +0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, +0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x33, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x32, +0x39, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x77, 0x29, 0x29, 0x3b, +0x00, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x7a, 0x20, 0x2a, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x3b, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, +0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x00, 0x23, 0x69, +0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69, 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, +0x00, 0x00, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, +0x74, 0x61, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, +0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, +0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, +0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, +0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, +0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, +0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, +0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, +0x20, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x64, +0x61, 0x74, 0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, +0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, +0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, +0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, +0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, +0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x4e, 0x6f, 0x69, 0x73, +0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x54, 0x69, +0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, +0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, +0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, +0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x72, 0x65, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x64, 0x4f, 0x66, 0x66, 0x73, +0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, +0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, +0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x4f, 0x76, +0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x46, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x76, 0x31, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, +0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x53, 0x61, 0x6d, 0x70, 0x6c, +0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x64, 0x45, 0x64, 0x67, 0x65, 0x44, 0x69, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x42, +0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x7a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, +0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x66, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x43, 0x6f, +0x75, 0x6e, 0x74, 0x58, 0x59, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, 0x6c, +0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x69, 0x62, 0x6c, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x65, 0x4c, 0x65, 0x76, 0x65, +0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x69, 0x62, 0x6c, 0x53, 0x48, 0x5b, +0x39, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, +0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x73, 0x75, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x68, 0x61, +0x64, 0x6f, 0x77, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, +0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, +0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, +0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x52, 0x61, 0x74, 0x69, +0x6f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, +0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x45, +0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, +0x73, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x42, 0x6c, 0x65, 0x65, 0x64, 0x52, 0x65, 0x64, +0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, +0x64, 0x6f, 0x77, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x44, 0x65, +0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, +0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, +0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, +0x66, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, +0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, +0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, +0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, +0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, +0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, +0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, +0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x52, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x55, 0x76, +0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x53, 0x74, 0x72, 0x69, 0x64, +0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, +0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x37, 0x30, 0x39, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, +0x65, 0x64, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, +0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, +0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x73, 0x74, +0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x34, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, +0x63, 0x6e, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, +0x63, 0x6e, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, +0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, +0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, +0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, +0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, +0x5d, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, +0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5d, 0x5d, +0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, +0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x49, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, +0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, +0x39, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x39, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x39, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, +0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x39, 0x39, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, +0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, +0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, +0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, +0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, +0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, +0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, +0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, +0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, +0x72, 0x31, 0x20, 0x7b, 0x00, 0x64, 0x65, 0x70, 0x74, 0x68, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, +0x70, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, +0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x53, 0x6d, 0x70, 0x6c, +0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, +0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, +0x46, 0x47, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, +0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, +0x5b, 0x5b, 0x69, 0x64, 0x28, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, +0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, +0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x34, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, +0x75, 0x6c, 0x61, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x35, 0x29, 0x5d, 0x5d, 0x3b, +0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, +0x36, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x73, 0x73, 0x61, 0x6f, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x37, 0x29, 0x5d, 0x5d, 0x3b, +0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x38, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, +0x73, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x39, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, +0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x30, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, +0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x31, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, +0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x33, 0x29, 0x5d, 0x5d, 0x3b, +0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, +0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, +0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, +0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, +0x66, 0x65, 0x72, 0x31, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, +0x65, 0x74, 0x31, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, +0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, +0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, +0x38, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x6d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x2c, 0x20, 0x5f, +0x38, 0x31, 0x33, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x34, +0x34, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, +0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, +0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x00, 0x20, 0x20, 0x20, +0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, +0x35, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, 0x66, +0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x32, 0x32, 0x20, 0x3d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, +0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x39, 0x37, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x36, 0x32, 0x32, 0x29, +0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, +0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, +0x6c, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x31, 0x5d, 0x29, +0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, +0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x36, 0x32, 0x32, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x20, 0x3d, +0x20, 0x6d, 0x69, 0x6e, 0x28, 0x5f, 0x38, 0x31, 0x33, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, +0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, +0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, +0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x20, 0x3e, 0x20, +0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x32, 0x20, 0x5f, 0x38, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, +0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x38, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, +0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, +0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, +0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, +0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, +0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, +0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, +0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, +0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x38, 0x32, 0x30, 0x2e, 0x79, 0x2c, 0x20, 0x5f, +0x38, 0x32, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x6d, +0x61, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, +0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, +0x4e, 0x65, 0x61, 0x72, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, +0x38, 0x31, 0x33, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x38, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x3d, 0x20, +0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x29, +0x20, 0x2a, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, +0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, +0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3e, 0x20, 0x30, 0x2e, +0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, +0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, +0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, +0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, +0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, +0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, +0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, +0x5f, 0x38, 0x31, 0x33, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, +0x39, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, +0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, +0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, +0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, +0x5f, 0x38, 0x33, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x33, 0x20, 0x2d, 0x20, 0x5f, +0x36, 0x35, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 0x37, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, +0x35, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x2e, 0x79, +0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x37, 0x39, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, +0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, +0x38, 0x30, 0x34, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, +0x31, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, +0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, +0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, +0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, +0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, +0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x5f, 0x74, +0x79, 0x70, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, +0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, +0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, +0x28, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x5b, 0x5b, 0x66, +0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x38, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, +0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, +0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x29, 0x20, +0x3f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, +0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x3a, 0x20, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x20, 0x5b, 0x5b, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, 0x5d, 0x20, 0x5b, +0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, +0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, +0x6c, 0x69, 0x70, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, +0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x5b, 0x5b, 0x75, +0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x5f, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, +0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x35, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, +0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, +0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, +0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x38, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, +0x5f, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, +0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, +0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, +0x2f, 0x20, 0x5f, 0x39, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x36, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x39, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, +0x38, 0x39, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x39, 0x34, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, +0x20, 0x5f, 0x39, 0x32, 0x2c, 0x20, 0x5f, 0x39, 0x36, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, +0x5f, 0x39, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x39, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x31, 0x30, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, +0x20, 0x5f, 0x39, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, +0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, +0x6d, 0x61, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x2c, 0x20, 0x5f, 0x39, 0x36, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, +0x5f, 0x39, 0x39, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, +0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x28, 0x5f, 0x39, 0x31, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x39, +0x39, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, +0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, +0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, +0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x39, 0x36, +0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x33, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x39, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, +0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, +0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, +0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, +0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x38, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, +0x5f, 0x38, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, +0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, +0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, +0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x20, 0x2a, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x33, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, +0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, +0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, +0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, +0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, +0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x31, 0x37, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x28, 0x5f, 0x38, 0x31, 0x37, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x63, 0x6c, 0x61, +0x6d, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, +0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, +0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, +0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, +0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, +0x2a, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, +0x77, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, +0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, +0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x2a, +0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x2a, +0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, +0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, +0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, +0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x35, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x32, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, +0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, +0x6e, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, +0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x39, +0x30, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x36, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, +0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x20, +0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, +0x36, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, +0x33, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, +0x37, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x37, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, +0x31, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, +0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, +0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, +0x32, 0x31, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x31, 0x20, 0x3d, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, +0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, +0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x34, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, +0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x20, 0x3d, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x32, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x36, 0x2e, 0x77, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, +0x5f, 0x32, 0x31, 0x36, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, +0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2c, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, +0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x34, 0x38, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, +0x31, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, +0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x20, 0x3d, 0x20, +0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, +0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x32, 0x39, 0x2c, 0x20, 0x5f, 0x32, +0x33, 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x38, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x32, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, +0x28, 0x5f, 0x34, 0x32, 0x39, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x32, 0x31, 0x20, 0x2b, 0x20, +0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x38, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x32, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x30, +0x3b, 0x00, 0x4c, 0x53, 0x4c, 0x47, 0x5f, 0x54, 0x41, 0x4d, 0xb2, 0x08, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x90, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, +0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xca, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xde, 0x01, 0x00, 0x00, 0x01, 0x30, 0x01, +0x26, 0x03, 0x00, 0x00, 0x01, 0x44, 0x01, 0x68, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x90, +0x00, 0x80, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x00, 0x02, 0x00, 0x01, 0xb4, 0x05, 0x00, 0x00, 0x02, +0x10, 0x00, 0xa8, 0x04, 0x00, 0x00, 0x02, 0x10, 0x01, 0xec, 0x05, 0x00, 0x00, 0x02, 0x20, 0x01, 0xfe, 0x05, 0x00, 0x00, +0x02, 0x30, 0x01, 0x34, 0x07, 0x00, 0x00, 0x02, 0x44, 0x01, 0x74, 0x07, 0x00, 0x00, 0x02, 0x80, 0x00, 0x8a, 0x07, 0x00, +0x00, 0x02, 0x90, 0x00, 0x8a, 0x07, 0x00, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, +0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, +0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, +0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, +0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, +0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, +0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, +0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, +0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, +0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, +0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, +0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x70, 0x00, +0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x69, 0x00, 0x16, 0x02, 0x00, 0x00, 0x19, 0x00, +0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, +0x7e, 0x00, 0x7f, 0x00, 0x04, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x02, 0x00, 0x84, 0x00, 0x85, 0x00, +0x86, 0x00, 0x87, 0x00, 0x66, 0x00, 0x02, 0x00, 0x88, 0x00, 0x69, 0x00, 0x51, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x00, 0x00, 0x77, 0x00, 0x78, 0x00, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0x9b, 0x0c, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, +0x7f, 0x00, 0x04, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x17, 0x00, 0x02, 0x00, 0x84, 0x00, 0x8c, 0x00, 0x8d, 0x00, +0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, +0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, +0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, +0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, +0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, +0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, +0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, +0x61, 0x00, 0x83, 0x00, 0x02, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0x87, 0x00, 0xd6, 0x00, +0x02, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0x02, 0x00, 0xd9, 0x00, 0x69, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0x02, 0x00, +0xdd, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xde, 0x00, 0x69, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x00, +0xe3, 0x00, 0x02, 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xe8, 0x00, +0x69, 0x00, 0xe9, 0x00, 0xea, 0x00, 0xeb, 0x00, 0x02, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, 0x00, 0xf0, 0x00, +0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xf1, 0x00, 0x69, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, 0x00, 0xf6, 0x00, +0xd9, 0x00, 0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0x69, 0x00, +0xec, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x78, 0x00, 0x05, 0x00, 0x02, 0x00, 0xfc, 0x00, +0xfd, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x10, 0x00, 0x03, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x04, 0x01, 0x05, 0x01, 0x66, 0x00, 0x02, 0x00, +0x06, 0x01, 0x07, 0x01, 0x69, 0x00, 0x91, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x78, 0x00, +0x87, 0x00, 0x66, 0x00, 0x02, 0x00, 0x08, 0x01, 0x69, 0x00, 0x48, 0x0c, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, +0x09, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, +0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0a, 0x01, +0x0b, 0x01, 0x0f, 0x00, 0x0c, 0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, +0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, +0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, +0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, +0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, +0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, +0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, +0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, +0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x63, 0x00, 0x62, 0x00, 0x64, 0x00, +0x65, 0x00, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, +0x69, 0x00, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, +0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, 0x01, 0x1f, 0x01, +0x20, 0x01, 0x21, 0x01, 0x69, 0x00, 0xca, 0x08, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x22, 0x01, 0x23, 0x01, 0x01, 0x00, +0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, +0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, +0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, +0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, +0x25, 0x00, 0x26, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa1, 0x00, +0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, +0x39, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0x3d, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0x40, 0x00, 0xb4, 0x00, 0xb5, 0x00, +0x43, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0x48, 0x00, 0x49, 0x00, 0xbd, 0x00, 0x4b, 0x00, 0x4c, 0x00, +0x4d, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0x50, 0x00, 0xc4, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, +0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0x5b, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, +0x61, 0x00, 0x62, 0x00, 0x24, 0x01, 0x25, 0x01, 0x26, 0x01, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, +0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x27, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x70, 0x00, +0x71, 0x00, 0x72, 0x00, 0x2b, 0x01, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x69, 0x00, 0x11, 0x02, 0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x22, 0x01, 0x23, 0x01, 0x79, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, +0x7f, 0x00, 0x04, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x02, 0x00, 0x18, 0x00, 0x85, 0x00, 0x86, 0x00, +0x87, 0x00, 0x66, 0x00, 0x02, 0x00, 0x88, 0x00, 0x69, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x22, 0x01, +0x23, 0x01, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0xbf, 0x0a, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x22, 0x01, 0x23, 0x01, +0x79, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x04, 0x00, 0x89, 0x00, +0x8a, 0x00, 0x8b, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, +0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x9a, 0x00, +0x9b, 0x00, 0x9c, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, +0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0x39, 0x00, 0xad, 0x00, 0xae, 0x00, +0xaf, 0x00, 0x3d, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0x40, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x43, 0x00, 0xb7, 0x00, 0xb8, 0x00, +0xb9, 0x00, 0xba, 0x00, 0x48, 0x00, 0x49, 0x00, 0xbd, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc1, 0x00, 0xc2, 0x00, +0x50, 0x00, 0xc4, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, +0xcd, 0x00, 0x5b, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0x61, 0x00, 0x83, 0x00, 0x02, 0x00, +0x18, 0x00, 0x85, 0x00, 0x86, 0x00, 0x2c, 0x01, 0x2d, 0x01, 0x87, 0x00, 0x2e, 0x01, 0x02, 0x00, 0x2f, 0x01, 0xd8, 0x00, +0x02, 0x00, 0xd9, 0x00, 0x69, 0x00, 0x30, 0x01, 0x31, 0x01, 0xdc, 0x00, 0x02, 0x00, 0xdd, 0x00, 0x69, 0x00, 0x6a, 0x00, +0x02, 0x00, 0xde, 0x00, 0x69, 0x00, 0x32, 0x01, 0xe2, 0x00, 0xe3, 0x00, 0x02, 0x00, 0x33, 0x01, 0x34, 0x01, 0x69, 0x00, +0x6a, 0x00, 0x02, 0x00, 0xe8, 0x00, 0x69, 0x00, 0xe9, 0x00, 0xea, 0x00, 0xeb, 0x00, 0x02, 0x00, 0x35, 0x01, 0x69, 0x00, +0x6a, 0x00, 0x02, 0x00, 0xf1, 0x00, 0x69, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0xd9, 0x00, +0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0x36, 0x01, 0xfa, 0x00, 0xfb, 0x00, 0x69, 0x00, 0xcc, 0x02, +0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x22, 0x01, 0x23, 0x01, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, +0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x03, 0x01, +0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x37, 0x01, 0x38, 0x01, 0x66, 0x00, 0x02, 0x00, 0x06, 0x01, 0x07, 0x01, +0x69, 0x00, 0x92, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x22, 0x01, 0x23, 0x01, 0x87, 0x00, 0x66, 0x00, 0x02, 0x00, +0x08, 0x01, 0x69, 0x00, 0x66, 0x0b, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x22, 0x01, 0x23, 0x01, 0x01, 0x00, 0x02, 0x00, +0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, +0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0a, 0x01, 0x0b, 0x01, 0x0f, 0x00, 0x0c, 0x01, +0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, +0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, +0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x2a, 0x00, 0x2b, 0x00, +0x2c, 0x00, 0x2d, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, +0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0x39, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0x3d, 0x00, 0xb1, 0x00, 0xb2, 0x00, +0x40, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x43, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0x48, 0x00, 0x49, 0x00, +0xbd, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0x50, 0x00, 0xc4, 0x00, 0x52, 0x00, 0x53, 0x00, +0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0x5b, 0x00, 0xcf, 0x00, 0xd0, 0x00, +0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0x61, 0x00, 0x24, 0x01, 0x62, 0x00, 0x25, 0x01, 0x26, 0x01, 0x66, 0x00, 0x02, 0x00, +0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x39, 0x01, 0x3a, 0x01, +0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x01, 0x44, 0x01, +0x45, 0x01, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4d, 0x01, 0x69, 0x00, +0x4c, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x41, 0x4d, 0xc4, 0x08, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x96, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, 0x00, 0x00, +0x00, 0x01, 0x10, 0x01, 0xcc, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xe6, 0x01, 0x00, 0x00, 0x01, 0x30, 0x01, 0x4e, 0x03, +0x00, 0x00, 0x01, 0x44, 0x01, 0xb2, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0xdc, 0x03, 0x00, 0x00, 0x01, 0x90, 0x00, 0xdc, +0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x16, 0x05, 0x00, 0x00, 0x02, 0x00, 0x01, 0x96, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, +0x16, 0x05, 0x00, 0x00, 0x02, 0x10, 0x01, 0xcc, 0x01, 0x00, 0x00, 0x02, 0x20, 0x01, 0x26, 0x06, 0x00, 0x00, 0x02, 0x30, +0x01, 0x4e, 0x03, 0x00, 0x00, 0x02, 0x44, 0x01, 0xb2, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x8a, 0x07, 0x00, 0x00, 0x02, +0x90, 0x00, 0x8a, 0x07, 0x00, 0x00, 0xea, 0x0d, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, +0x51, 0x01, 0x50, 0x01, 0x05, 0x00, 0x02, 0x00, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, +0x58, 0x01, 0x04, 0x00, 0x50, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x59, 0x01, 0x50, 0x01, 0x5a, 0x01, 0x02, 0x00, +0x5b, 0x01, 0x04, 0x00, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, +0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, +0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, +0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, +0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, +0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, +0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, +0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, 0x50, 0x01, +0xa6, 0x01, 0x02, 0x00, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, +0xac, 0x01, 0x04, 0x00, 0x50, 0x01, 0xad, 0x01, 0x02, 0x00, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, +0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0x92, 0x01, +0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0xba, 0x01, 0x02, 0x00, +0xbb, 0x01, 0xbc, 0x01, 0x04, 0x00, 0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, 0xbd, 0x01, 0x04, 0x00, 0x50, 0x01, 0xbe, 0x01, +0x02, 0x00, 0xae, 0x01, 0xbf, 0x01, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, +0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0xc0, 0x01, 0x02, 0x00, 0x69, 0x00, 0x50, 0x01, 0x6a, 0x16, +0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, +0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, +0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, +0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, +0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, +0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, +0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, +0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, +0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, 0x50, 0x01, 0xba, 0x01, 0x02, 0x00, 0xbb, 0x01, 0xbc, 0x01, 0x04, 0x00, +0x50, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, +0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0x04, 0x00, 0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, +0xbd, 0x01, 0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xa7, 0x01, 0x04, 0x00, 0x50, 0x01, 0xd0, 0x01, 0x02, 0x00, +0xae, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, 0x01, +0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xd9, 0x01, 0xe1, 0x01, 0xdc, 0x01, +0xe2, 0x01, 0xd9, 0x01, 0xe3, 0x01, 0xdc, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xd9, 0x01, 0xe8, 0x01, +0xe9, 0x01, 0xdc, 0x01, 0xe2, 0x01, 0xd9, 0x01, 0xea, 0x01, 0xdc, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xd9, 0x01, +0xee, 0x01, 0xdc, 0x01, 0xe2, 0x01, 0xd9, 0x01, 0xef, 0x01, 0xdc, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, +0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0xbc, 0x03, +0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0x05, 0x00, 0x02, 0x00, +0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x04, 0x00, 0x50, 0x01, 0x0d, 0x00, +0x0e, 0x00, 0x0f, 0x00, 0x59, 0x01, 0x50, 0x01, 0x5a, 0x01, 0x02, 0x00, 0x5b, 0x01, 0x04, 0x00, 0x50, 0x01, 0xfa, 0x01, +0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, 0xfb, 0x01, 0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xa8, 0x01, 0x04, 0x00, +0x50, 0x01, 0xfc, 0x01, 0x02, 0x00, 0xae, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0xec, 0x00, +0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, +0xbd, 0x01, 0x04, 0x00, 0x50, 0x01, 0xff, 0x01, 0x02, 0x00, 0xae, 0x01, 0x00, 0x02, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, +0x1a, 0x12, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0x05, 0x00, +0x02, 0x00, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x04, 0x00, 0x50, 0x01, +0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x59, 0x01, 0x50, 0x01, 0x5a, 0x01, 0x02, 0x00, 0x5b, 0x01, 0x04, 0x00, 0x50, 0x01, +0x01, 0x02, 0x02, 0x02, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, +0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, +0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, +0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, +0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, +0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, +0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, +0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, 0x50, 0x01, +0xa6, 0x01, 0x02, 0x00, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x04, 0x00, +0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xac, 0x01, 0x04, 0x00, 0x50, 0x01, 0xad, 0x01, 0x02, 0x00, 0xae, 0x01, 0xaf, 0x01, +0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, +0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, +0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0xea, 0x0d, 0x00, 0x00, 0x84, 0x00, +0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0x05, 0x00, 0x02, 0x00, 0x52, 0x01, 0x53, 0x01, +0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x04, 0x00, 0x50, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x59, 0x01, 0x50, 0x01, 0x5a, 0x01, 0x02, 0x00, 0x5b, 0x01, 0x04, 0x00, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, 0x5d, 0x01, +0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, +0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, +0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, +0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, +0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, +0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, +0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, +0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, 0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, +0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xac, 0x01, 0x04, 0x00, 0x50, 0x01, 0xad, 0x01, 0x02, 0x00, 0xae, 0x01, +0xaf, 0x01, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0xb7, 0x01, 0xb8, 0x01, +0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0x12, 0x16, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, +0x51, 0x01, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, +0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, +0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, +0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, +0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, +0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, +0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, +0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, 0x50, 0x01, 0xba, 0x01, +0x02, 0x00, 0xbb, 0x01, 0xbc, 0x01, 0x04, 0x00, 0x50, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, +0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, +0x04, 0x00, 0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, 0xbd, 0x01, 0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xa7, 0x01, +0x04, 0x00, 0x50, 0x01, 0xd0, 0x01, 0x02, 0x00, 0xae, 0x01, 0xbf, 0x01, 0xd3, 0x01, 0x25, 0x02, 0x26, 0x02, 0xd5, 0x01, +0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, 0x01, 0x27, 0x02, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, +0xe0, 0x01, 0xd9, 0x01, 0xe1, 0x01, 0xdc, 0x01, 0xe2, 0x01, 0xd9, 0x01, 0xe3, 0x01, 0xdc, 0x01, 0x28, 0x02, 0x29, 0x02, +0xe7, 0x01, 0xd9, 0x01, 0x2a, 0x02, 0x2b, 0x02, 0xdc, 0x01, 0xe2, 0x01, 0xd9, 0x01, 0x2c, 0x02, 0xdc, 0x01, 0x2d, 0x02, +0x2e, 0x02, 0xed, 0x01, 0xd9, 0x01, 0x2f, 0x02, 0xdc, 0x01, 0xe2, 0x01, 0xd9, 0x01, 0xef, 0x01, 0xdc, 0x01, 0x30, 0x02, +0x31, 0x02, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0x32, 0x02, 0xb9, 0x01, 0x69, 0x00, +0x50, 0x01, 0x3b, 0x12, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, +0x05, 0x00, 0x02, 0x00, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x04, 0x00, +0x50, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x59, 0x01, 0x50, 0x01, 0x5a, 0x01, 0x02, 0x00, 0x5b, 0x01, 0x04, 0x00, +0x50, 0x01, 0x01, 0x02, 0x02, 0x02, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, +0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, +0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, +0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, +0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, +0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, +0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, +0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, +0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, +0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xac, 0x01, 0x04, 0x00, 0x50, 0x01, 0xad, 0x01, 0x02, 0x00, 0xae, 0x01, +0xaf, 0x01, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, +0x3c, 0x02, 0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, +0x46, 0x02, 0x47, 0x02, 0x48, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, }; diff --git a/thermion_dart/native/include/material/gizmo.h b/thermion_dart/native/include/material/gizmo.h index fd62c71d..86a4282a 100644 --- a/thermion_dart/native/include/material/gizmo.h +++ b/thermion_dart/native/include/material/gizmo.h @@ -3,16 +3,11 @@ #include -#if defined(__cplusplus) -extern "C" -{ -#endif +extern "C" { extern const uint8_t GIZMO_PACKAGE[]; extern int GIZMO_GIZMO_OFFSET; extern int GIZMO_GIZMO_SIZE; -#if defined(__cplusplus) } -#endif #define GIZMO_GIZMO_DATA (GIZMO_PACKAGE + GIZMO_GIZMO_OFFSET) #endif diff --git a/thermion_dart/native/include/material/image.c b/thermion_dart/native/include/material/image.c index cb4390c0..1acba238 100644 --- a/thermion_dart/native/include/material/image.c +++ b/thermion_dart/native/include/material/image.c @@ -1,37418 +1,1878 @@ #include - #include "image.h" - const uint8_t IMAGE_PACKAGE[] = { - // IMAGE - 0x53, - 0x52, - 0x45, - 0x56, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0x33, - 0x00, - 0x00, - 0x00, - 0x54, - 0x41, - 0x45, - 0x46, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x45, - 0x4d, - 0x41, - 0x4e, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x06, - 0x00, - 0x00, - 0x00, - 0x49, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x00, - 0x4c, - 0x44, - 0x4d, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x4d, - 0x4f, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x54, - 0x4c, - 0x46, - 0x56, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0x2c, - 0x00, - 0x00, - 0x00, - 0x46, - 0x49, - 0x4e, - 0x55, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x98, - 0x00, - 0x00, - 0x00, - 0x09, - 0x46, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x00, - 0x4f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x01, - 0x4c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x73, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x04, - 0x53, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x05, - 0x46, - 0x72, - 0x6f, - 0x78, - 0x65, - 0x6c, - 0x52, - 0x65, - 0x63, - 0x6f, - 0x72, - 0x64, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x06, - 0x46, - 0x72, - 0x6f, - 0x78, - 0x65, - 0x6c, - 0x73, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x07, - 0x42, - 0x6f, - 0x6e, - 0x65, - 0x73, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x02, - 0x4d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x69, - 0x6e, - 0x67, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x03, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x08, - 0x50, - 0x4d, - 0x41, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0xe1, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x02, - 0x07, - 0x07, - 0x01, - 0x02, - 0x09, - 0x07, - 0x01, - 0x0a, - 0x01, - 0x01, - 0x0b, - 0x00, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x4d, - 0x61, - 0x70, - 0x00, - 0x01, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x44, - 0x46, - 0x47, - 0x00, - 0x02, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x53, - 0x70, - 0x65, - 0x63, - 0x75, - 0x6c, - 0x61, - 0x72, - 0x00, - 0x03, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x61, - 0x6f, - 0x00, - 0x04, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x72, - 0x00, - 0x05, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x75, - 0x72, - 0x65, - 0x00, - 0x06, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x00, - 0x07, - 0x6d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x54, - 0x61, - 0x72, - 0x67, - 0x65, - 0x74, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x73, - 0x00, - 0x08, - 0x6d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x54, - 0x61, - 0x72, - 0x67, - 0x65, - 0x74, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x5f, - 0x74, - 0x61, - 0x6e, - 0x67, - 0x65, - 0x6e, - 0x74, - 0x73, - 0x00, - 0x09, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x00, - 0x0a, - 0x62, - 0x6f, - 0x6e, - 0x65, - 0x73, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x69, - 0x63, - 0x65, - 0x73, - 0x41, - 0x6e, - 0x64, - 0x57, - 0x65, - 0x69, - 0x67, - 0x68, - 0x74, - 0x73, - 0x00, - 0x20, - 0x42, - 0x49, - 0x55, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x59, - 0x00, - 0x00, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x11, - 0x02, - 0x62, - 0x61, - 0x63, - 0x6b, - 0x67, - 0x72, - 0x6f, - 0x75, - 0x6e, - 0x64, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x07, - 0x03, - 0x73, - 0x68, - 0x6f, - 0x77, - 0x49, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x08, - 0x03, - 0x20, - 0x42, - 0x49, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x21, - 0x00, - 0x00, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x00, - 0x00, - 0x02, - 0x03, - 0x00, - 0x53, - 0x4e, - 0x4f, - 0x43, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x08, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x20, - 0x42, - 0x55, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x17, - 0x00, - 0x00, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x53, - 0x53, - 0x4f, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x49, - 0x53, - 0x4f, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x45, - 0x4c, - 0x42, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x44, - 0x4d, - 0x52, - 0x54, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4c, - 0x46, - 0x45, - 0x52, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x49, - 0x52, - 0x57, - 0x43, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x53, - 0x57, - 0x45, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x49, - 0x52, - 0x57, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x53, - 0x45, - 0x54, - 0x44, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x54, - 0x53, - 0x4e, - 0x49, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x53, - 0x43, - 0x32, - 0x41, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x43, - 0x32, - 0x41, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x4d, - 0x55, - 0x43, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x50, - 0x4f, - 0x52, - 0x50, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x08, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x44, - 0x49, - 0x55, - 0x55, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x08, - 0x00, - 0x00, - 0x00, - 0x71, - 0x20, - 0x8a, - 0x14, - 0xbe, - 0xed, - 0x26, - 0x66, - 0x44, - 0x41, - 0x48, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4c, - 0x4d, - 0x48, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4d, - 0x46, - 0x45, - 0x52, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x54, - 0x46, - 0x45, - 0x52, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x52, - 0x4f, - 0x49, - 0x43, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x41, - 0x51, - 0x45, - 0x52, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x41, - 0x41, - 0x50, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x52, - 0x41, - 0x56, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0x9a, - 0x99, - 0x19, - 0x3e, - 0x52, - 0x48, - 0x54, - 0x53, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x04, - 0x00, - 0x00, - 0x00, - 0xcd, - 0xcc, - 0x4c, - 0x3e, - 0x4f, - 0x44, - 0x45, - 0x56, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x03, - 0x52, - 0x54, - 0x4e, - 0x49, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x50, - 0x44, - 0x53, - 0x43, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x54, - 0x58, - 0x45, - 0x54, - 0x5f, - 0x43, - 0x49, - 0x44, - 0x89, - 0x75, - 0x00, - 0x00, - 0x7d, - 0x03, - 0x00, - 0x00, - 0x23, - 0x76, - 0x65, - 0x72, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x33, - 0x30, - 0x30, - 0x20, - 0x65, - 0x73, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x00, - 0x7b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x7d, - 0x3b, - 0x00, - 0x23, - 0x69, - 0x66, - 0x6e, - 0x64, - 0x65, - 0x66, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x35, - 0x00, - 0x23, - 0x64, - 0x65, - 0x66, - 0x69, - 0x6e, - 0x65, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x35, - 0x20, - 0x66, - 0x61, - 0x6c, - 0x73, - 0x65, - 0x00, - 0x23, - 0x65, - 0x6e, - 0x64, - 0x69, - 0x66, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x50, - 0x4f, - 0x57, - 0x45, - 0x52, - 0x5f, - 0x56, - 0x52, - 0x5f, - 0x53, - 0x48, - 0x41, - 0x44, - 0x45, - 0x52, - 0x5f, - 0x57, - 0x4f, - 0x52, - 0x4b, - 0x41, - 0x52, - 0x4f, - 0x55, - 0x4e, - 0x44, - 0x53, - 0x20, - 0x3d, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x35, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x73, - 0x74, - 0x64, - 0x31, - 0x34, - 0x30, - 0x29, - 0x20, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x46, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x61, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x62, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x63, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x64, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x65, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x66, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x67, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x68, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x69, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6b, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6c, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6d, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6f, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x70, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x71, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x72, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x76, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x77, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x78, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x79, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x61, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x75, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x62, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x63, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x64, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x67, - 0x7a, - 0x5b, - 0x39, - 0x5d, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x68, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x69, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6b, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6c, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6f, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x70, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x71, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x72, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x76, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x77, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x78, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x61, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x62, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x63, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x64, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x67, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x68, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x20, - 0x69, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6a, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6b, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6c, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6f, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x70, - 0x7a, - 0x7a, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x71, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x72, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x75, - 0x7a, - 0x7a, - 0x5b, - 0x34, - 0x30, - 0x5d, - 0x3b, - 0x00, - 0x7d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x29, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x61, - 0x74, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x3b, - 0x00, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x6f, - 0x69, - 0x64, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x28, - 0x29, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x50, - 0x4f, - 0x57, - 0x45, - 0x52, - 0x5f, - 0x56, - 0x52, - 0x5f, - 0x53, - 0x48, - 0x41, - 0x44, - 0x45, - 0x52, - 0x5f, - 0x57, - 0x4f, - 0x52, - 0x4b, - 0x41, - 0x52, - 0x4f, - 0x55, - 0x4e, - 0x44, - 0x53, - 0x29, - 0x00, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x31, - 0x20, - 0x2b, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x49, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x49, - 0x44, - 0x29, - 0x20, - 0x2d, - 0x20, - 0x31, - 0x3b, - 0x00, - 0x7d, - 0x00, - 0x65, - 0x6c, - 0x73, - 0x65, - 0x00, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x49, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x49, - 0x44, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x30, - 0x34, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x34, - 0x36, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x30, - 0x34, - 0x2e, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x2d, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x36, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x30, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x36, - 0x33, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x32, - 0x29, - 0x20, - 0x3c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x30, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x35, - 0x30, - 0x2e, - 0x77, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x32, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x3f, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x20, - 0x3a, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x36, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x30, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x36, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x30, - 0x3b, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x36, - 0x33, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x33, - 0x36, - 0x33, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x34, - 0x2e, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x33, - 0x31, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x30, - 0x34, - 0x2e, - 0x78, - 0x79, - 0x20, - 0x2a, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x33, - 0x37, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x31, - 0x31, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x33, - 0x37, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x31, - 0x31, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x5f, - 0x33, - 0x33, - 0x37, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x34, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x31, - 0x2e, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x31, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x32, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x32, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x32, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x36, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x34, - 0x36, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x34, - 0x36, - 0x2e, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x78, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x34, - 0x36, - 0x2e, - 0x77, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x79, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x36, - 0x3b, - 0x00, - 0x70, - 0x72, - 0x65, - 0x63, - 0x69, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3b, - 0x00, - 0x70, - 0x72, - 0x65, - 0x63, - 0x69, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x65, - 0x6d, - 0x69, - 0x73, - 0x73, - 0x69, - 0x76, - 0x65, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x63, - 0x6c, - 0x65, - 0x61, - 0x72, - 0x43, - 0x6f, - 0x61, - 0x74, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x63, - 0x6c, - 0x65, - 0x61, - 0x72, - 0x43, - 0x6f, - 0x61, - 0x74, - 0x52, - 0x6f, - 0x75, - 0x67, - 0x68, - 0x6e, - 0x65, - 0x73, - 0x73, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x61, - 0x6e, - 0x69, - 0x73, - 0x6f, - 0x74, - 0x72, - 0x6f, - 0x70, - 0x79, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x61, - 0x6e, - 0x69, - 0x73, - 0x6f, - 0x74, - 0x72, - 0x6f, - 0x70, - 0x79, - 0x44, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x34, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x35, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x36, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x35, - 0x35, - 0x33, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x35, - 0x35, - 0x34, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x61, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x62, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x63, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x64, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x65, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x66, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x67, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x68, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x69, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6b, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6c, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6d, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6e, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6f, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x70, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x71, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x72, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x76, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x77, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x78, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x79, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x61, - 0x7a, - 0x3b, - 0x00, - 0x75, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x62, - 0x7a, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x63, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x64, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x67, - 0x7a, - 0x5b, - 0x39, - 0x5d, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x68, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x69, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6a, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6b, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6c, - 0x7a, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x6f, - 0x7a, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x70, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x71, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x72, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x7a, - 0x3b, - 0x00, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x76, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x77, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x78, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x61, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x62, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x63, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x64, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x67, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x68, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x20, - 0x69, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6a, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6b, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6c, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6f, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x70, - 0x7a, - 0x7a, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x71, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x72, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x75, - 0x7a, - 0x7a, - 0x5b, - 0x34, - 0x30, - 0x5d, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x73, - 0x74, - 0x64, - 0x31, - 0x34, - 0x30, - 0x29, - 0x20, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x62, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x63, - 0x3b, - 0x00, - 0x7d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x32, - 0x44, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x20, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x29, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x2e, - 0x78, - 0x79, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x3b, - 0x00, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x20, - 0x3d, - 0x3d, - 0x20, - 0x30, - 0x3b, - 0x00, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x31, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x29, - 0x00, - 0x5f, - 0x34, - 0x32, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x2e, - 0x78, - 0x20, - 0x3e, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x32, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x3b, - 0x00, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x38, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x34, - 0x32, - 0x31, - 0x29, - 0x00, - 0x5f, - 0x34, - 0x32, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x2e, - 0x78, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x32, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x31, - 0x3b, - 0x00, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x34, - 0x33, - 0x35, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x34, - 0x32, - 0x38, - 0x29, - 0x00, - 0x5f, - 0x34, - 0x33, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x33, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x38, - 0x3b, - 0x00, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x34, - 0x33, - 0x35, - 0x29, - 0x00, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3e, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x33, - 0x35, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x29, - 0x00, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x2c, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x70, - 0x29, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x34, - 0x36, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x37, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x37, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x37, - 0x3b, - 0x00, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x36, - 0x32, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x36, - 0x32, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x36, - 0x32, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x35, - 0x34, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x35, - 0x34, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x35, - 0x34, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x35, - 0x33, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x5f, - 0x35, - 0x34, - 0x38, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x5f, - 0x35, - 0x34, - 0x38, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x5f, - 0x35, - 0x34, - 0x38, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x38, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x34, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x36, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x34, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x30, - 0x36, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x30, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x31, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x32, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x34, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x35, - 0x3b, - 0x00, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x6d, - 0x65, - 0x64, - 0x69, - 0x75, - 0x6d, - 0x70, - 0x20, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x43, - 0x75, - 0x62, - 0x65, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x20, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x28, - 0x69, - 0x6e, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2c, - 0x20, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x6c, - 0x65, - 0x6e, - 0x67, - 0x74, - 0x68, - 0x28, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x3e, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x7a, - 0x7a, - 0x29, - 0x00, - 0x72, - 0x65, - 0x74, - 0x75, - 0x72, - 0x6e, - 0x20, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x35, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x29, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x30, - 0x31, - 0x32, - 0x35, - 0x29, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x7a, - 0x2e, - 0x7a, - 0x20, - 0x2d, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x7a, - 0x2e, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x7a, - 0x2e, - 0x79, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x29, - 0x29, - 0x29, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x7a, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x34, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x38, - 0x30, - 0x35, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x78, - 0x7a, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x32, - 0x34, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x34, - 0x37, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x69, - 0x6e, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x32, - 0x34, - 0x37, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x36, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x64, - 0x7a, - 0x7a, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x7a, - 0x7a, - 0x29, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x68, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x32, - 0x37, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x34, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x75, - 0x6e, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x48, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x78, - 0x31, - 0x36, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x7a, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x4c, - 0x6f, - 0x64, - 0x28, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x2c, - 0x20, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x70, - 0x6f, - 0x73, - 0x65, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x30, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x31, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x32, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x2c, - 0x20, - 0x6d, - 0x69, - 0x78, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x2e, - 0x79, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x2e, - 0x78, - 0x2c, - 0x20, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x32, - 0x37, - 0x34, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x7a, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x36, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x34, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x38, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x7a, - 0x7a, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x38, - 0x30, - 0x35, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x7a, - 0x7a, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x33, - 0x34, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x31, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x64, - 0x6f, - 0x74, - 0x28, - 0x6e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x69, - 0x7a, - 0x65, - 0x28, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x68, - 0x7a, - 0x29, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x33, - 0x35, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x37, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x32, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6a, - 0x7a, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6a, - 0x7a, - 0x2e, - 0x77, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x70, - 0x6f, - 0x77, - 0x28, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x33, - 0x35, - 0x37, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x7a, - 0x7a, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x6d, - 0x70, - 0x5f, - 0x63, - 0x6f, - 0x70, - 0x79, - 0x5f, - 0x33, - 0x34, - 0x31, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x32, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x37, - 0x31, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x34, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x38, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x37, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x37, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x37, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x36, - 0x33, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x2e, - 0x78, - 0x79, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x3b, - 0x00, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x20, - 0x3d, - 0x3d, - 0x20, - 0x30, - 0x3b, - 0x00, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x38, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x36, - 0x34, - 0x31, - 0x29, - 0x00, - 0x5f, - 0x36, - 0x34, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x33, - 0x38, - 0x2e, - 0x78, - 0x20, - 0x3e, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x34, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x31, - 0x3b, - 0x00, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x36, - 0x34, - 0x38, - 0x29, - 0x00, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x33, - 0x38, - 0x2e, - 0x78, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x38, - 0x3b, - 0x00, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x36, - 0x36, - 0x32, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x29, - 0x00, - 0x5f, - 0x36, - 0x36, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x33, - 0x38, - 0x2e, - 0x79, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x36, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x3b, - 0x00, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x36, - 0x36, - 0x39, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x36, - 0x36, - 0x32, - 0x29, - 0x00, - 0x5f, - 0x36, - 0x36, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x33, - 0x38, - 0x2e, - 0x79, - 0x20, - 0x3e, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x36, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x36, - 0x32, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x5f, - 0x36, - 0x36, - 0x39, - 0x29, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x3b, - 0x00, - 0x5f, - 0x36, - 0x33, - 0x38, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x36, - 0x33, - 0x38, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x36, - 0x38, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x2c, - 0x20, - 0x5f, - 0x36, - 0x33, - 0x38, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x70, - 0x29, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x36, - 0x38, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x38, - 0x34, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x36, - 0x38, - 0x34, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x37, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x38, - 0x34, - 0x3b, - 0x00, - 0x5f, - 0x37, - 0x37, - 0x36, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x38, - 0x39, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x5f, - 0x37, - 0x37, - 0x36, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x38, - 0x39, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x5f, - 0x37, - 0x37, - 0x36, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x38, - 0x39, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x37, - 0x36, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x37, - 0x37, - 0x36, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x34, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x5f, - 0x37, - 0x38, - 0x33, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x35, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x5f, - 0x37, - 0x38, - 0x33, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x35, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x5f, - 0x37, - 0x38, - 0x33, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x35, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x33, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x30, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x31, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x31, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x31, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x32, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x30, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x31, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x31, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x31, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x34, - 0x32, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x5f, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x5b, - 0x33, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x33, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x28, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x2c, - 0x20, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x5f, - 0x31, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x33, - 0x39, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x50, - 0x65, - 0x72, - 0x52, - 0x65, - 0x6e, - 0x64, - 0x65, - 0x72, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x44, - 0x61, - 0x74, - 0x61, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x54, - 0x61, - 0x72, - 0x67, - 0x65, - 0x74, - 0x43, - 0x6f, - 0x75, - 0x6e, - 0x74, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x66, - 0x6c, - 0x61, - 0x67, - 0x73, - 0x43, - 0x68, - 0x61, - 0x6e, - 0x6e, - 0x65, - 0x6c, - 0x73, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x49, - 0x64, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x73, - 0x65, - 0x72, - 0x44, - 0x61, - 0x74, - 0x61, - 0x3b, - 0x00, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x72, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x5b, - 0x38, - 0x5d, - 0x3b, - 0x00, - 0x23, - 0x69, - 0x66, - 0x6e, - 0x64, - 0x65, - 0x66, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x31, - 0x00, - 0x23, - 0x64, - 0x65, - 0x66, - 0x69, - 0x6e, - 0x65, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x31, - 0x20, - 0x36, - 0x34, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x4d, - 0x41, - 0x58, - 0x5f, - 0x49, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x43, - 0x45, - 0x53, - 0x20, - 0x3d, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x31, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x36, - 0x37, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x73, - 0x74, - 0x64, - 0x31, - 0x34, - 0x30, - 0x29, - 0x20, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x4f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x50, - 0x65, - 0x72, - 0x52, - 0x65, - 0x6e, - 0x64, - 0x65, - 0x72, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x44, - 0x61, - 0x74, - 0x61, - 0x20, - 0x61, - 0x5b, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x4d, - 0x41, - 0x58, - 0x5f, - 0x49, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x43, - 0x45, - 0x53, - 0x5d, - 0x3b, - 0x00, - 0x7d, - 0x20, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x29, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x20, - 0x68, - 0x69, - 0x67, - 0x68, - 0x70, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x42, - 0x69, - 0x74, - 0x73, - 0x54, - 0x6f, - 0x46, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x5b, - 0x5f, - 0x31, - 0x36, - 0x37, - 0x5d, - 0x2e, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x49, - 0x64, - 0x29, - 0x3b, - 0x00, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x2f, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x23, - 0x65, - 0x78, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x47, - 0x4c, - 0x5f, - 0x45, - 0x58, - 0x54, - 0x5f, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x5f, - 0x63, - 0x75, - 0x6c, - 0x6c, - 0x5f, - 0x64, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x20, - 0x3a, - 0x20, - 0x72, - 0x65, - 0x71, - 0x75, - 0x69, - 0x72, - 0x65, - 0x00, - 0x23, - 0x69, - 0x66, - 0x6e, - 0x64, - 0x65, - 0x66, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x38, - 0x00, - 0x23, - 0x64, - 0x65, - 0x66, - 0x69, - 0x6e, - 0x65, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x38, - 0x20, - 0x32, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x20, - 0x3d, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x38, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x36, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x37, - 0x36, - 0x2e, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x2d, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x38, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x39, - 0x30, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x38, - 0x32, - 0x29, - 0x20, - 0x3c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x39, - 0x2e, - 0x77, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x38, - 0x32, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x3f, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x20, - 0x3a, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x3b, - 0x00, - 0x5f, - 0x39, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x39, - 0x3b, - 0x00, - 0x5f, - 0x39, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x3b, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x20, - 0x5f, - 0x39, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x39, - 0x30, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x39, - 0x30, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x39, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x34, - 0x2e, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x37, - 0x36, - 0x2e, - 0x78, - 0x79, - 0x20, - 0x2a, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x39, - 0x35, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x5f, - 0x39, - 0x35, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x5f, - 0x39, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x39, - 0x34, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x34, - 0x2e, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x34, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x37, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x37, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x37, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x31, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x31, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x31, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x32, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x31, - 0x31, - 0x36, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x32, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x31, - 0x37, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x31, - 0x31, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x31, - 0x31, - 0x36, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x28, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x31, - 0x37, - 0x20, - 0x2f, - 0x20, - 0x32, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x31, - 0x32, - 0x31, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x31, - 0x32, - 0x31, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x31, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x2d, - 0x28, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x31, - 0x37, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x31, - 0x31, - 0x35, - 0x20, - 0x2b, - 0x20, - 0x31, - 0x29, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x78, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x77, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x79, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x2f, - 0x3d, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x23, - 0x76, - 0x65, - 0x72, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x34, - 0x31, - 0x30, - 0x00, - 0x23, - 0x65, - 0x78, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x47, - 0x4c, - 0x5f, - 0x41, - 0x52, - 0x42, - 0x5f, - 0x73, - 0x68, - 0x61, - 0x64, - 0x69, - 0x6e, - 0x67, - 0x5f, - 0x6c, - 0x61, - 0x6e, - 0x67, - 0x75, - 0x61, - 0x67, - 0x65, - 0x5f, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x20, - 0x3a, - 0x20, - 0x65, - 0x6e, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x38, - 0x29, - 0x20, - 0x66, - 0x6c, - 0x61, - 0x74, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x29, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x34, - 0x29, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x37, - 0x29, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x30, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x30, - 0x35, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x34, - 0x37, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x30, - 0x35, - 0x2e, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x2d, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x37, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x36, - 0x34, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x33, - 0x29, - 0x20, - 0x3c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x35, - 0x31, - 0x2e, - 0x77, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x33, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x3f, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x20, - 0x3a, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x36, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x31, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x36, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x3b, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x36, - 0x34, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x33, - 0x36, - 0x34, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x35, - 0x2e, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x33, - 0x31, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x30, - 0x35, - 0x2e, - 0x78, - 0x79, - 0x20, - 0x2a, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x33, - 0x38, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x31, - 0x32, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x33, - 0x38, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x31, - 0x32, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x5f, - 0x33, - 0x33, - 0x38, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x35, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x32, - 0x2e, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x32, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x37, - 0x3b, - 0x00, - 0x5f, - 0x33, - 0x34, - 0x37, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x34, - 0x37, - 0x2e, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x78, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x34, - 0x37, - 0x2e, - 0x77, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x79, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x37, - 0x3b, - 0x00, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x32, - 0x44, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x29, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x32, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x35, - 0x34, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x35, - 0x34, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x35, - 0x34, - 0x2c, - 0x20, - 0x5f, - 0x35, - 0x35, - 0x33, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x2e, - 0x78, - 0x79, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x3b, - 0x00, - 0x5f, - 0x35, - 0x32, - 0x36, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x5f, - 0x35, - 0x32, - 0x36, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x5f, - 0x35, - 0x32, - 0x36, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x32, - 0x36, - 0x3b, - 0x00, - 0x75, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x43, - 0x75, - 0x62, - 0x65, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x34, - 0x29, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x28, - 0x69, - 0x6e, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x6c, - 0x65, - 0x6e, - 0x67, - 0x74, - 0x68, - 0x28, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x35, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x35, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x69, - 0x6e, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x38, - 0x30, - 0x35, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x78, - 0x7a, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x75, - 0x6e, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x48, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x78, - 0x31, - 0x36, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x7a, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x63, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x4c, - 0x6f, - 0x64, - 0x28, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x2c, - 0x20, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x70, - 0x6f, - 0x73, - 0x65, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x30, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x31, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x5b, - 0x32, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x2c, - 0x20, - 0x6d, - 0x69, - 0x78, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x2e, - 0x79, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x31, - 0x2e, - 0x78, - 0x2c, - 0x20, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x67, - 0x7a, - 0x7a, - 0x29, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x68, - 0x7a, - 0x7a, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x32, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6a, - 0x7a, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6a, - 0x7a, - 0x2e, - 0x77, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x70, - 0x6f, - 0x77, - 0x28, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x64, - 0x6f, - 0x74, - 0x28, - 0x6e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x69, - 0x7a, - 0x65, - 0x28, - 0x76, - 0x69, - 0x65, - 0x77, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x68, - 0x7a, - 0x29, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x7a, - 0x7a, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x38, - 0x30, - 0x35, - 0x20, - 0x2a, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x31, - 0x38, - 0x36, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x65, - 0x7a, - 0x7a, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x36, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x34, - 0x29, - 0x2e, - 0x62, - 0x61, - 0x73, - 0x65, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x36, - 0x33, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x61, - 0x20, - 0x2a, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x2e, - 0x78, - 0x79, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x3b, - 0x00, - 0x5f, - 0x37, - 0x36, - 0x31, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x35, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x5f, - 0x37, - 0x36, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x35, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x5f, - 0x37, - 0x36, - 0x31, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x35, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x5f, - 0x38, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x36, - 0x31, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x5f, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x7a, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x5b, - 0x33, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x6d, - 0x61, - 0x74, - 0x33, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x54, - 0x61, - 0x72, - 0x67, - 0x65, - 0x74, - 0x43, - 0x6f, - 0x75, - 0x6e, - 0x74, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x66, - 0x6c, - 0x61, - 0x67, - 0x73, - 0x43, - 0x68, - 0x61, - 0x6e, - 0x6e, - 0x65, - 0x6c, - 0x73, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x49, - 0x64, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x73, - 0x65, - 0x72, - 0x44, - 0x61, - 0x74, - 0x61, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x72, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x5b, - 0x38, - 0x5d, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x30, - 0x29, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x3b, - 0x00, - 0x6c, - 0x61, - 0x79, - 0x6f, - 0x75, - 0x74, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x37, - 0x29, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x32, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x37, - 0x32, - 0x2e, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x2d, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x38, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x3b, - 0x00, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x33, - 0x35, - 0x30, - 0x29, - 0x20, - 0x3c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x38, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x31, - 0x38, - 0x2e, - 0x77, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x35, - 0x30, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x3f, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x20, - 0x3a, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x38, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x38, - 0x3b, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x20, - 0x5f, - 0x34, - 0x30, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x76, - 0x65, - 0x63, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x30, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x30, - 0x32, - 0x2e, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x32, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x37, - 0x32, - 0x2e, - 0x78, - 0x79, - 0x20, - 0x2a, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x76, - 0x65, - 0x63, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x30, - 0x35, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x39, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x30, - 0x35, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x37, - 0x39, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x20, - 0x5f, - 0x34, - 0x30, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x56, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x49, - 0x6e, - 0x70, - 0x75, - 0x74, - 0x73, - 0x28, - 0x5f, - 0x34, - 0x30, - 0x35, - 0x2c, - 0x20, - 0x5f, - 0x34, - 0x30, - 0x32, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x3b, - 0x00, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x30, - 0x39, - 0x2e, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x63, - 0x33, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x30, - 0x39, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x35, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x35, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x39, - 0x35, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x3b, - 0x00, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x32, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x37, - 0x3b, - 0x00, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x38, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x37, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x28, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x31, - 0x38, - 0x20, - 0x2f, - 0x20, - 0x32, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x39, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x39, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x31, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x2d, - 0x28, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x31, - 0x38, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x32, - 0x31, - 0x34, - 0x20, - 0x2b, - 0x20, - 0x31, - 0x29, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x78, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x2e, - 0x77, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x2e, - 0x79, - 0x29, - 0x3b, - 0x00, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x3b, - 0x00, - 0x23, - 0x69, - 0x6e, - 0x63, - 0x6c, - 0x75, - 0x64, - 0x65, - 0x20, - 0x3c, - 0x6d, - 0x65, - 0x74, - 0x61, - 0x6c, - 0x5f, - 0x73, - 0x74, - 0x64, - 0x6c, - 0x69, - 0x62, - 0x3e, - 0x00, - 0x23, - 0x69, - 0x6e, - 0x63, - 0x6c, - 0x75, - 0x64, - 0x65, - 0x20, - 0x3c, - 0x73, - 0x69, - 0x6d, - 0x64, - 0x2f, - 0x73, - 0x69, - 0x6d, - 0x64, - 0x2e, - 0x68, - 0x3e, - 0x00, - 0x00, - 0x75, - 0x73, - 0x69, - 0x6e, - 0x67, - 0x20, - 0x6e, - 0x61, - 0x6d, - 0x65, - 0x73, - 0x70, - 0x61, - 0x63, - 0x65, - 0x20, - 0x6d, - 0x65, - 0x74, - 0x61, - 0x6c, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x46, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x56, - 0x69, - 0x65, - 0x77, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x56, - 0x69, - 0x65, - 0x77, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x76, - 0x69, - 0x65, - 0x77, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x54, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x43, - 0x6f, - 0x6e, - 0x74, - 0x72, - 0x6f, - 0x6c, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x69, - 0x6d, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x74, - 0x65, - 0x6d, - 0x70, - 0x6f, - 0x72, - 0x61, - 0x6c, - 0x4e, - 0x6f, - 0x69, - 0x73, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x75, - 0x73, - 0x65, - 0x72, - 0x54, - 0x69, - 0x6d, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x72, - 0x65, - 0x73, - 0x6f, - 0x6c, - 0x75, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x6c, - 0x6f, - 0x67, - 0x69, - 0x63, - 0x61, - 0x6c, - 0x56, - 0x69, - 0x65, - 0x77, - 0x70, - 0x6f, - 0x72, - 0x74, - 0x53, - 0x63, - 0x61, - 0x6c, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x6c, - 0x6f, - 0x67, - 0x69, - 0x63, - 0x61, - 0x6c, - 0x56, - 0x69, - 0x65, - 0x77, - 0x70, - 0x6f, - 0x72, - 0x74, - 0x4f, - 0x66, - 0x66, - 0x73, - 0x65, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6c, - 0x6f, - 0x64, - 0x42, - 0x69, - 0x61, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x72, - 0x65, - 0x66, - 0x72, - 0x61, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x4c, - 0x6f, - 0x64, - 0x4f, - 0x66, - 0x66, - 0x73, - 0x65, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x64, - 0x65, - 0x72, - 0x69, - 0x76, - 0x61, - 0x74, - 0x69, - 0x76, - 0x65, - 0x73, - 0x53, - 0x63, - 0x61, - 0x6c, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6f, - 0x6e, - 0x65, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x65, - 0x61, - 0x72, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x63, - 0x61, - 0x6d, - 0x65, - 0x72, - 0x61, - 0x46, - 0x61, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x78, - 0x70, - 0x6f, - 0x73, - 0x75, - 0x72, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x76, - 0x31, - 0x30, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x6e, - 0x65, - 0x65, - 0x64, - 0x73, - 0x41, - 0x6c, - 0x70, - 0x68, - 0x61, - 0x43, - 0x68, - 0x61, - 0x6e, - 0x6e, - 0x65, - 0x6c, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x61, - 0x6f, - 0x53, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x69, - 0x6e, - 0x67, - 0x51, - 0x75, - 0x61, - 0x6c, - 0x69, - 0x74, - 0x79, - 0x41, - 0x6e, - 0x64, - 0x45, - 0x64, - 0x67, - 0x65, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x61, - 0x6f, - 0x42, - 0x65, - 0x6e, - 0x74, - 0x4e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x7a, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x65, - 0x64, - 0x5f, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x33, - 0x20, - 0x66, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x68, - 0x61, - 0x6e, - 0x6e, - 0x65, - 0x6c, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x66, - 0x72, - 0x6f, - 0x78, - 0x65, - 0x6c, - 0x43, - 0x6f, - 0x75, - 0x6e, - 0x74, - 0x58, - 0x59, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x69, - 0x62, - 0x6c, - 0x4c, - 0x75, - 0x6d, - 0x69, - 0x6e, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x69, - 0x62, - 0x6c, - 0x52, - 0x6f, - 0x75, - 0x67, - 0x68, - 0x6e, - 0x65, - 0x73, - 0x73, - 0x4f, - 0x6e, - 0x65, - 0x4c, - 0x65, - 0x76, - 0x65, - 0x6c, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x69, - 0x62, - 0x6c, - 0x53, - 0x48, - 0x5b, - 0x39, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x65, - 0x64, - 0x5f, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x44, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x70, - 0x61, - 0x64, - 0x64, - 0x69, - 0x6e, - 0x67, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x49, - 0x6e, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x73, - 0x75, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x46, - 0x61, - 0x72, - 0x41, - 0x74, - 0x74, - 0x65, - 0x6e, - 0x75, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x64, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x61, - 0x6c, - 0x53, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x73, - 0x43, - 0x6f, - 0x6e, - 0x74, - 0x61, - 0x63, - 0x74, - 0x53, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x63, - 0x61, - 0x73, - 0x63, - 0x61, - 0x64, - 0x65, - 0x53, - 0x70, - 0x6c, - 0x69, - 0x74, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x63, - 0x61, - 0x73, - 0x63, - 0x61, - 0x64, - 0x65, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x50, - 0x65, - 0x6e, - 0x75, - 0x6d, - 0x62, - 0x72, - 0x61, - 0x52, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x53, - 0x63, - 0x61, - 0x6c, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x46, - 0x61, - 0x72, - 0x41, - 0x74, - 0x74, - 0x65, - 0x6e, - 0x75, - 0x61, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x76, - 0x73, - 0x6d, - 0x45, - 0x78, - 0x70, - 0x6f, - 0x6e, - 0x65, - 0x6e, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x76, - 0x73, - 0x6d, - 0x44, - 0x65, - 0x70, - 0x74, - 0x68, - 0x53, - 0x63, - 0x61, - 0x6c, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x76, - 0x73, - 0x6d, - 0x4c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x42, - 0x6c, - 0x65, - 0x65, - 0x64, - 0x52, - 0x65, - 0x64, - 0x75, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x53, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x69, - 0x6e, - 0x67, - 0x54, - 0x79, - 0x70, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x65, - 0x64, - 0x5f, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x44, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x61, - 0x78, - 0x4f, - 0x70, - 0x61, - 0x63, - 0x69, - 0x74, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x69, - 0x6e, - 0x4d, - 0x61, - 0x78, - 0x4d, - 0x69, - 0x70, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x48, - 0x65, - 0x69, - 0x67, - 0x68, - 0x74, - 0x46, - 0x61, - 0x6c, - 0x6c, - 0x6f, - 0x66, - 0x66, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x75, - 0x74, - 0x4f, - 0x66, - 0x66, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x70, - 0x61, - 0x63, - 0x6b, - 0x65, - 0x64, - 0x5f, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x49, - 0x62, - 0x6c, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x69, - 0x7a, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x4f, - 0x6e, - 0x65, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x78, - 0x33, - 0x20, - 0x66, - 0x6f, - 0x67, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x73, - 0x73, - 0x72, - 0x52, - 0x65, - 0x70, - 0x72, - 0x6f, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x73, - 0x73, - 0x72, - 0x55, - 0x76, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x56, - 0x69, - 0x65, - 0x77, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x73, - 0x72, - 0x54, - 0x68, - 0x69, - 0x63, - 0x6b, - 0x6e, - 0x65, - 0x73, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x73, - 0x72, - 0x42, - 0x69, - 0x61, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x73, - 0x72, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x73, - 0x73, - 0x72, - 0x53, - 0x74, - 0x72, - 0x69, - 0x64, - 0x65, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x63, - 0x75, - 0x73, - 0x74, - 0x6f, - 0x6d, - 0x5b, - 0x34, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x72, - 0x65, - 0x63, - 0x37, - 0x30, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x73, - 0x32, - 0x52, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x73, - 0x32, - 0x52, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x65, - 0x73, - 0x32, - 0x52, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x72, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x5b, - 0x34, - 0x30, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x20, - 0x5b, - 0x5b, - 0x75, - 0x73, - 0x65, - 0x72, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x6e, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x75, - 0x73, - 0x65, - 0x72, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x6e, - 0x34, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x75, - 0x73, - 0x65, - 0x72, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x6e, - 0x37, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x5b, - 0x5b, - 0x75, - 0x73, - 0x65, - 0x72, - 0x28, - 0x6c, - 0x6f, - 0x63, - 0x6e, - 0x38, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x69, - 0x6e, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x61, - 0x74, - 0x74, - 0x72, - 0x69, - 0x62, - 0x75, - 0x74, - 0x65, - 0x28, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x69, - 0x6e, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x73, - 0x74, - 0x61, - 0x67, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x46, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x31, - 0x37, - 0x29, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x75, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x49, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x49, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x64, - 0x5d, - 0x5d, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x3d, - 0x20, - 0x7b, - 0x7d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x28, - 0x67, - 0x6c, - 0x5f, - 0x49, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x49, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x36, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x34, - 0x2e, - 0x7a, - 0x2c, - 0x20, - 0x2d, - 0x30, - 0x2e, - 0x35, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x36, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x36, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x36, - 0x30, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x32, - 0x36, - 0x32, - 0x29, - 0x20, - 0x3c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x7b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x36, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x30, - 0x2e, - 0x77, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x36, - 0x32, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x3f, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x20, - 0x3a, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x7d, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x65, - 0x6c, - 0x73, - 0x65, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x36, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x39, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x39, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x34, - 0x2e, - 0x78, - 0x79, - 0x20, - 0x2a, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x33, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x31, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x33, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x31, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x36, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x36, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x36, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x72, - 0x65, - 0x74, - 0x75, - 0x72, - 0x6e, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x62, - 0x61, - 0x63, - 0x6b, - 0x67, - 0x72, - 0x6f, - 0x75, - 0x6e, - 0x64, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x73, - 0x68, - 0x6f, - 0x77, - 0x49, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x37, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x7b, - 0x7d, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x33, - 0x20, - 0x7b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x32, - 0x64, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x31, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x28, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x6d, - 0x65, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x69, - 0x6e, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x73, - 0x74, - 0x61, - 0x67, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x33, - 0x26, - 0x20, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x33, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x32, - 0x39, - 0x29, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x46, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x31, - 0x37, - 0x29, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x32, - 0x35, - 0x29, - 0x5d, - 0x5d, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x69, - 0x6e, - 0x2e, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x2e, - 0x78, - 0x79, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x5f, - 0x34, - 0x31, - 0x30, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x73, - 0x68, - 0x6f, - 0x77, - 0x49, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x20, - 0x3d, - 0x3d, - 0x20, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x30, - 0x2e, - 0x78, - 0x20, - 0x3e, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x34, - 0x32, - 0x31, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x30, - 0x2e, - 0x78, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x34, - 0x33, - 0x35, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x34, - 0x32, - 0x38, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x33, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x30, - 0x2e, - 0x79, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x33, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x34, - 0x33, - 0x35, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x30, - 0x2e, - 0x79, - 0x20, - 0x3e, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x33, - 0x35, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x5f, - 0x34, - 0x34, - 0x32, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x61, - 0x63, - 0x6b, - 0x67, - 0x72, - 0x6f, - 0x75, - 0x6e, - 0x64, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x30, - 0x2e, - 0x79, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x33, - 0x2e, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x2e, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x33, - 0x2e, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x29, - 0x2c, - 0x20, - 0x62, - 0x69, - 0x61, - 0x73, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x6f, - 0x64, - 0x42, - 0x69, - 0x61, - 0x73, - 0x29, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x37, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x34, - 0x36, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x37, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x36, - 0x32, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x36, - 0x32, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x36, - 0x32, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x61, - 0x63, - 0x6b, - 0x67, - 0x72, - 0x6f, - 0x75, - 0x6e, - 0x64, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x39, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x38, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x38, - 0x31, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x38, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x38, - 0x31, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x38, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x29, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x6d, - 0x65, - 0x6e, - 0x74, - 0x20, - 0x76, - 0x6f, - 0x69, - 0x64, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x29, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x7b, - 0x7d, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x31, - 0x20, - 0x7b, - 0x00, - 0x64, - 0x65, - 0x70, - 0x74, - 0x68, - 0x32, - 0x64, - 0x5f, - 0x61, - 0x72, - 0x72, - 0x61, - 0x79, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x4d, - 0x61, - 0x70, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x68, - 0x61, - 0x64, - 0x6f, - 0x77, - 0x4d, - 0x61, - 0x70, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x31, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x32, - 0x64, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x44, - 0x46, - 0x47, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x32, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x44, - 0x46, - 0x47, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x33, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x63, - 0x75, - 0x62, - 0x65, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x53, - 0x70, - 0x65, - 0x63, - 0x75, - 0x6c, - 0x61, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x34, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x69, - 0x62, - 0x6c, - 0x53, - 0x70, - 0x65, - 0x63, - 0x75, - 0x6c, - 0x61, - 0x72, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x35, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x32, - 0x64, - 0x5f, - 0x61, - 0x72, - 0x72, - 0x61, - 0x79, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x61, - 0x6f, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x36, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x61, - 0x6f, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x37, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x32, - 0x64, - 0x5f, - 0x61, - 0x72, - 0x72, - 0x61, - 0x79, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x38, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x73, - 0x72, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x39, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x32, - 0x64, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x75, - 0x72, - 0x65, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x31, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x75, - 0x72, - 0x65, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x31, - 0x31, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x74, - 0x65, - 0x78, - 0x74, - 0x75, - 0x72, - 0x65, - 0x63, - 0x75, - 0x62, - 0x65, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x31, - 0x32, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x72, - 0x20, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x20, - 0x5b, - 0x5b, - 0x69, - 0x64, - 0x28, - 0x31, - 0x33, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x6d, - 0x65, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x69, - 0x6e, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x73, - 0x74, - 0x61, - 0x67, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x31, - 0x26, - 0x20, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x31, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x32, - 0x37, - 0x29, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x42, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x33, - 0x26, - 0x20, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x33, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x32, - 0x39, - 0x29, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x46, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x31, - 0x37, - 0x29, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x4d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x32, - 0x35, - 0x29, - 0x5d, - 0x5d, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x69, - 0x6e, - 0x2e, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x2e, - 0x78, - 0x79, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x5f, - 0x36, - 0x34, - 0x34, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x73, - 0x68, - 0x6f, - 0x77, - 0x49, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x20, - 0x3d, - 0x3d, - 0x20, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x36, - 0x34, - 0x38, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x3e, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x36, - 0x36, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x36, - 0x36, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x36, - 0x36, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x35, - 0x35, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x36, - 0x36, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x36, - 0x36, - 0x32, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x36, - 0x36, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x34, - 0x2e, - 0x79, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x36, - 0x36, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x36, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x6f, - 0x6f, - 0x6c, - 0x20, - 0x5f, - 0x36, - 0x37, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x21, - 0x5f, - 0x36, - 0x36, - 0x39, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x36, - 0x37, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x34, - 0x2e, - 0x79, - 0x20, - 0x3e, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x36, - 0x37, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x36, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x5f, - 0x36, - 0x37, - 0x36, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x61, - 0x63, - 0x6b, - 0x67, - 0x72, - 0x6f, - 0x75, - 0x6e, - 0x64, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x35, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x34, - 0x2e, - 0x79, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x33, - 0x2e, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x2e, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x33, - 0x2e, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x5f, - 0x36, - 0x34, - 0x35, - 0x29, - 0x2c, - 0x20, - 0x62, - 0x69, - 0x61, - 0x73, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x6f, - 0x64, - 0x42, - 0x69, - 0x61, - 0x73, - 0x29, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x31, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x31, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x31, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x36, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x36, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x31, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x36, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x31, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x61, - 0x63, - 0x6b, - 0x67, - 0x72, - 0x6f, - 0x75, - 0x6e, - 0x64, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x33, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x35, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x32, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x35, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x32, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x35, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x32, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x35, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x5f, - 0x39, - 0x39, - 0x36, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x35, - 0x33, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x69, - 0x6e, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x56, - 0x69, - 0x65, - 0x77, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x33, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x64, - 0x6f, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x37, - 0x36, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x6c, - 0x65, - 0x6e, - 0x67, - 0x74, - 0x68, - 0x28, - 0x5f, - 0x35, - 0x33, - 0x34, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x5f, - 0x37, - 0x36, - 0x39, - 0x20, - 0x3e, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x75, - 0x74, - 0x4f, - 0x66, - 0x66, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x7b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x72, - 0x65, - 0x61, - 0x6b, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x7d, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x33, - 0x34, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x48, - 0x65, - 0x69, - 0x67, - 0x68, - 0x74, - 0x46, - 0x61, - 0x6c, - 0x6c, - 0x6f, - 0x66, - 0x66, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x35, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x37, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x37, - 0x38, - 0x36, - 0x29, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x30, - 0x31, - 0x32, - 0x35, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x2d, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x44, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x5b, - 0x30, - 0x5d, - 0x2c, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x2d, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x48, - 0x65, - 0x69, - 0x67, - 0x68, - 0x74, - 0x46, - 0x61, - 0x6c, - 0x6c, - 0x6f, - 0x66, - 0x66, - 0x2c, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x35, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x44, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x5b, - 0x31, - 0x5d, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x44, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x5b, - 0x32, - 0x5d, - 0x29, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x37, - 0x38, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x65, - 0x6c, - 0x73, - 0x65, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x44, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x5b, - 0x32, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x69, - 0x6e, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x38, - 0x20, - 0x2d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x39, - 0x39, - 0x37, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x37, - 0x36, - 0x39, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x61, - 0x78, - 0x4f, - 0x70, - 0x61, - 0x63, - 0x69, - 0x74, - 0x79, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x49, - 0x62, - 0x6c, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x61, - 0x73, - 0x5f, - 0x74, - 0x79, - 0x70, - 0x65, - 0x3c, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x3e, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x69, - 0x6e, - 0x4d, - 0x61, - 0x78, - 0x4d, - 0x69, - 0x70, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x39, - 0x20, - 0x2a, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x31, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x2e, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x31, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x2c, - 0x20, - 0x28, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x70, - 0x6f, - 0x73, - 0x65, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x78, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x30, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x31, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x32, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x35, - 0x33, - 0x34, - 0x29, - 0x2c, - 0x20, - 0x6c, - 0x65, - 0x76, - 0x65, - 0x6c, - 0x28, - 0x6d, - 0x69, - 0x78, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x31, - 0x2e, - 0x79, - 0x2c, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x31, - 0x2e, - 0x78, - 0x2c, - 0x20, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x37, - 0x36, - 0x39, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4f, - 0x6e, - 0x65, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x2c, - 0x20, - 0x2d, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x38, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x38, - 0x36, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x38, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x62, - 0x6c, - 0x4c, - 0x75, - 0x6d, - 0x69, - 0x6e, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x39, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x69, - 0x7a, - 0x65, - 0x20, - 0x3e, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x36, - 0x38, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x49, - 0x6e, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x49, - 0x6e, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x2e, - 0x77, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x70, - 0x6f, - 0x77, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x64, - 0x6f, - 0x74, - 0x28, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x69, - 0x7a, - 0x65, - 0x28, - 0x5f, - 0x35, - 0x33, - 0x34, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x44, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x69, - 0x7a, - 0x65, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x38, - 0x20, - 0x2d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x28, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x39, - 0x39, - 0x37, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x37, - 0x36, - 0x39, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x36, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x34, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x33, - 0x20, - 0x5f, - 0x39, - 0x31, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x34, - 0x38, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x32, - 0x38, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x39, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x20, - 0x5f, - 0x39, - 0x38, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x34, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x38, - 0x31, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x31, - 0x34, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x38, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x31, - 0x34, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x38, - 0x31, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x31, - 0x34, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x38, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x62, - 0x72, - 0x65, - 0x61, - 0x6b, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x7d, - 0x20, - 0x77, - 0x68, - 0x69, - 0x6c, - 0x65, - 0x28, - 0x66, - 0x61, - 0x6c, - 0x73, - 0x65, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x34, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x78, - 0x34, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x78, - 0x33, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x4d, - 0x6f, - 0x64, - 0x65, - 0x6c, - 0x4e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x6f, - 0x72, - 0x70, - 0x68, - 0x54, - 0x61, - 0x72, - 0x67, - 0x65, - 0x74, - 0x43, - 0x6f, - 0x75, - 0x6e, - 0x74, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x66, - 0x6c, - 0x61, - 0x67, - 0x73, - 0x43, - 0x68, - 0x61, - 0x6e, - 0x6e, - 0x65, - 0x6c, - 0x73, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x49, - 0x64, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x75, - 0x73, - 0x65, - 0x72, - 0x44, - 0x61, - 0x74, - 0x61, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x72, - 0x65, - 0x73, - 0x65, - 0x72, - 0x76, - 0x65, - 0x64, - 0x5b, - 0x38, - 0x5d, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x4d, - 0x41, - 0x58, - 0x5f, - 0x49, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x43, - 0x45, - 0x53, - 0x20, - 0x3d, - 0x20, - 0x53, - 0x50, - 0x49, - 0x52, - 0x56, - 0x5f, - 0x43, - 0x52, - 0x4f, - 0x53, - 0x53, - 0x5f, - 0x43, - 0x4f, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x54, - 0x5f, - 0x49, - 0x44, - 0x5f, - 0x31, - 0x3b, - 0x00, - 0x73, - 0x74, - 0x72, - 0x75, - 0x63, - 0x74, - 0x20, - 0x4f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x50, - 0x65, - 0x72, - 0x52, - 0x65, - 0x6e, - 0x64, - 0x65, - 0x72, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x44, - 0x61, - 0x74, - 0x61, - 0x20, - 0x64, - 0x61, - 0x74, - 0x61, - 0x5b, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x4d, - 0x41, - 0x58, - 0x5f, - 0x49, - 0x4e, - 0x53, - 0x54, - 0x41, - 0x4e, - 0x43, - 0x45, - 0x53, - 0x5d, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x36, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x7b, - 0x7d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x20, - 0x5b, - 0x5b, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x28, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x6d, - 0x65, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x69, - 0x6e, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x5b, - 0x5b, - 0x73, - 0x74, - 0x61, - 0x67, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x5d, - 0x5d, - 0x2c, - 0x20, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x4f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x26, - 0x20, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x20, - 0x5b, - 0x5b, - 0x62, - 0x75, - 0x66, - 0x66, - 0x65, - 0x72, - 0x28, - 0x31, - 0x38, - 0x29, - 0x5d, - 0x5d, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x61, - 0x73, - 0x5f, - 0x74, - 0x79, - 0x70, - 0x65, - 0x3c, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x3e, - 0x28, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x64, - 0x61, - 0x74, - 0x61, - 0x5b, - 0x5f, - 0x31, - 0x36, - 0x37, - 0x5d, - 0x2e, - 0x6f, - 0x62, - 0x6a, - 0x65, - 0x63, - 0x74, - 0x49, - 0x64, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x6f, - 0x75, - 0x74, - 0x50, - 0x69, - 0x63, - 0x6b, - 0x69, - 0x6e, - 0x67, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x2f, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x66, - 0x72, - 0x61, - 0x67, - 0x6d, - 0x65, - 0x6e, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x5f, - 0x6f, - 0x75, - 0x74, - 0x20, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x30, - 0x28, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5f, - 0x74, - 0x6d, - 0x70, - 0x20, - 0x5b, - 0x5b, - 0x66, - 0x75, - 0x6e, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x5f, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x28, - 0x38, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x73, - 0x5f, - 0x66, - 0x75, - 0x6e, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x5f, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x5f, - 0x64, - 0x65, - 0x66, - 0x69, - 0x6e, - 0x65, - 0x64, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5f, - 0x74, - 0x6d, - 0x70, - 0x29, - 0x20, - 0x3f, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x5f, - 0x74, - 0x6d, - 0x70, - 0x20, - 0x3a, - 0x20, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x20, - 0x5b, - 0x5b, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x5f, - 0x64, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5d, - 0x5d, - 0x20, - 0x5b, - 0x32, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x30, - 0x20, - 0x5b, - 0x5b, - 0x75, - 0x73, - 0x65, - 0x72, - 0x28, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x30, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x31, - 0x20, - 0x5b, - 0x5b, - 0x75, - 0x73, - 0x65, - 0x72, - 0x28, - 0x63, - 0x6c, - 0x69, - 0x70, - 0x31, - 0x29, - 0x5d, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x36, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x37, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x36, - 0x37, - 0x2e, - 0x7a, - 0x2c, - 0x20, - 0x2d, - 0x30, - 0x2e, - 0x35, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x37, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x37, - 0x32, - 0x29, - 0x20, - 0x3c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x2e, - 0x77, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x37, - 0x32, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x3f, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x20, - 0x3a, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x38, - 0x30, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x5f, - 0x38, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x36, - 0x37, - 0x2e, - 0x78, - 0x79, - 0x20, - 0x2a, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x38, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x38, - 0x38, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x36, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x38, - 0x38, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x36, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x33, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x33, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x33, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x39, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x39, - 0x38, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x36, - 0x37, - 0x2e, - 0x78, - 0x2c, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x31, - 0x2c, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x32, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x2c, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x2c, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x31, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x36, - 0x37, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x31, - 0x31, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x2d, - 0x32, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x31, - 0x31, - 0x30, - 0x2c, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x33, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x36, - 0x37, - 0x2e, - 0x77, - 0x2c, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x38, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x31, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x2d, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x31, - 0x31, - 0x30, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x39, - 0x38, - 0x20, - 0x2b, - 0x20, - 0x31, - 0x29, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x36, - 0x37, - 0x2e, - 0x77, - 0x2c, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x38, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x2f, - 0x3d, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x31, - 0x5d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x38, - 0x35, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x37, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x35, - 0x2e, - 0x7a, - 0x2c, - 0x20, - 0x2d, - 0x30, - 0x2e, - 0x35, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x36, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x37, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x36, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x36, - 0x31, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x32, - 0x36, - 0x33, - 0x29, - 0x20, - 0x3c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x36, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x31, - 0x2e, - 0x77, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x36, - 0x33, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x3f, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x20, - 0x3a, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x36, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x30, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x30, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x32, - 0x38, - 0x35, - 0x2e, - 0x78, - 0x79, - 0x20, - 0x2a, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x32, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x34, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x39, - 0x32, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x37, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x37, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x37, - 0x37, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x37, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x37, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x36, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x7b, - 0x7d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x30, - 0x2e, - 0x78, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x61, - 0x63, - 0x6b, - 0x67, - 0x72, - 0x6f, - 0x75, - 0x6e, - 0x64, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x30, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x33, - 0x2e, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x2e, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x33, - 0x2e, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x2c, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x31, - 0x2c, - 0x20, - 0x62, - 0x69, - 0x61, - 0x73, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x6f, - 0x64, - 0x42, - 0x69, - 0x61, - 0x73, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x37, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x34, - 0x36, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x37, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x31, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x61, - 0x63, - 0x6b, - 0x67, - 0x72, - 0x6f, - 0x75, - 0x6e, - 0x64, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x34, - 0x35, - 0x39, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x38, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x38, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x38, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x37, - 0x38, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x34, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x36, - 0x33, - 0x3b, - 0x00, - 0x63, - 0x6f, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x74, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x31, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x7b, - 0x7d, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x34, - 0x2e, - 0x78, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x61, - 0x63, - 0x6b, - 0x67, - 0x72, - 0x6f, - 0x75, - 0x6e, - 0x64, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x35, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x34, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x33, - 0x2e, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x2e, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x33, - 0x2e, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x2c, - 0x20, - 0x5f, - 0x36, - 0x34, - 0x35, - 0x2c, - 0x20, - 0x62, - 0x69, - 0x61, - 0x73, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x6f, - 0x64, - 0x42, - 0x69, - 0x61, - 0x73, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x31, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x31, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x31, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x6d, - 0x61, - 0x74, - 0x65, - 0x72, - 0x69, - 0x61, - 0x6c, - 0x50, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x73, - 0x2e, - 0x62, - 0x61, - 0x63, - 0x6b, - 0x67, - 0x72, - 0x6f, - 0x75, - 0x6e, - 0x64, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x36, - 0x39, - 0x33, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x38, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x32, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x38, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x32, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x38, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x37, - 0x31, - 0x32, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x36, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x35, - 0x33, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x33, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x69, - 0x6e, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x39, - 0x39, - 0x37, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x37, - 0x36, - 0x39, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x61, - 0x78, - 0x4f, - 0x70, - 0x61, - 0x63, - 0x69, - 0x74, - 0x79, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x31, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x61, - 0x73, - 0x5f, - 0x74, - 0x79, - 0x70, - 0x65, - 0x3c, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x32, - 0x3e, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4d, - 0x69, - 0x6e, - 0x4d, - 0x61, - 0x78, - 0x4d, - 0x69, - 0x70, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x68, - 0x61, - 0x6c, - 0x66, - 0x34, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x31, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x2e, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x28, - 0x73, - 0x70, - 0x76, - 0x44, - 0x65, - 0x73, - 0x63, - 0x72, - 0x69, - 0x70, - 0x74, - 0x6f, - 0x72, - 0x53, - 0x65, - 0x74, - 0x31, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x66, - 0x6f, - 0x67, - 0x53, - 0x6d, - 0x70, - 0x6c, - 0x72, - 0x2c, - 0x20, - 0x28, - 0x74, - 0x72, - 0x61, - 0x6e, - 0x73, - 0x70, - 0x6f, - 0x73, - 0x65, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x78, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x30, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x31, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x75, - 0x73, - 0x65, - 0x72, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x57, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x5b, - 0x32, - 0x5d, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x35, - 0x33, - 0x34, - 0x29, - 0x2c, - 0x20, - 0x6c, - 0x65, - 0x76, - 0x65, - 0x6c, - 0x28, - 0x6d, - 0x69, - 0x78, - 0x28, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x31, - 0x34, - 0x2e, - 0x79, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x31, - 0x30, - 0x31, - 0x34, - 0x2e, - 0x78, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x63, - 0x6c, - 0x61, - 0x6d, - 0x70, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x37, - 0x36, - 0x39, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4f, - 0x6e, - 0x65, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x2c, - 0x20, - 0x2d, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x4f, - 0x76, - 0x65, - 0x72, - 0x46, - 0x61, - 0x72, - 0x4d, - 0x69, - 0x6e, - 0x75, - 0x73, - 0x4e, - 0x65, - 0x61, - 0x72, - 0x29, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x38, - 0x36, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x39, - 0x39, - 0x38, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x69, - 0x62, - 0x6c, - 0x4c, - 0x75, - 0x6d, - 0x69, - 0x6e, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x39, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x33, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x38, - 0x36, - 0x38, - 0x20, - 0x2b, - 0x20, - 0x28, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x49, - 0x6e, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x49, - 0x6e, - 0x74, - 0x65, - 0x6e, - 0x73, - 0x69, - 0x74, - 0x79, - 0x2e, - 0x77, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x70, - 0x6f, - 0x77, - 0x28, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x64, - 0x6f, - 0x74, - 0x28, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6e, - 0x6f, - 0x72, - 0x6d, - 0x61, - 0x6c, - 0x69, - 0x7a, - 0x65, - 0x28, - 0x5f, - 0x35, - 0x33, - 0x34, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x28, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x6c, - 0x69, - 0x67, - 0x68, - 0x74, - 0x44, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x29, - 0x29, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x69, - 0x7a, - 0x65, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x65, - 0x78, - 0x70, - 0x28, - 0x2d, - 0x28, - 0x5f, - 0x39, - 0x39, - 0x37, - 0x20, - 0x2a, - 0x20, - 0x66, - 0x61, - 0x73, - 0x74, - 0x3a, - 0x3a, - 0x6d, - 0x61, - 0x78, - 0x28, - 0x5f, - 0x37, - 0x36, - 0x39, - 0x20, - 0x2d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x66, - 0x6f, - 0x67, - 0x49, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x74, - 0x74, - 0x65, - 0x72, - 0x69, - 0x6e, - 0x67, - 0x53, - 0x74, - 0x61, - 0x72, - 0x74, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x33, - 0x20, - 0x5f, - 0x39, - 0x31, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x35, - 0x33, - 0x36, - 0x2e, - 0x78, - 0x79, - 0x7a, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2d, - 0x20, - 0x5f, - 0x38, - 0x31, - 0x39, - 0x29, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x33, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x39, - 0x38, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x35, - 0x33, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x66, - 0x72, - 0x61, - 0x67, - 0x43, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x31, - 0x30, - 0x30, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x32, - 0x20, - 0x3d, - 0x20, - 0x69, - 0x6e, - 0x2e, - 0x6d, - 0x65, - 0x73, - 0x68, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x39, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x32, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x39, - 0x34, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x33, - 0x35, - 0x32, - 0x2e, - 0x7a, - 0x2c, - 0x20, - 0x2d, - 0x30, - 0x2e, - 0x35, - 0x2c, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x72, - 0x61, - 0x6d, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x2e, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x46, - 0x72, - 0x6f, - 0x6d, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x4d, - 0x61, - 0x74, - 0x72, - 0x69, - 0x78, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x39, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x33, - 0x33, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x38, - 0x2e, - 0x77, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x66, - 0x20, - 0x28, - 0x61, - 0x62, - 0x73, - 0x28, - 0x5f, - 0x33, - 0x33, - 0x30, - 0x29, - 0x20, - 0x3c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x39, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x39, - 0x38, - 0x2e, - 0x77, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x33, - 0x30, - 0x20, - 0x3c, - 0x20, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x3f, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x29, - 0x20, - 0x3a, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x38, - 0x34, - 0x32, - 0x30, - 0x32, - 0x32, - 0x65, - 0x2d, - 0x31, - 0x39, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x39, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x38, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x32, - 0x38, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x34, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x38, - 0x20, - 0x2a, - 0x20, - 0x28, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x34, - 0x31, - 0x38, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x39, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x5f, - 0x33, - 0x35, - 0x32, - 0x2e, - 0x78, - 0x79, - 0x20, - 0x2a, - 0x20, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x32, - 0x28, - 0x30, - 0x2e, - 0x35, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x20, - 0x5f, - 0x34, - 0x30, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x34, - 0x28, - 0x30, - 0x2e, - 0x30, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x30, - 0x31, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x39, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x34, - 0x30, - 0x31, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x39, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x61, - 0x72, - 0x69, - 0x61, - 0x62, - 0x6c, - 0x65, - 0x5f, - 0x69, - 0x6d, - 0x61, - 0x67, - 0x65, - 0x55, - 0x56, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x34, - 0x30, - 0x31, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x34, - 0x2e, - 0x78, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x79, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x34, - 0x2e, - 0x79, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x2e, - 0x7a, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x34, - 0x34, - 0x2e, - 0x7a, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x76, - 0x65, - 0x72, - 0x74, - 0x65, - 0x78, - 0x5f, - 0x70, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x39, - 0x34, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x69, - 0x6e, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x30, - 0x37, - 0x20, - 0x3d, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x69, - 0x6e, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5f, - 0x69, - 0x6e, - 0x64, - 0x65, - 0x78, - 0x20, - 0x25, - 0x20, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x43, - 0x4f, - 0x4e, - 0x46, - 0x49, - 0x47, - 0x5f, - 0x53, - 0x54, - 0x45, - 0x52, - 0x45, - 0x4f, - 0x5f, - 0x45, - 0x59, - 0x45, - 0x5f, - 0x43, - 0x4f, - 0x55, - 0x4e, - 0x54, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x35, - 0x20, - 0x3d, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x31, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x32, - 0x30, - 0x37, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x36, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x33, - 0x35, - 0x32, - 0x2e, - 0x78, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x35, - 0x2c, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x32, - 0x2e, - 0x30, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x30, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x31, - 0x2c, - 0x20, - 0x28, - 0x2d, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2b, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x35, - 0x29, - 0x20, - 0x2a, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x32, - 0x2e, - 0x77, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x5f, - 0x33, - 0x39, - 0x34, - 0x2e, - 0x78, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x36, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x20, - 0x5f, - 0x34, - 0x32, - 0x30, - 0x20, - 0x3d, - 0x20, - 0x28, - 0x2d, - 0x32, - 0x2e, - 0x30, - 0x29, - 0x20, - 0x2f, - 0x20, - 0x5f, - 0x32, - 0x31, - 0x30, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x30, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x34, - 0x32, - 0x30, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x32, - 0x31, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x32, - 0x2e, - 0x77, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x36, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x43, - 0x6c, - 0x69, - 0x70, - 0x44, - 0x69, - 0x73, - 0x74, - 0x61, - 0x6e, - 0x63, - 0x65, - 0x5b, - 0x31, - 0x5d, - 0x20, - 0x3d, - 0x20, - 0x2d, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x66, - 0x6d, - 0x61, - 0x28, - 0x5f, - 0x34, - 0x32, - 0x30, - 0x2c, - 0x20, - 0x66, - 0x6c, - 0x6f, - 0x61, - 0x74, - 0x28, - 0x5f, - 0x32, - 0x30, - 0x37, - 0x20, - 0x2b, - 0x20, - 0x31, - 0x29, - 0x2c, - 0x20, - 0x31, - 0x2e, - 0x30, - 0x29, - 0x2c, - 0x20, - 0x5f, - 0x33, - 0x35, - 0x32, - 0x2e, - 0x77, - 0x2c, - 0x20, - 0x5f, - 0x32, - 0x33, - 0x36, - 0x29, - 0x3b, - 0x00, - 0x20, - 0x20, - 0x20, - 0x20, - 0x6f, - 0x75, - 0x74, - 0x2e, - 0x67, - 0x6c, - 0x5f, - 0x50, - 0x6f, - 0x73, - 0x69, - 0x74, - 0x69, - 0x6f, - 0x6e, - 0x20, - 0x3d, - 0x20, - 0x5f, - 0x33, - 0x39, - 0x34, - 0x3b, - 0x00, - 0x4c, - 0x53, - 0x4c, - 0x47, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0xf6, - 0x0b, - 0x00, - 0x00, - 0x12, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x86, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x01, - 0x96, - 0x01, - 0x00, - 0x00, - 0x01, - 0x10, - 0x00, - 0x86, - 0x00, - 0x00, - 0x00, - 0x01, - 0x10, - 0x01, - 0xe8, - 0x02, - 0x00, - 0x00, - 0x01, - 0x20, - 0x01, - 0xfc, - 0x02, - 0x00, - 0x00, - 0x01, - 0x30, - 0x01, - 0xc4, - 0x04, - 0x00, - 0x00, - 0x01, - 0x44, - 0x01, - 0x06, - 0x05, - 0x00, - 0x00, - 0x01, - 0x80, - 0x00, - 0x1e, - 0x05, - 0x00, - 0x00, - 0x01, - 0x90, - 0x00, - 0x1e, - 0x05, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x4a, - 0x06, - 0x00, - 0x00, - 0x02, - 0x00, - 0x01, - 0x5c, - 0x07, - 0x00, - 0x00, - 0x02, - 0x10, - 0x00, - 0x4a, - 0x06, - 0x00, - 0x00, - 0x02, - 0x10, - 0x01, - 0xac, - 0x08, - 0x00, - 0x00, - 0x02, - 0x20, - 0x01, - 0xbe, - 0x08, - 0x00, - 0x00, - 0x02, - 0x30, - 0x01, - 0x74, - 0x0a, - 0x00, - 0x00, - 0x02, - 0x44, - 0x01, - 0xb4, - 0x0a, - 0x00, - 0x00, - 0x02, - 0x80, - 0x00, - 0xca, - 0x0a, - 0x00, - 0x00, - 0x02, - 0x90, - 0x00, - 0xca, - 0x0a, - 0x00, - 0x00, - 0x82, - 0x09, - 0x00, - 0x00, - 0x84, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x02, - 0x00, - 0x03, - 0x00, - 0x04, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x08, - 0x00, - 0x09, - 0x00, - 0x0a, - 0x00, - 0x02, - 0x00, - 0x0b, - 0x00, - 0x0c, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x11, - 0x00, - 0x12, - 0x00, - 0x13, - 0x00, - 0x14, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x17, - 0x00, - 0x18, - 0x00, - 0x19, - 0x00, - 0x1a, - 0x00, - 0x1b, - 0x00, - 0x1c, - 0x00, - 0x1d, - 0x00, - 0x1e, - 0x00, - 0x1f, - 0x00, - 0x20, - 0x00, - 0x21, - 0x00, - 0x22, - 0x00, - 0x23, - 0x00, - 0x24, - 0x00, - 0x25, - 0x00, - 0x26, - 0x00, - 0x27, - 0x00, - 0x28, - 0x00, - 0x29, - 0x00, - 0x2a, - 0x00, - 0x2b, - 0x00, - 0x2c, - 0x00, - 0x2d, - 0x00, - 0x2e, - 0x00, - 0x2f, - 0x00, - 0x30, - 0x00, - 0x31, - 0x00, - 0x32, - 0x00, - 0x33, - 0x00, - 0x34, - 0x00, - 0x35, - 0x00, - 0x36, - 0x00, - 0x37, - 0x00, - 0x38, - 0x00, - 0x39, - 0x00, - 0x3a, - 0x00, - 0x3b, - 0x00, - 0x3c, - 0x00, - 0x3d, - 0x00, - 0x3e, - 0x00, - 0x3f, - 0x00, - 0x40, - 0x00, - 0x41, - 0x00, - 0x42, - 0x00, - 0x43, - 0x00, - 0x44, - 0x00, - 0x45, - 0x00, - 0x46, - 0x00, - 0x47, - 0x00, - 0x48, - 0x00, - 0x49, - 0x00, - 0x4a, - 0x00, - 0x4b, - 0x00, - 0x4c, - 0x00, - 0x4d, - 0x00, - 0x4e, - 0x00, - 0x4f, - 0x00, - 0x50, - 0x00, - 0x51, - 0x00, - 0x52, - 0x00, - 0x53, - 0x00, - 0x54, - 0x00, - 0x55, - 0x00, - 0x56, - 0x00, - 0x57, - 0x00, - 0x58, - 0x00, - 0x59, - 0x00, - 0x5a, - 0x00, - 0x02, - 0x00, - 0x5b, - 0x00, - 0x02, - 0x00, - 0x5c, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x5f, - 0x00, - 0x5d, - 0x00, - 0x60, - 0x00, - 0x61, - 0x00, - 0x62, - 0x00, - 0x63, - 0x00, - 0x64, - 0x00, - 0x65, - 0x00, - 0x66, - 0x00, - 0x02, - 0x00, - 0x67, - 0x00, - 0x68, - 0x00, - 0x69, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x6a, - 0x00, - 0x5d, - 0x00, - 0x6b, - 0x00, - 0x6c, - 0x00, - 0x6d, - 0x00, - 0x6e, - 0x00, - 0x6f, - 0x00, - 0x70, - 0x00, - 0x71, - 0x00, - 0x72, - 0x00, - 0x73, - 0x00, - 0x74, - 0x00, - 0x75, - 0x00, - 0x76, - 0x00, - 0x77, - 0x00, - 0x78, - 0x00, - 0x5d, - 0x00, - 0xbf, - 0x09, - 0x00, - 0x00, - 0xa5, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x79, - 0x00, - 0x7a, - 0x00, - 0x7b, - 0x00, - 0x02, - 0x00, - 0x7c, - 0x00, - 0x7d, - 0x00, - 0x7e, - 0x00, - 0x7f, - 0x00, - 0x80, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0x82, - 0x00, - 0x83, - 0x00, - 0x84, - 0x00, - 0x85, - 0x00, - 0x86, - 0x00, - 0x0a, - 0x00, - 0x02, - 0x00, - 0x87, - 0x00, - 0x88, - 0x00, - 0x89, - 0x00, - 0x8a, - 0x00, - 0x8b, - 0x00, - 0x8c, - 0x00, - 0x8d, - 0x00, - 0x8e, - 0x00, - 0x8f, - 0x00, - 0x90, - 0x00, - 0x91, - 0x00, - 0x92, - 0x00, - 0x93, - 0x00, - 0x94, - 0x00, - 0x95, - 0x00, - 0x96, - 0x00, - 0x97, - 0x00, - 0x98, - 0x00, - 0x99, - 0x00, - 0x9a, - 0x00, - 0x9b, - 0x00, - 0x9c, - 0x00, - 0x9d, - 0x00, - 0x9e, - 0x00, - 0x9f, - 0x00, - 0xa0, - 0x00, - 0xa1, - 0x00, - 0xa2, - 0x00, - 0xa3, - 0x00, - 0xa4, - 0x00, - 0xa5, - 0x00, - 0xa6, - 0x00, - 0xa7, - 0x00, - 0xa8, - 0x00, - 0xa9, - 0x00, - 0xaa, - 0x00, - 0xab, - 0x00, - 0xac, - 0x00, - 0xad, - 0x00, - 0xae, - 0x00, - 0xaf, - 0x00, - 0xb0, - 0x00, - 0xb1, - 0x00, - 0xb2, - 0x00, - 0xb3, - 0x00, - 0xb4, - 0x00, - 0xb5, - 0x00, - 0xb6, - 0x00, - 0xb7, - 0x00, - 0xb8, - 0x00, - 0xb9, - 0x00, - 0xba, - 0x00, - 0xbb, - 0x00, - 0xbc, - 0x00, - 0xbd, - 0x00, - 0xbe, - 0x00, - 0xbf, - 0x00, - 0xc0, - 0x00, - 0xc1, - 0x00, - 0xc2, - 0x00, - 0xc3, - 0x00, - 0xc4, - 0x00, - 0xc5, - 0x00, - 0xc6, - 0x00, - 0xc7, - 0x00, - 0xc8, - 0x00, - 0xc9, - 0x00, - 0xca, - 0x00, - 0xcb, - 0x00, - 0xcc, - 0x00, - 0xcd, - 0x00, - 0xce, - 0x00, - 0xcf, - 0x00, - 0x54, - 0x00, - 0xd0, - 0x00, - 0x02, - 0x00, - 0x87, - 0x00, - 0xd1, - 0x00, - 0xd2, - 0x00, - 0xd3, - 0x00, - 0xd4, - 0x00, - 0xd5, - 0x00, - 0xd6, - 0x00, - 0x5a, - 0x00, - 0x02, - 0x00, - 0xd7, - 0x00, - 0xd8, - 0x00, - 0xd9, - 0x00, - 0xda, - 0x00, - 0x02, - 0x00, - 0xdb, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0xdc, - 0x00, - 0x5d, - 0x00, - 0xdd, - 0x00, - 0xde, - 0x00, - 0x02, - 0x00, - 0xdf, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0xe0, - 0x00, - 0x5d, - 0x00, - 0xe1, - 0x00, - 0xe2, - 0x00, - 0x02, - 0x00, - 0xe3, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0xe4, - 0x00, - 0x5d, - 0x00, - 0xe5, - 0x00, - 0xe6, - 0x00, - 0x02, - 0x00, - 0xe7, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0xe8, - 0x00, - 0x5d, - 0x00, - 0xe9, - 0x00, - 0xea, - 0x00, - 0x02, - 0x00, - 0xeb, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0xec, - 0x00, - 0xed, - 0x00, - 0xee, - 0x00, - 0xef, - 0x00, - 0xf0, - 0x00, - 0xf1, - 0x00, - 0xf2, - 0x00, - 0xf3, - 0x00, - 0xf4, - 0x00, - 0xf5, - 0x00, - 0xf6, - 0x00, - 0xf7, - 0x00, - 0xf8, - 0x00, - 0x5d, - 0x00, - 0xf9, - 0x00, - 0x5d, - 0x00, - 0x51, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x79, - 0x00, - 0x7a, - 0x00, - 0x5a, - 0x00, - 0x02, - 0x00, - 0x5d, - 0x00, - 0x80, - 0x10, - 0x00, - 0x00, - 0xe0, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x79, - 0x00, - 0x7a, - 0x00, - 0x7b, - 0x00, - 0x02, - 0x00, - 0x7c, - 0x00, - 0x7d, - 0x00, - 0x7e, - 0x00, - 0x7f, - 0x00, - 0x80, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0xfa, - 0x00, - 0xfb, - 0x00, - 0xfc, - 0x00, - 0xfd, - 0x00, - 0xfe, - 0x00, - 0x0a, - 0x00, - 0x02, - 0x00, - 0x87, - 0x00, - 0x88, - 0x00, - 0x89, - 0x00, - 0x8a, - 0x00, - 0x8b, - 0x00, - 0x8c, - 0x00, - 0x8d, - 0x00, - 0x8e, - 0x00, - 0x8f, - 0x00, - 0x90, - 0x00, - 0x91, - 0x00, - 0x92, - 0x00, - 0x93, - 0x00, - 0x94, - 0x00, - 0x95, - 0x00, - 0x96, - 0x00, - 0x97, - 0x00, - 0x98, - 0x00, - 0x99, - 0x00, - 0x9a, - 0x00, - 0x9b, - 0x00, - 0x9c, - 0x00, - 0x9d, - 0x00, - 0x9e, - 0x00, - 0x9f, - 0x00, - 0xa0, - 0x00, - 0xa1, - 0x00, - 0xa2, - 0x00, - 0xa3, - 0x00, - 0xa4, - 0x00, - 0xa5, - 0x00, - 0xa6, - 0x00, - 0xa7, - 0x00, - 0xa8, - 0x00, - 0xa9, - 0x00, - 0xaa, - 0x00, - 0xab, - 0x00, - 0xac, - 0x00, - 0xad, - 0x00, - 0xae, - 0x00, - 0xaf, - 0x00, - 0xb0, - 0x00, - 0xb1, - 0x00, - 0xb2, - 0x00, - 0xb3, - 0x00, - 0xb4, - 0x00, - 0xb5, - 0x00, - 0xb6, - 0x00, - 0xb7, - 0x00, - 0xb8, - 0x00, - 0xb9, - 0x00, - 0xba, - 0x00, - 0xbb, - 0x00, - 0xbc, - 0x00, - 0xbd, - 0x00, - 0xbe, - 0x00, - 0xbf, - 0x00, - 0xc0, - 0x00, - 0xc1, - 0x00, - 0xc2, - 0x00, - 0xc3, - 0x00, - 0xc4, - 0x00, - 0xc5, - 0x00, - 0xc6, - 0x00, - 0xc7, - 0x00, - 0xc8, - 0x00, - 0xc9, - 0x00, - 0xca, - 0x00, - 0xcb, - 0x00, - 0xcc, - 0x00, - 0xcd, - 0x00, - 0xce, - 0x00, - 0xcf, - 0x00, - 0x54, - 0x00, - 0xd0, - 0x00, - 0x02, - 0x00, - 0x87, - 0x00, - 0xd1, - 0x00, - 0xd2, - 0x00, - 0xd3, - 0x00, - 0xff, - 0x00, - 0xd4, - 0x00, - 0x00, - 0x01, - 0xd5, - 0x00, - 0xd6, - 0x00, - 0x01, - 0x01, - 0x02, - 0x00, - 0x02, - 0x01, - 0x03, - 0x01, - 0x02, - 0x00, - 0x04, - 0x01, - 0x5d, - 0x00, - 0x05, - 0x01, - 0x06, - 0x01, - 0x07, - 0x01, - 0x02, - 0x00, - 0x08, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x09, - 0x01, - 0x5d, - 0x00, - 0x0a, - 0x01, - 0x0b, - 0x01, - 0x0c, - 0x01, - 0x0d, - 0x01, - 0x0e, - 0x01, - 0x02, - 0x00, - 0x0f, - 0x01, - 0x10, - 0x01, - 0x11, - 0x01, - 0x12, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x13, - 0x01, - 0x5d, - 0x00, - 0x14, - 0x01, - 0x15, - 0x01, - 0x16, - 0x01, - 0x02, - 0x00, - 0x17, - 0x01, - 0x18, - 0x01, - 0x19, - 0x01, - 0x1a, - 0x01, - 0x1b, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x1c, - 0x01, - 0x5d, - 0x00, - 0x1d, - 0x01, - 0x1e, - 0x01, - 0x1f, - 0x01, - 0x20, - 0x01, - 0x21, - 0x01, - 0x04, - 0x01, - 0x5d, - 0x00, - 0x5a, - 0x00, - 0x02, - 0x00, - 0x22, - 0x01, - 0x23, - 0x01, - 0x24, - 0x01, - 0x25, - 0x01, - 0x02, - 0x00, - 0x26, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x27, - 0x01, - 0x5d, - 0x00, - 0x28, - 0x01, - 0x29, - 0x01, - 0x02, - 0x00, - 0x2a, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x2b, - 0x01, - 0x5d, - 0x00, - 0x2c, - 0x01, - 0x2d, - 0x01, - 0x02, - 0x00, - 0x2e, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x2f, - 0x01, - 0x5d, - 0x00, - 0x30, - 0x01, - 0x31, - 0x01, - 0x02, - 0x00, - 0x32, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x33, - 0x01, - 0x5d, - 0x00, - 0x34, - 0x01, - 0x35, - 0x01, - 0x02, - 0x00, - 0x36, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x37, - 0x01, - 0x38, - 0x01, - 0x39, - 0x01, - 0x3a, - 0x01, - 0x3b, - 0x01, - 0x3c, - 0x01, - 0x3d, - 0x01, - 0x3e, - 0x01, - 0x3f, - 0x01, - 0x40, - 0x01, - 0x41, - 0x01, - 0x42, - 0x01, - 0x43, - 0x01, - 0x5d, - 0x00, - 0x44, - 0x01, - 0x45, - 0x01, - 0x46, - 0x01, - 0x47, - 0x01, - 0x48, - 0x01, - 0x5d, - 0x00, - 0xec, - 0x02, - 0x00, - 0x00, - 0x1d, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x79, - 0x00, - 0x7a, - 0x00, - 0x49, - 0x01, - 0x02, - 0x00, - 0x4a, - 0x01, - 0x4b, - 0x01, - 0x4c, - 0x01, - 0x4d, - 0x01, - 0x4e, - 0x01, - 0x4f, - 0x01, - 0x50, - 0x01, - 0x05, - 0x00, - 0x51, - 0x01, - 0x52, - 0x01, - 0x08, - 0x00, - 0x53, - 0x01, - 0x54, - 0x01, - 0x55, - 0x01, - 0x02, - 0x00, - 0x56, - 0x01, - 0x57, - 0x01, - 0x58, - 0x01, - 0x59, - 0x01, - 0x5a, - 0x00, - 0x02, - 0x00, - 0x5a, - 0x01, - 0x5b, - 0x01, - 0x5d, - 0x00, - 0x91, - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x79, - 0x00, - 0x7a, - 0x00, - 0xd6, - 0x00, - 0x5a, - 0x00, - 0x02, - 0x00, - 0x5c, - 0x01, - 0x5d, - 0x00, - 0xba, - 0x0b, - 0x00, - 0x00, - 0x92, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x5d, - 0x01, - 0x01, - 0x00, - 0x02, - 0x00, - 0x03, - 0x00, - 0x04, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x08, - 0x00, - 0x09, - 0x00, - 0x5e, - 0x01, - 0x5f, - 0x01, - 0x08, - 0x00, - 0x60, - 0x01, - 0x0a, - 0x00, - 0x02, - 0x00, - 0x0b, - 0x00, - 0x0c, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x11, - 0x00, - 0x12, - 0x00, - 0x13, - 0x00, - 0x14, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x17, - 0x00, - 0x18, - 0x00, - 0x19, - 0x00, - 0x1a, - 0x00, - 0x1b, - 0x00, - 0x1c, - 0x00, - 0x1d, - 0x00, - 0x1e, - 0x00, - 0x1f, - 0x00, - 0x20, - 0x00, - 0x21, - 0x00, - 0x22, - 0x00, - 0x23, - 0x00, - 0x24, - 0x00, - 0x25, - 0x00, - 0x26, - 0x00, - 0x27, - 0x00, - 0x28, - 0x00, - 0x29, - 0x00, - 0x2a, - 0x00, - 0x2b, - 0x00, - 0x2c, - 0x00, - 0x2d, - 0x00, - 0x2e, - 0x00, - 0x2f, - 0x00, - 0x30, - 0x00, - 0x31, - 0x00, - 0x32, - 0x00, - 0x33, - 0x00, - 0x34, - 0x00, - 0x35, - 0x00, - 0x36, - 0x00, - 0x37, - 0x00, - 0x38, - 0x00, - 0x39, - 0x00, - 0x3a, - 0x00, - 0x3b, - 0x00, - 0x3c, - 0x00, - 0x3d, - 0x00, - 0x3e, - 0x00, - 0x3f, - 0x00, - 0x40, - 0x00, - 0x41, - 0x00, - 0x42, - 0x00, - 0x43, - 0x00, - 0x44, - 0x00, - 0x45, - 0x00, - 0x46, - 0x00, - 0x47, - 0x00, - 0x48, - 0x00, - 0x49, - 0x00, - 0x4a, - 0x00, - 0x4b, - 0x00, - 0x4c, - 0x00, - 0x4d, - 0x00, - 0x4e, - 0x00, - 0x4f, - 0x00, - 0x50, - 0x00, - 0x51, - 0x00, - 0x52, - 0x00, - 0x53, - 0x00, - 0x54, - 0x00, - 0x55, - 0x00, - 0x56, - 0x00, - 0x57, - 0x00, - 0x58, - 0x00, - 0x59, - 0x00, - 0x5a, - 0x00, - 0x02, - 0x00, - 0x5b, - 0x00, - 0x02, - 0x00, - 0x5c, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x5f, - 0x00, - 0x5d, - 0x00, - 0x61, - 0x01, - 0x62, - 0x01, - 0x63, - 0x01, - 0x64, - 0x01, - 0x65, - 0x01, - 0x66, - 0x01, - 0x67, - 0x01, - 0x02, - 0x00, - 0x68, - 0x01, - 0x69, - 0x01, - 0x6a, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x6b, - 0x01, - 0x5d, - 0x00, - 0x6c, - 0x01, - 0x6d, - 0x01, - 0x6e, - 0x01, - 0x6f, - 0x01, - 0x70, - 0x01, - 0x71, - 0x01, - 0x72, - 0x01, - 0x73, - 0x01, - 0x74, - 0x01, - 0x75, - 0x01, - 0x76, - 0x01, - 0x77, - 0x01, - 0x78, - 0x01, - 0x79, - 0x01, - 0x7a, - 0x01, - 0x7b, - 0x01, - 0x7c, - 0x01, - 0x7d, - 0x01, - 0x7e, - 0x01, - 0x7f, - 0x01, - 0x80, - 0x01, - 0x81, - 0x01, - 0x82, - 0x01, - 0x5d, - 0x00, - 0xd7, - 0x08, - 0x00, - 0x00, - 0x85, - 0x00, - 0x00, - 0x00, - 0x83, - 0x01, - 0x84, - 0x01, - 0x01, - 0x00, - 0x02, - 0x00, - 0x03, - 0x00, - 0x04, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x08, - 0x00, - 0x09, - 0x00, - 0x0a, - 0x00, - 0x02, - 0x00, - 0x0b, - 0x00, - 0x0c, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x11, - 0x00, - 0x12, - 0x00, - 0x13, - 0x00, - 0x14, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x17, - 0x00, - 0x18, - 0x00, - 0x19, - 0x00, - 0x96, - 0x00, - 0x97, - 0x00, - 0x98, - 0x00, - 0x1d, - 0x00, - 0x1e, - 0x00, - 0x1f, - 0x00, - 0x20, - 0x00, - 0x9d, - 0x00, - 0x9e, - 0x00, - 0x9f, - 0x00, - 0xa0, - 0x00, - 0xa1, - 0x00, - 0xa2, - 0x00, - 0xa3, - 0x00, - 0xa4, - 0x00, - 0xa5, - 0x00, - 0xa6, - 0x00, - 0xa7, - 0x00, - 0x2c, - 0x00, - 0xa9, - 0x00, - 0xaa, - 0x00, - 0xab, - 0x00, - 0x30, - 0x00, - 0xad, - 0x00, - 0xae, - 0x00, - 0x33, - 0x00, - 0xb0, - 0x00, - 0xb1, - 0x00, - 0x36, - 0x00, - 0xb3, - 0x00, - 0xb4, - 0x00, - 0xb5, - 0x00, - 0xb6, - 0x00, - 0x3b, - 0x00, - 0x3c, - 0x00, - 0xb9, - 0x00, - 0x3e, - 0x00, - 0x3f, - 0x00, - 0x40, - 0x00, - 0xbd, - 0x00, - 0xbe, - 0x00, - 0x43, - 0x00, - 0xc0, - 0x00, - 0x45, - 0x00, - 0x46, - 0x00, - 0x47, - 0x00, - 0x48, - 0x00, - 0x49, - 0x00, - 0xc6, - 0x00, - 0xc7, - 0x00, - 0xc8, - 0x00, - 0xc9, - 0x00, - 0x4e, - 0x00, - 0xcb, - 0x00, - 0xcc, - 0x00, - 0xcd, - 0x00, - 0xce, - 0x00, - 0xcf, - 0x00, - 0x54, - 0x00, - 0x55, - 0x00, - 0x85, - 0x01, - 0x86, - 0x01, - 0x87, - 0x01, - 0x88, - 0x01, - 0x5a, - 0x00, - 0x02, - 0x00, - 0x5b, - 0x00, - 0x02, - 0x00, - 0x5c, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x5f, - 0x00, - 0x5d, - 0x00, - 0x89, - 0x01, - 0x8a, - 0x01, - 0x8b, - 0x01, - 0x8c, - 0x01, - 0x8d, - 0x01, - 0x8e, - 0x01, - 0x8f, - 0x01, - 0x02, - 0x00, - 0x90, - 0x01, - 0x91, - 0x01, - 0x92, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x93, - 0x01, - 0x5d, - 0x00, - 0x94, - 0x01, - 0x95, - 0x01, - 0x96, - 0x01, - 0x97, - 0x01, - 0x98, - 0x01, - 0x99, - 0x01, - 0x9a, - 0x01, - 0x9b, - 0x01, - 0x73, - 0x00, - 0x74, - 0x00, - 0x75, - 0x00, - 0x9c, - 0x01, - 0x9d, - 0x01, - 0x9e, - 0x01, - 0x5d, - 0x00, - 0xe9, - 0x08, - 0x00, - 0x00, - 0xa4, - 0x00, - 0x00, - 0x00, - 0x83, - 0x01, - 0x84, - 0x01, - 0x7b, - 0x00, - 0x02, - 0x00, - 0x7c, - 0x00, - 0x7d, - 0x00, - 0x7e, - 0x00, - 0x7f, - 0x00, - 0x80, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0x82, - 0x00, - 0x83, - 0x00, - 0x84, - 0x00, - 0x85, - 0x00, - 0x86, - 0x00, - 0x0a, - 0x00, - 0x02, - 0x00, - 0x0b, - 0x00, - 0x0c, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x11, - 0x00, - 0x12, - 0x00, - 0x13, - 0x00, - 0x14, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x17, - 0x00, - 0x18, - 0x00, - 0x19, - 0x00, - 0x96, - 0x00, - 0x97, - 0x00, - 0x98, - 0x00, - 0x1d, - 0x00, - 0x1e, - 0x00, - 0x1f, - 0x00, - 0x20, - 0x00, - 0x9d, - 0x00, - 0x9e, - 0x00, - 0x9f, - 0x00, - 0xa0, - 0x00, - 0xa1, - 0x00, - 0xa2, - 0x00, - 0xa3, - 0x00, - 0xa4, - 0x00, - 0xa5, - 0x00, - 0xa6, - 0x00, - 0xa7, - 0x00, - 0x2c, - 0x00, - 0xa9, - 0x00, - 0xaa, - 0x00, - 0xab, - 0x00, - 0x30, - 0x00, - 0xad, - 0x00, - 0xae, - 0x00, - 0x33, - 0x00, - 0xb0, - 0x00, - 0xb1, - 0x00, - 0x36, - 0x00, - 0xb3, - 0x00, - 0xb4, - 0x00, - 0xb5, - 0x00, - 0xb6, - 0x00, - 0x3b, - 0x00, - 0x3c, - 0x00, - 0xb9, - 0x00, - 0x3e, - 0x00, - 0x3f, - 0x00, - 0x40, - 0x00, - 0xbd, - 0x00, - 0xbe, - 0x00, - 0x43, - 0x00, - 0xc0, - 0x00, - 0x45, - 0x00, - 0x46, - 0x00, - 0x47, - 0x00, - 0x48, - 0x00, - 0x49, - 0x00, - 0xc6, - 0x00, - 0xc7, - 0x00, - 0xc8, - 0x00, - 0xc9, - 0x00, - 0x4e, - 0x00, - 0xcb, - 0x00, - 0xcc, - 0x00, - 0xcd, - 0x00, - 0xce, - 0x00, - 0xcf, - 0x00, - 0x54, - 0x00, - 0xd0, - 0x00, - 0x02, - 0x00, - 0x0b, - 0x00, - 0xd1, - 0x00, - 0xd2, - 0x00, - 0xd3, - 0x00, - 0x9f, - 0x01, - 0xa0, - 0x01, - 0xd6, - 0x00, - 0x5a, - 0x00, - 0x02, - 0x00, - 0xa1, - 0x01, - 0xa2, - 0x01, - 0xd8, - 0x00, - 0xd9, - 0x00, - 0xda, - 0x00, - 0x02, - 0x00, - 0xdb, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0xdc, - 0x00, - 0x5d, - 0x00, - 0xdd, - 0x00, - 0xde, - 0x00, - 0x02, - 0x00, - 0xdf, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0xe0, - 0x00, - 0x5d, - 0x00, - 0xe1, - 0x00, - 0xe2, - 0x00, - 0x02, - 0x00, - 0xe3, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0xe4, - 0x00, - 0x5d, - 0x00, - 0xe5, - 0x00, - 0xe6, - 0x00, - 0x02, - 0x00, - 0xe7, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0xe8, - 0x00, - 0x5d, - 0x00, - 0xe9, - 0x00, - 0xea, - 0x00, - 0x02, - 0x00, - 0xeb, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0xec, - 0x00, - 0xed, - 0x00, - 0xee, - 0x00, - 0xef, - 0x00, - 0xf0, - 0x00, - 0xf1, - 0x00, - 0xf2, - 0x00, - 0xf3, - 0x00, - 0xa3, - 0x01, - 0xa4, - 0x01, - 0xa5, - 0x01, - 0xa6, - 0x01, - 0x5d, - 0x00, - 0xf9, - 0x00, - 0x5d, - 0x00, - 0x52, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x00, - 0x00, - 0x83, - 0x01, - 0x84, - 0x01, - 0x5a, - 0x00, - 0x02, - 0x00, - 0x5d, - 0x00, - 0xa5, - 0x0e, - 0x00, - 0x00, - 0xd7, - 0x00, - 0x00, - 0x00, - 0x83, - 0x01, - 0x84, - 0x01, - 0x7b, - 0x00, - 0x02, - 0x00, - 0x7c, - 0x00, - 0x7d, - 0x00, - 0x7e, - 0x00, - 0x7f, - 0x00, - 0x80, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0xfa, - 0x00, - 0xfb, - 0x00, - 0xfc, - 0x00, - 0xfd, - 0x00, - 0xfe, - 0x00, - 0x0a, - 0x00, - 0x02, - 0x00, - 0x0b, - 0x00, - 0x0c, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x11, - 0x00, - 0x12, - 0x00, - 0x13, - 0x00, - 0x14, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x17, - 0x00, - 0x18, - 0x00, - 0x19, - 0x00, - 0x96, - 0x00, - 0x97, - 0x00, - 0x98, - 0x00, - 0x1d, - 0x00, - 0x1e, - 0x00, - 0x1f, - 0x00, - 0x20, - 0x00, - 0x9d, - 0x00, - 0x9e, - 0x00, - 0x9f, - 0x00, - 0xa0, - 0x00, - 0xa1, - 0x00, - 0xa2, - 0x00, - 0xa3, - 0x00, - 0xa4, - 0x00, - 0xa5, - 0x00, - 0xa6, - 0x00, - 0xa7, - 0x00, - 0x2c, - 0x00, - 0xa9, - 0x00, - 0xaa, - 0x00, - 0xab, - 0x00, - 0x30, - 0x00, - 0xad, - 0x00, - 0xae, - 0x00, - 0x33, - 0x00, - 0xb0, - 0x00, - 0xb1, - 0x00, - 0x36, - 0x00, - 0xb3, - 0x00, - 0xb4, - 0x00, - 0xb5, - 0x00, - 0xb6, - 0x00, - 0x3b, - 0x00, - 0x3c, - 0x00, - 0xb9, - 0x00, - 0x3e, - 0x00, - 0x3f, - 0x00, - 0x40, - 0x00, - 0xbd, - 0x00, - 0xbe, - 0x00, - 0x43, - 0x00, - 0xc0, - 0x00, - 0x45, - 0x00, - 0x46, - 0x00, - 0x47, - 0x00, - 0x48, - 0x00, - 0x49, - 0x00, - 0xc6, - 0x00, - 0xc7, - 0x00, - 0xc8, - 0x00, - 0xc9, - 0x00, - 0x4e, - 0x00, - 0xcb, - 0x00, - 0xcc, - 0x00, - 0xcd, - 0x00, - 0xce, - 0x00, - 0xcf, - 0x00, - 0x54, - 0x00, - 0xd0, - 0x00, - 0x02, - 0x00, - 0x0b, - 0x00, - 0xd1, - 0x00, - 0xd2, - 0x00, - 0xd3, - 0x00, - 0xa7, - 0x01, - 0x9f, - 0x01, - 0xa8, - 0x01, - 0xa0, - 0x01, - 0xd6, - 0x00, - 0xa9, - 0x01, - 0x02, - 0x00, - 0xaa, - 0x01, - 0x03, - 0x01, - 0x02, - 0x00, - 0x04, - 0x01, - 0x5d, - 0x00, - 0xab, - 0x01, - 0xac, - 0x01, - 0x07, - 0x01, - 0x02, - 0x00, - 0x08, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x09, - 0x01, - 0x5d, - 0x00, - 0xad, - 0x01, - 0x0d, - 0x01, - 0x0e, - 0x01, - 0x02, - 0x00, - 0xae, - 0x01, - 0xaf, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x13, - 0x01, - 0x5d, - 0x00, - 0x14, - 0x01, - 0x15, - 0x01, - 0x16, - 0x01, - 0x02, - 0x00, - 0xb0, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x1c, - 0x01, - 0x5d, - 0x00, - 0x1d, - 0x01, - 0x1e, - 0x01, - 0x1f, - 0x01, - 0x20, - 0x01, - 0x21, - 0x01, - 0x04, - 0x01, - 0x5d, - 0x00, - 0x5a, - 0x00, - 0x02, - 0x00, - 0xb1, - 0x01, - 0xb2, - 0x01, - 0x23, - 0x01, - 0x24, - 0x01, - 0x25, - 0x01, - 0x02, - 0x00, - 0x26, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x27, - 0x01, - 0x5d, - 0x00, - 0x28, - 0x01, - 0x29, - 0x01, - 0x02, - 0x00, - 0x2a, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x2b, - 0x01, - 0x5d, - 0x00, - 0x2c, - 0x01, - 0x2d, - 0x01, - 0x02, - 0x00, - 0x2e, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x2f, - 0x01, - 0x5d, - 0x00, - 0x30, - 0x01, - 0x31, - 0x01, - 0x02, - 0x00, - 0x32, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x33, - 0x01, - 0x5d, - 0x00, - 0x34, - 0x01, - 0x35, - 0x01, - 0x02, - 0x00, - 0x36, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x37, - 0x01, - 0x38, - 0x01, - 0x39, - 0x01, - 0x3a, - 0x01, - 0x3b, - 0x01, - 0x3c, - 0x01, - 0x3d, - 0x01, - 0x3e, - 0x01, - 0xb3, - 0x01, - 0xb4, - 0x01, - 0xb5, - 0x01, - 0xb6, - 0x01, - 0x5d, - 0x00, - 0x44, - 0x01, - 0x45, - 0x01, - 0xb7, - 0x01, - 0x47, - 0x01, - 0x48, - 0x01, - 0x5d, - 0x00, - 0xcc, - 0x02, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0x83, - 0x01, - 0x84, - 0x01, - 0x49, - 0x01, - 0x02, - 0x00, - 0xb8, - 0x01, - 0xb9, - 0x01, - 0xba, - 0x01, - 0xbb, - 0x01, - 0xbc, - 0x01, - 0xbd, - 0x01, - 0xbe, - 0x01, - 0x05, - 0x00, - 0x51, - 0x01, - 0x52, - 0x01, - 0x08, - 0x00, - 0x53, - 0x01, - 0x54, - 0x01, - 0x55, - 0x01, - 0x02, - 0x00, - 0x56, - 0x01, - 0x57, - 0x01, - 0xbf, - 0x01, - 0xc0, - 0x01, - 0x5a, - 0x00, - 0x02, - 0x00, - 0x5a, - 0x01, - 0x5b, - 0x01, - 0x5d, - 0x00, - 0x92, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x83, - 0x01, - 0x84, - 0x01, - 0xd6, - 0x00, - 0x5a, - 0x00, - 0x02, - 0x00, - 0x5c, - 0x01, - 0x5d, - 0x00, - 0x0e, - 0x0b, - 0x00, - 0x00, - 0x92, - 0x00, - 0x00, - 0x00, - 0x83, - 0x01, - 0x84, - 0x01, - 0x01, - 0x00, - 0x02, - 0x00, - 0x03, - 0x00, - 0x04, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x08, - 0x00, - 0x09, - 0x00, - 0x5e, - 0x01, - 0x5f, - 0x01, - 0x08, - 0x00, - 0x60, - 0x01, - 0x0a, - 0x00, - 0x02, - 0x00, - 0x0b, - 0x00, - 0x0c, - 0x00, - 0x0d, - 0x00, - 0x0e, - 0x00, - 0x0f, - 0x00, - 0x10, - 0x00, - 0x11, - 0x00, - 0x12, - 0x00, - 0x13, - 0x00, - 0x14, - 0x00, - 0x15, - 0x00, - 0x16, - 0x00, - 0x17, - 0x00, - 0x18, - 0x00, - 0x19, - 0x00, - 0x96, - 0x00, - 0x97, - 0x00, - 0x98, - 0x00, - 0x1d, - 0x00, - 0x1e, - 0x00, - 0x1f, - 0x00, - 0x20, - 0x00, - 0x9d, - 0x00, - 0x9e, - 0x00, - 0x9f, - 0x00, - 0xa0, - 0x00, - 0xa1, - 0x00, - 0xa2, - 0x00, - 0xa3, - 0x00, - 0xa4, - 0x00, - 0xa5, - 0x00, - 0xa6, - 0x00, - 0xa7, - 0x00, - 0x2c, - 0x00, - 0xa9, - 0x00, - 0xaa, - 0x00, - 0xab, - 0x00, - 0x30, - 0x00, - 0xad, - 0x00, - 0xae, - 0x00, - 0x33, - 0x00, - 0xb0, - 0x00, - 0xb1, - 0x00, - 0x36, - 0x00, - 0xb3, - 0x00, - 0xb4, - 0x00, - 0xb5, - 0x00, - 0xb6, - 0x00, - 0x3b, - 0x00, - 0x3c, - 0x00, - 0xb9, - 0x00, - 0x3e, - 0x00, - 0x3f, - 0x00, - 0x40, - 0x00, - 0xbd, - 0x00, - 0xbe, - 0x00, - 0x43, - 0x00, - 0xc0, - 0x00, - 0x45, - 0x00, - 0x46, - 0x00, - 0x47, - 0x00, - 0x48, - 0x00, - 0x49, - 0x00, - 0xc6, - 0x00, - 0xc7, - 0x00, - 0xc8, - 0x00, - 0xc9, - 0x00, - 0x4e, - 0x00, - 0xcb, - 0x00, - 0xcc, - 0x00, - 0xcd, - 0x00, - 0xce, - 0x00, - 0xcf, - 0x00, - 0x54, - 0x00, - 0x55, - 0x00, - 0x85, - 0x01, - 0x86, - 0x01, - 0x87, - 0x01, - 0x88, - 0x01, - 0x5a, - 0x00, - 0x02, - 0x00, - 0x5b, - 0x00, - 0x02, - 0x00, - 0x5c, - 0x00, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0x5f, - 0x00, - 0x5d, - 0x00, - 0xc1, - 0x01, - 0xc2, - 0x01, - 0xc3, - 0x01, - 0xc4, - 0x01, - 0xc5, - 0x01, - 0xc6, - 0x01, - 0xc7, - 0x01, - 0x02, - 0x00, - 0xc8, - 0x01, - 0xc9, - 0x01, - 0xca, - 0x01, - 0x5d, - 0x00, - 0x5e, - 0x00, - 0x02, - 0x00, - 0xcb, - 0x01, - 0x5d, - 0x00, - 0xcc, - 0x01, - 0xcd, - 0x01, - 0xce, - 0x01, - 0xcf, - 0x01, - 0xd0, - 0x01, - 0xd1, - 0x01, - 0xd2, - 0x01, - 0xd3, - 0x01, - 0xd4, - 0x01, - 0xd5, - 0x01, - 0xd6, - 0x01, - 0xd7, - 0x01, - 0xd8, - 0x01, - 0xd9, - 0x01, - 0xda, - 0x01, - 0xdb, - 0x01, - 0xdc, - 0x01, - 0xdd, - 0x01, - 0xde, - 0x01, - 0xdf, - 0x01, - 0xe0, - 0x01, - 0xe1, - 0x01, - 0x82, - 0x01, - 0x5d, - 0x00, - 0x4c, - 0x54, - 0x45, - 0x4d, - 0x5f, - 0x54, - 0x41, - 0x4d, - 0x52, - 0x0c, - 0x00, - 0x00, - 0x12, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x86, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x01, - 0x92, - 0x01, - 0x00, - 0x00, - 0x01, - 0x10, - 0x00, - 0x86, - 0x00, - 0x00, - 0x00, - 0x01, - 0x10, - 0x01, - 0xf6, - 0x02, - 0x00, - 0x00, - 0x01, - 0x20, - 0x01, - 0x10, - 0x03, - 0x00, - 0x00, - 0x01, - 0x30, - 0x01, - 0x04, - 0x05, - 0x00, - 0x00, - 0x01, - 0x44, - 0x01, - 0x68, - 0x05, - 0x00, - 0x00, - 0x01, - 0x80, - 0x00, - 0x92, - 0x05, - 0x00, - 0x00, - 0x01, - 0x90, - 0x00, - 0x92, - 0x05, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0xc2, - 0x06, - 0x00, - 0x00, - 0x02, - 0x00, - 0x01, - 0xce, - 0x07, - 0x00, - 0x00, - 0x02, - 0x10, - 0x00, - 0xc2, - 0x06, - 0x00, - 0x00, - 0x02, - 0x10, - 0x01, - 0xf6, - 0x02, - 0x00, - 0x00, - 0x02, - 0x20, - 0x01, - 0x32, - 0x09, - 0x00, - 0x00, - 0x02, - 0x30, - 0x01, - 0x04, - 0x05, - 0x00, - 0x00, - 0x02, - 0x44, - 0x01, - 0x68, - 0x05, - 0x00, - 0x00, - 0x02, - 0x80, - 0x00, - 0x22, - 0x0b, - 0x00, - 0x00, - 0x02, - 0x90, - 0x00, - 0x22, - 0x0b, - 0x00, - 0x00, - 0x66, - 0x0d, - 0x00, - 0x00, - 0x82, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x01, - 0xe3, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe4, - 0x01, - 0xe6, - 0x01, - 0x02, - 0x00, - 0xe7, - 0x01, - 0xe8, - 0x01, - 0xe9, - 0x01, - 0xea, - 0x01, - 0xeb, - 0x01, - 0xec, - 0x01, - 0xed, - 0x01, - 0xee, - 0x01, - 0xef, - 0x01, - 0xf0, - 0x01, - 0xf1, - 0x01, - 0xf2, - 0x01, - 0xf3, - 0x01, - 0xf4, - 0x01, - 0xf5, - 0x01, - 0xf6, - 0x01, - 0xf7, - 0x01, - 0xf8, - 0x01, - 0xf9, - 0x01, - 0xfa, - 0x01, - 0xfb, - 0x01, - 0xfc, - 0x01, - 0xfd, - 0x01, - 0xfe, - 0x01, - 0xff, - 0x01, - 0x00, - 0x02, - 0x01, - 0x02, - 0x02, - 0x02, - 0x03, - 0x02, - 0x04, - 0x02, - 0x05, - 0x02, - 0x06, - 0x02, - 0x07, - 0x02, - 0x08, - 0x02, - 0x09, - 0x02, - 0x0a, - 0x02, - 0x0b, - 0x02, - 0x0c, - 0x02, - 0x0d, - 0x02, - 0x0e, - 0x02, - 0x0f, - 0x02, - 0x10, - 0x02, - 0x11, - 0x02, - 0x12, - 0x02, - 0x13, - 0x02, - 0x14, - 0x02, - 0x15, - 0x02, - 0x16, - 0x02, - 0x17, - 0x02, - 0x18, - 0x02, - 0x19, - 0x02, - 0x1a, - 0x02, - 0x1b, - 0x02, - 0x1c, - 0x02, - 0x1d, - 0x02, - 0x1e, - 0x02, - 0x1f, - 0x02, - 0x20, - 0x02, - 0x21, - 0x02, - 0x22, - 0x02, - 0x23, - 0x02, - 0x24, - 0x02, - 0x25, - 0x02, - 0x26, - 0x02, - 0x27, - 0x02, - 0x28, - 0x02, - 0x29, - 0x02, - 0x2a, - 0x02, - 0x2b, - 0x02, - 0x2c, - 0x02, - 0x2d, - 0x02, - 0x2e, - 0x02, - 0x2f, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x30, - 0x02, - 0x02, - 0x00, - 0x31, - 0x02, - 0x32, - 0x02, - 0x33, - 0x02, - 0x34, - 0x02, - 0x35, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x36, - 0x02, - 0x02, - 0x00, - 0x37, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x38, - 0x02, - 0x02, - 0x00, - 0x39, - 0x02, - 0x3a, - 0x02, - 0x3b, - 0x02, - 0x3c, - 0x02, - 0x3d, - 0x02, - 0x3e, - 0x02, - 0x3f, - 0x02, - 0x40, - 0x02, - 0x41, - 0x02, - 0x42, - 0x02, - 0x43, - 0x02, - 0x44, - 0x02, - 0x45, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x48, - 0x02, - 0x46, - 0x02, - 0x49, - 0x02, - 0x4a, - 0x02, - 0x4b, - 0x02, - 0x4c, - 0x02, - 0x4d, - 0x02, - 0x4e, - 0x02, - 0x4f, - 0x02, - 0x50, - 0x02, - 0x51, - 0x02, - 0x52, - 0x02, - 0x53, - 0x02, - 0x54, - 0x02, - 0x5d, - 0x00, - 0xe4, - 0x01, - 0x64, - 0x10, - 0x00, - 0x00, - 0xae, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x01, - 0xe3, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe4, - 0x01, - 0xe6, - 0x01, - 0x02, - 0x00, - 0xe7, - 0x01, - 0xe8, - 0x01, - 0xe9, - 0x01, - 0xea, - 0x01, - 0xeb, - 0x01, - 0xec, - 0x01, - 0xed, - 0x01, - 0xee, - 0x01, - 0xef, - 0x01, - 0xf0, - 0x01, - 0xf1, - 0x01, - 0xf2, - 0x01, - 0xf3, - 0x01, - 0xf4, - 0x01, - 0xf5, - 0x01, - 0xf6, - 0x01, - 0xf7, - 0x01, - 0xf8, - 0x01, - 0xf9, - 0x01, - 0xfa, - 0x01, - 0xfb, - 0x01, - 0xfc, - 0x01, - 0xfd, - 0x01, - 0xfe, - 0x01, - 0xff, - 0x01, - 0x00, - 0x02, - 0x01, - 0x02, - 0x02, - 0x02, - 0x03, - 0x02, - 0x04, - 0x02, - 0x05, - 0x02, - 0x06, - 0x02, - 0x07, - 0x02, - 0x08, - 0x02, - 0x09, - 0x02, - 0x0a, - 0x02, - 0x0b, - 0x02, - 0x0c, - 0x02, - 0x0d, - 0x02, - 0x0e, - 0x02, - 0x0f, - 0x02, - 0x10, - 0x02, - 0x11, - 0x02, - 0x12, - 0x02, - 0x13, - 0x02, - 0x14, - 0x02, - 0x15, - 0x02, - 0x16, - 0x02, - 0x17, - 0x02, - 0x18, - 0x02, - 0x19, - 0x02, - 0x1a, - 0x02, - 0x1b, - 0x02, - 0x1c, - 0x02, - 0x1d, - 0x02, - 0x1e, - 0x02, - 0x1f, - 0x02, - 0x20, - 0x02, - 0x21, - 0x02, - 0x22, - 0x02, - 0x23, - 0x02, - 0x24, - 0x02, - 0x25, - 0x02, - 0x26, - 0x02, - 0x27, - 0x02, - 0x28, - 0x02, - 0x29, - 0x02, - 0x2a, - 0x02, - 0x2b, - 0x02, - 0x2c, - 0x02, - 0x2d, - 0x02, - 0x2e, - 0x02, - 0x2f, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x55, - 0x02, - 0x02, - 0x00, - 0x56, - 0x02, - 0x57, - 0x02, - 0x58, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x59, - 0x02, - 0xe4, - 0x01, - 0x5a, - 0x02, - 0x5b, - 0x02, - 0x5c, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x30, - 0x02, - 0x02, - 0x00, - 0x5d, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x36, - 0x02, - 0x02, - 0x00, - 0x31, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x5e, - 0x02, - 0x02, - 0x00, - 0x39, - 0x02, - 0x5f, - 0x02, - 0x60, - 0x02, - 0x61, - 0x02, - 0x62, - 0x02, - 0x63, - 0x02, - 0x42, - 0x02, - 0x64, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x65, - 0x02, - 0x46, - 0x02, - 0x66, - 0x02, - 0x67, - 0x02, - 0x42, - 0x02, - 0x68, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x69, - 0x02, - 0x46, - 0x02, - 0x6a, - 0x02, - 0x6b, - 0x02, - 0x42, - 0x02, - 0x6c, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x6d, - 0x02, - 0x46, - 0x02, - 0x6e, - 0x02, - 0x6f, - 0x02, - 0x42, - 0x02, - 0x70, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x71, - 0x02, - 0x46, - 0x02, - 0x72, - 0x02, - 0x73, - 0x02, - 0x42, - 0x02, - 0x74, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x75, - 0x02, - 0x76, - 0x02, - 0x77, - 0x02, - 0x78, - 0x02, - 0x79, - 0x02, - 0x7a, - 0x02, - 0x7b, - 0x02, - 0x7c, - 0x02, - 0x7d, - 0x02, - 0x7e, - 0x02, - 0x7f, - 0x02, - 0x80, - 0x02, - 0x81, - 0x02, - 0x82, - 0x02, - 0x46, - 0x02, - 0x83, - 0x02, - 0x54, - 0x02, - 0x5d, - 0x00, - 0xe4, - 0x01, - 0x64, - 0x00, - 0x00, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x01, - 0xe3, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe4, - 0x01, - 0x84, - 0x02, - 0x02, - 0x00, - 0x5d, - 0x00, - 0xe4, - 0x01, - 0x06, - 0x1d, - 0x00, - 0x00, - 0xf6, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x01, - 0xe3, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe4, - 0x01, - 0xe6, - 0x01, - 0x02, - 0x00, - 0xe7, - 0x01, - 0xe8, - 0x01, - 0xe9, - 0x01, - 0xea, - 0x01, - 0xeb, - 0x01, - 0xec, - 0x01, - 0xed, - 0x01, - 0xee, - 0x01, - 0xef, - 0x01, - 0xf0, - 0x01, - 0xf1, - 0x01, - 0xf2, - 0x01, - 0xf3, - 0x01, - 0xf4, - 0x01, - 0xf5, - 0x01, - 0xf6, - 0x01, - 0xf7, - 0x01, - 0xf8, - 0x01, - 0xf9, - 0x01, - 0xfa, - 0x01, - 0xfb, - 0x01, - 0xfc, - 0x01, - 0xfd, - 0x01, - 0xfe, - 0x01, - 0xff, - 0x01, - 0x00, - 0x02, - 0x01, - 0x02, - 0x02, - 0x02, - 0x03, - 0x02, - 0x04, - 0x02, - 0x05, - 0x02, - 0x06, - 0x02, - 0x07, - 0x02, - 0x08, - 0x02, - 0x09, - 0x02, - 0x0a, - 0x02, - 0x0b, - 0x02, - 0x0c, - 0x02, - 0x0d, - 0x02, - 0x0e, - 0x02, - 0x0f, - 0x02, - 0x10, - 0x02, - 0x11, - 0x02, - 0x12, - 0x02, - 0x13, - 0x02, - 0x14, - 0x02, - 0x15, - 0x02, - 0x16, - 0x02, - 0x17, - 0x02, - 0x18, - 0x02, - 0x19, - 0x02, - 0x1a, - 0x02, - 0x1b, - 0x02, - 0x1c, - 0x02, - 0x1d, - 0x02, - 0x1e, - 0x02, - 0x1f, - 0x02, - 0x20, - 0x02, - 0x21, - 0x02, - 0x22, - 0x02, - 0x23, - 0x02, - 0x24, - 0x02, - 0x25, - 0x02, - 0x26, - 0x02, - 0x27, - 0x02, - 0x28, - 0x02, - 0x29, - 0x02, - 0x2a, - 0x02, - 0x2b, - 0x02, - 0x2c, - 0x02, - 0x2d, - 0x02, - 0x2e, - 0x02, - 0x2f, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x55, - 0x02, - 0x02, - 0x00, - 0x56, - 0x02, - 0x57, - 0x02, - 0x58, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x85, - 0x02, - 0xe4, - 0x01, - 0x86, - 0x02, - 0x87, - 0x02, - 0x88, - 0x02, - 0x89, - 0x02, - 0x8a, - 0x02, - 0x8b, - 0x02, - 0x8c, - 0x02, - 0x8d, - 0x02, - 0x8e, - 0x02, - 0x8f, - 0x02, - 0x90, - 0x02, - 0x91, - 0x02, - 0x92, - 0x02, - 0x93, - 0x02, - 0x94, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x5a, - 0x02, - 0x5b, - 0x02, - 0x5c, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x30, - 0x02, - 0x02, - 0x00, - 0x5d, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x36, - 0x02, - 0x02, - 0x00, - 0x31, - 0x02, - 0x32, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x95, - 0x02, - 0x02, - 0x00, - 0x39, - 0x02, - 0x96, - 0x02, - 0x97, - 0x02, - 0x98, - 0x02, - 0x99, - 0x02, - 0x9a, - 0x02, - 0x42, - 0x02, - 0x9b, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x9c, - 0x02, - 0x46, - 0x02, - 0x9d, - 0x02, - 0x9e, - 0x02, - 0x42, - 0x02, - 0x9f, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0xa0, - 0x02, - 0x46, - 0x02, - 0xa1, - 0x02, - 0xa2, - 0x02, - 0x42, - 0x02, - 0xa3, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0xa4, - 0x02, - 0x46, - 0x02, - 0xa5, - 0x02, - 0xa6, - 0x02, - 0x42, - 0x02, - 0xa7, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0xa8, - 0x02, - 0x46, - 0x02, - 0xa9, - 0x02, - 0xaa, - 0x02, - 0x42, - 0x02, - 0xab, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0xac, - 0x02, - 0xad, - 0x02, - 0xae, - 0x02, - 0xaf, - 0x02, - 0xb0, - 0x02, - 0xb1, - 0x02, - 0xb2, - 0x02, - 0xb3, - 0x02, - 0xb4, - 0x02, - 0xb5, - 0x02, - 0xb6, - 0x02, - 0xb7, - 0x02, - 0xb8, - 0x02, - 0xb9, - 0x02, - 0x46, - 0x02, - 0xba, - 0x02, - 0xbb, - 0x02, - 0xbc, - 0x02, - 0xbd, - 0x02, - 0x42, - 0x02, - 0xbe, - 0x02, - 0xbf, - 0x02, - 0xc0, - 0x02, - 0xc1, - 0x02, - 0xc2, - 0x02, - 0xc3, - 0x02, - 0xc4, - 0x02, - 0xc5, - 0x02, - 0xc6, - 0x02, - 0xc7, - 0x02, - 0xc0, - 0x02, - 0xc8, - 0x02, - 0xc3, - 0x02, - 0xc9, - 0x02, - 0xc0, - 0x02, - 0xca, - 0x02, - 0xc3, - 0x02, - 0xcb, - 0x02, - 0xcc, - 0x02, - 0xcd, - 0x02, - 0xce, - 0x02, - 0xcf, - 0x02, - 0xc0, - 0x02, - 0xd0, - 0x02, - 0xd1, - 0x02, - 0xc3, - 0x02, - 0xc9, - 0x02, - 0xc0, - 0x02, - 0xd2, - 0x02, - 0xc3, - 0x02, - 0xd3, - 0x02, - 0xd4, - 0x02, - 0xd5, - 0x02, - 0xc0, - 0x02, - 0xd6, - 0x02, - 0xc3, - 0x02, - 0xc9, - 0x02, - 0xc0, - 0x02, - 0xd7, - 0x02, - 0xc3, - 0x02, - 0xd8, - 0x02, - 0xd9, - 0x02, - 0xda, - 0x02, - 0xdb, - 0x02, - 0xdc, - 0x02, - 0xdd, - 0x02, - 0xde, - 0x02, - 0xdf, - 0x02, - 0xe0, - 0x02, - 0xe1, - 0x02, - 0x54, - 0x02, - 0x5d, - 0x00, - 0xe4, - 0x01, - 0xbc, - 0x03, - 0x00, - 0x00, - 0x2e, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x01, - 0xe3, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe4, - 0x01, - 0x49, - 0x01, - 0x02, - 0x00, - 0xe2, - 0x02, - 0xe3, - 0x02, - 0xe4, - 0x02, - 0xe5, - 0x02, - 0xe6, - 0x02, - 0xe7, - 0x02, - 0xe8, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x51, - 0x01, - 0x52, - 0x01, - 0x08, - 0x00, - 0xe9, - 0x02, - 0xe4, - 0x01, - 0xea, - 0x02, - 0x02, - 0x00, - 0xeb, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0xec, - 0x02, - 0xe4, - 0x01, - 0x30, - 0x02, - 0x02, - 0x00, - 0xed, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x36, - 0x02, - 0x02, - 0x00, - 0x33, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0xee, - 0x02, - 0x02, - 0x00, - 0x39, - 0x02, - 0xef, - 0x02, - 0xf0, - 0x02, - 0x54, - 0x02, - 0x5d, - 0x00, - 0xe4, - 0x01, - 0xec, - 0x00, - 0x00, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x01, - 0xe3, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe4, - 0x01, - 0x30, - 0x02, - 0x02, - 0x00, - 0x5d, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0xf1, - 0x02, - 0x02, - 0x00, - 0x39, - 0x02, - 0xf2, - 0x02, - 0x54, - 0x02, - 0x5d, - 0x00, - 0xe4, - 0x01, - 0xec, - 0x10, - 0x00, - 0x00, - 0x94, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x01, - 0xe3, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe4, - 0x01, - 0xe6, - 0x01, - 0x02, - 0x00, - 0xe7, - 0x01, - 0xe8, - 0x01, - 0xe9, - 0x01, - 0xea, - 0x01, - 0xeb, - 0x01, - 0xec, - 0x01, - 0xed, - 0x01, - 0xee, - 0x01, - 0xef, - 0x01, - 0xf0, - 0x01, - 0xf1, - 0x01, - 0xf2, - 0x01, - 0xf3, - 0x01, - 0xf4, - 0x01, - 0xf5, - 0x01, - 0xf6, - 0x01, - 0xf7, - 0x01, - 0xf8, - 0x01, - 0xf9, - 0x01, - 0xfa, - 0x01, - 0xfb, - 0x01, - 0xfc, - 0x01, - 0xfd, - 0x01, - 0xfe, - 0x01, - 0xff, - 0x01, - 0x00, - 0x02, - 0x01, - 0x02, - 0x02, - 0x02, - 0x03, - 0x02, - 0x04, - 0x02, - 0x05, - 0x02, - 0x06, - 0x02, - 0x07, - 0x02, - 0x08, - 0x02, - 0x09, - 0x02, - 0x0a, - 0x02, - 0x0b, - 0x02, - 0x0c, - 0x02, - 0x0d, - 0x02, - 0x0e, - 0x02, - 0x0f, - 0x02, - 0x10, - 0x02, - 0x11, - 0x02, - 0x12, - 0x02, - 0x13, - 0x02, - 0x14, - 0x02, - 0x15, - 0x02, - 0x16, - 0x02, - 0x17, - 0x02, - 0x18, - 0x02, - 0x19, - 0x02, - 0x1a, - 0x02, - 0x1b, - 0x02, - 0x1c, - 0x02, - 0x1d, - 0x02, - 0x1e, - 0x02, - 0x1f, - 0x02, - 0x20, - 0x02, - 0x21, - 0x02, - 0x22, - 0x02, - 0x23, - 0x02, - 0x24, - 0x02, - 0x25, - 0x02, - 0x26, - 0x02, - 0x27, - 0x02, - 0x28, - 0x02, - 0x29, - 0x02, - 0x2a, - 0x02, - 0x2b, - 0x02, - 0x2c, - 0x02, - 0x2d, - 0x02, - 0x2e, - 0x02, - 0x2f, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0xf3, - 0x02, - 0xf4, - 0x02, - 0xe4, - 0x01, - 0x30, - 0x02, - 0x02, - 0x00, - 0x31, - 0x02, - 0x32, - 0x02, - 0x33, - 0x02, - 0x34, - 0x02, - 0x35, - 0x02, - 0xf5, - 0x02, - 0xf6, - 0x02, - 0xf7, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x36, - 0x02, - 0x02, - 0x00, - 0x37, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x38, - 0x02, - 0x02, - 0x00, - 0x39, - 0x02, - 0x3a, - 0x02, - 0xf8, - 0x02, - 0xf9, - 0x02, - 0xfa, - 0x02, - 0xfb, - 0x02, - 0xfc, - 0x02, - 0xfd, - 0x02, - 0xfe, - 0x02, - 0x42, - 0x02, - 0xff, - 0x02, - 0x00, - 0x03, - 0x01, - 0x03, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x02, - 0x03, - 0x46, - 0x02, - 0x03, - 0x03, - 0x04, - 0x03, - 0x05, - 0x03, - 0x06, - 0x03, - 0x07, - 0x03, - 0x08, - 0x03, - 0x09, - 0x03, - 0x0a, - 0x03, - 0x0b, - 0x03, - 0x0c, - 0x03, - 0x0d, - 0x03, - 0x0e, - 0x03, - 0x0f, - 0x03, - 0x10, - 0x03, - 0x11, - 0x03, - 0x12, - 0x03, - 0x13, - 0x03, - 0x14, - 0x03, - 0x15, - 0x03, - 0x16, - 0x03, - 0x17, - 0x03, - 0x18, - 0x03, - 0x19, - 0x03, - 0x54, - 0x02, - 0x5d, - 0x00, - 0xe4, - 0x01, - 0x66, - 0x0d, - 0x00, - 0x00, - 0x82, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x01, - 0xe3, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe4, - 0x01, - 0xe6, - 0x01, - 0x02, - 0x00, - 0xe7, - 0x01, - 0xe8, - 0x01, - 0xe9, - 0x01, - 0xea, - 0x01, - 0xeb, - 0x01, - 0xec, - 0x01, - 0xed, - 0x01, - 0xee, - 0x01, - 0xef, - 0x01, - 0xf0, - 0x01, - 0xf1, - 0x01, - 0xf2, - 0x01, - 0xf3, - 0x01, - 0xf4, - 0x01, - 0xf5, - 0x01, - 0xf6, - 0x01, - 0xf7, - 0x01, - 0xf8, - 0x01, - 0xf9, - 0x01, - 0xfa, - 0x01, - 0xfb, - 0x01, - 0xfc, - 0x01, - 0xfd, - 0x01, - 0xfe, - 0x01, - 0xff, - 0x01, - 0x00, - 0x02, - 0x01, - 0x02, - 0x02, - 0x02, - 0x03, - 0x02, - 0x04, - 0x02, - 0x05, - 0x02, - 0x06, - 0x02, - 0x07, - 0x02, - 0x08, - 0x02, - 0x09, - 0x02, - 0x0a, - 0x02, - 0x0b, - 0x02, - 0x0c, - 0x02, - 0x0d, - 0x02, - 0x0e, - 0x02, - 0x0f, - 0x02, - 0x10, - 0x02, - 0x11, - 0x02, - 0x12, - 0x02, - 0x13, - 0x02, - 0x14, - 0x02, - 0x15, - 0x02, - 0x16, - 0x02, - 0x17, - 0x02, - 0x18, - 0x02, - 0x19, - 0x02, - 0x1a, - 0x02, - 0x1b, - 0x02, - 0x1c, - 0x02, - 0x1d, - 0x02, - 0x1e, - 0x02, - 0x1f, - 0x02, - 0x20, - 0x02, - 0x21, - 0x02, - 0x22, - 0x02, - 0x23, - 0x02, - 0x24, - 0x02, - 0x25, - 0x02, - 0x26, - 0x02, - 0x27, - 0x02, - 0x28, - 0x02, - 0x29, - 0x02, - 0x2a, - 0x02, - 0x2b, - 0x02, - 0x2c, - 0x02, - 0x2d, - 0x02, - 0x2e, - 0x02, - 0x2f, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x30, - 0x02, - 0x02, - 0x00, - 0x31, - 0x02, - 0x32, - 0x02, - 0x33, - 0x02, - 0x34, - 0x02, - 0x35, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x36, - 0x02, - 0x02, - 0x00, - 0x37, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x38, - 0x02, - 0x02, - 0x00, - 0x39, - 0x02, - 0x3a, - 0x02, - 0x1a, - 0x03, - 0x1b, - 0x03, - 0x1c, - 0x03, - 0x1d, - 0x03, - 0x1e, - 0x03, - 0x1f, - 0x03, - 0x20, - 0x03, - 0x42, - 0x02, - 0x21, - 0x03, - 0x22, - 0x03, - 0x23, - 0x03, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x24, - 0x03, - 0x46, - 0x02, - 0x25, - 0x03, - 0x26, - 0x03, - 0x27, - 0x03, - 0x28, - 0x03, - 0x29, - 0x03, - 0x2a, - 0x03, - 0x2b, - 0x03, - 0x2c, - 0x03, - 0x2d, - 0x03, - 0x2e, - 0x03, - 0x2f, - 0x03, - 0x54, - 0x02, - 0x5d, - 0x00, - 0xe4, - 0x01, - 0x2d, - 0x10, - 0x00, - 0x00, - 0xae, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x01, - 0xe3, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe4, - 0x01, - 0xe6, - 0x01, - 0x02, - 0x00, - 0xe7, - 0x01, - 0xe8, - 0x01, - 0xe9, - 0x01, - 0xea, - 0x01, - 0xeb, - 0x01, - 0xec, - 0x01, - 0xed, - 0x01, - 0xee, - 0x01, - 0xef, - 0x01, - 0xf0, - 0x01, - 0xf1, - 0x01, - 0xf2, - 0x01, - 0xf3, - 0x01, - 0xf4, - 0x01, - 0xf5, - 0x01, - 0xf6, - 0x01, - 0xf7, - 0x01, - 0xf8, - 0x01, - 0xf9, - 0x01, - 0xfa, - 0x01, - 0xfb, - 0x01, - 0xfc, - 0x01, - 0xfd, - 0x01, - 0xfe, - 0x01, - 0xff, - 0x01, - 0x00, - 0x02, - 0x01, - 0x02, - 0x02, - 0x02, - 0x03, - 0x02, - 0x04, - 0x02, - 0x05, - 0x02, - 0x06, - 0x02, - 0x07, - 0x02, - 0x08, - 0x02, - 0x09, - 0x02, - 0x0a, - 0x02, - 0x0b, - 0x02, - 0x0c, - 0x02, - 0x0d, - 0x02, - 0x0e, - 0x02, - 0x0f, - 0x02, - 0x10, - 0x02, - 0x11, - 0x02, - 0x12, - 0x02, - 0x13, - 0x02, - 0x14, - 0x02, - 0x15, - 0x02, - 0x16, - 0x02, - 0x17, - 0x02, - 0x18, - 0x02, - 0x19, - 0x02, - 0x1a, - 0x02, - 0x1b, - 0x02, - 0x1c, - 0x02, - 0x1d, - 0x02, - 0x1e, - 0x02, - 0x1f, - 0x02, - 0x20, - 0x02, - 0x21, - 0x02, - 0x22, - 0x02, - 0x23, - 0x02, - 0x24, - 0x02, - 0x25, - 0x02, - 0x26, - 0x02, - 0x27, - 0x02, - 0x28, - 0x02, - 0x29, - 0x02, - 0x2a, - 0x02, - 0x2b, - 0x02, - 0x2c, - 0x02, - 0x2d, - 0x02, - 0x2e, - 0x02, - 0x2f, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x55, - 0x02, - 0x02, - 0x00, - 0x56, - 0x02, - 0x57, - 0x02, - 0x58, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x30, - 0x03, - 0xe4, - 0x01, - 0x5a, - 0x02, - 0x5b, - 0x02, - 0x5c, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x30, - 0x02, - 0x02, - 0x00, - 0x5d, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x36, - 0x02, - 0x02, - 0x00, - 0x31, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x5e, - 0x02, - 0x02, - 0x00, - 0x39, - 0x02, - 0x5f, - 0x02, - 0x31, - 0x03, - 0x61, - 0x02, - 0x62, - 0x02, - 0x63, - 0x02, - 0x42, - 0x02, - 0x64, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x65, - 0x02, - 0x46, - 0x02, - 0x66, - 0x02, - 0x67, - 0x02, - 0x42, - 0x02, - 0x68, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x69, - 0x02, - 0x46, - 0x02, - 0x6a, - 0x02, - 0x6b, - 0x02, - 0x42, - 0x02, - 0x6c, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x6d, - 0x02, - 0x46, - 0x02, - 0x6e, - 0x02, - 0x6f, - 0x02, - 0x42, - 0x02, - 0x70, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x71, - 0x02, - 0x46, - 0x02, - 0x32, - 0x03, - 0x73, - 0x02, - 0x42, - 0x02, - 0x33, - 0x03, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x34, - 0x03, - 0x35, - 0x03, - 0x36, - 0x03, - 0x37, - 0x03, - 0x38, - 0x03, - 0x7a, - 0x02, - 0x7b, - 0x02, - 0x7c, - 0x02, - 0x39, - 0x03, - 0x3a, - 0x03, - 0x3b, - 0x03, - 0x3c, - 0x03, - 0x3d, - 0x03, - 0x3e, - 0x03, - 0x46, - 0x02, - 0x3f, - 0x03, - 0x54, - 0x02, - 0x5d, - 0x00, - 0xe4, - 0x01, - 0x5e, - 0x1c, - 0x00, - 0x00, - 0xf4, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x01, - 0xe3, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe4, - 0x01, - 0xe6, - 0x01, - 0x02, - 0x00, - 0xe7, - 0x01, - 0xe8, - 0x01, - 0xe9, - 0x01, - 0xea, - 0x01, - 0xeb, - 0x01, - 0xec, - 0x01, - 0xed, - 0x01, - 0xee, - 0x01, - 0xef, - 0x01, - 0xf0, - 0x01, - 0xf1, - 0x01, - 0xf2, - 0x01, - 0xf3, - 0x01, - 0xf4, - 0x01, - 0xf5, - 0x01, - 0xf6, - 0x01, - 0xf7, - 0x01, - 0xf8, - 0x01, - 0xf9, - 0x01, - 0xfa, - 0x01, - 0xfb, - 0x01, - 0xfc, - 0x01, - 0xfd, - 0x01, - 0xfe, - 0x01, - 0xff, - 0x01, - 0x00, - 0x02, - 0x01, - 0x02, - 0x02, - 0x02, - 0x03, - 0x02, - 0x04, - 0x02, - 0x05, - 0x02, - 0x06, - 0x02, - 0x07, - 0x02, - 0x08, - 0x02, - 0x09, - 0x02, - 0x0a, - 0x02, - 0x0b, - 0x02, - 0x0c, - 0x02, - 0x0d, - 0x02, - 0x0e, - 0x02, - 0x0f, - 0x02, - 0x10, - 0x02, - 0x11, - 0x02, - 0x12, - 0x02, - 0x13, - 0x02, - 0x14, - 0x02, - 0x15, - 0x02, - 0x16, - 0x02, - 0x17, - 0x02, - 0x18, - 0x02, - 0x19, - 0x02, - 0x1a, - 0x02, - 0x1b, - 0x02, - 0x1c, - 0x02, - 0x1d, - 0x02, - 0x1e, - 0x02, - 0x1f, - 0x02, - 0x20, - 0x02, - 0x21, - 0x02, - 0x22, - 0x02, - 0x23, - 0x02, - 0x24, - 0x02, - 0x25, - 0x02, - 0x26, - 0x02, - 0x27, - 0x02, - 0x28, - 0x02, - 0x29, - 0x02, - 0x2a, - 0x02, - 0x2b, - 0x02, - 0x2c, - 0x02, - 0x2d, - 0x02, - 0x2e, - 0x02, - 0x2f, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x55, - 0x02, - 0x02, - 0x00, - 0x56, - 0x02, - 0x57, - 0x02, - 0x58, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x40, - 0x03, - 0xe4, - 0x01, - 0x86, - 0x02, - 0x87, - 0x02, - 0x88, - 0x02, - 0x89, - 0x02, - 0x8a, - 0x02, - 0x8b, - 0x02, - 0x8c, - 0x02, - 0x8d, - 0x02, - 0x8e, - 0x02, - 0x8f, - 0x02, - 0x90, - 0x02, - 0x91, - 0x02, - 0x92, - 0x02, - 0x93, - 0x02, - 0x94, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x5a, - 0x02, - 0x5b, - 0x02, - 0x5c, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x30, - 0x02, - 0x02, - 0x00, - 0x5d, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x36, - 0x02, - 0x02, - 0x00, - 0x31, - 0x02, - 0x32, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x95, - 0x02, - 0x02, - 0x00, - 0x39, - 0x02, - 0x96, - 0x02, - 0x41, - 0x03, - 0x98, - 0x02, - 0x99, - 0x02, - 0x9a, - 0x02, - 0x42, - 0x02, - 0x9b, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x9c, - 0x02, - 0x46, - 0x02, - 0x9d, - 0x02, - 0x9e, - 0x02, - 0x42, - 0x02, - 0x9f, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0xa0, - 0x02, - 0x46, - 0x02, - 0xa1, - 0x02, - 0xa2, - 0x02, - 0x42, - 0x02, - 0xa3, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0xa4, - 0x02, - 0x46, - 0x02, - 0xa5, - 0x02, - 0xa6, - 0x02, - 0x42, - 0x02, - 0xa7, - 0x02, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0xa8, - 0x02, - 0x46, - 0x02, - 0x42, - 0x03, - 0xaa, - 0x02, - 0x42, - 0x02, - 0x43, - 0x03, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x44, - 0x03, - 0x45, - 0x03, - 0x46, - 0x03, - 0x47, - 0x03, - 0x48, - 0x03, - 0xb1, - 0x02, - 0xb2, - 0x02, - 0xb3, - 0x02, - 0x49, - 0x03, - 0x4a, - 0x03, - 0x4b, - 0x03, - 0x4c, - 0x03, - 0x4d, - 0x03, - 0x4e, - 0x03, - 0x46, - 0x02, - 0x4f, - 0x03, - 0xbb, - 0x02, - 0x50, - 0x03, - 0x51, - 0x03, - 0xbd, - 0x02, - 0x42, - 0x02, - 0xbe, - 0x02, - 0xbf, - 0x02, - 0xc0, - 0x02, - 0x52, - 0x03, - 0xc2, - 0x02, - 0xc3, - 0x02, - 0xc4, - 0x02, - 0xc5, - 0x02, - 0xc6, - 0x02, - 0xc7, - 0x02, - 0xc0, - 0x02, - 0xc8, - 0x02, - 0xc3, - 0x02, - 0xc9, - 0x02, - 0xc0, - 0x02, - 0xca, - 0x02, - 0xc3, - 0x02, - 0x53, - 0x03, - 0x54, - 0x03, - 0xcf, - 0x02, - 0xc0, - 0x02, - 0x55, - 0x03, - 0x56, - 0x03, - 0xc3, - 0x02, - 0xc9, - 0x02, - 0xc0, - 0x02, - 0x57, - 0x03, - 0xc3, - 0x02, - 0x58, - 0x03, - 0x59, - 0x03, - 0xd5, - 0x02, - 0xc0, - 0x02, - 0x5a, - 0x03, - 0xc3, - 0x02, - 0xc9, - 0x02, - 0xc0, - 0x02, - 0xd7, - 0x02, - 0xc3, - 0x02, - 0x5b, - 0x03, - 0x5c, - 0x03, - 0xdb, - 0x02, - 0xdc, - 0x02, - 0xdd, - 0x02, - 0xde, - 0x02, - 0xdf, - 0x02, - 0xe0, - 0x02, - 0x5d, - 0x03, - 0x54, - 0x02, - 0x5d, - 0x00, - 0xe4, - 0x01, - 0x1b, - 0x11, - 0x00, - 0x00, - 0x94, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x01, - 0xe3, - 0x01, - 0xe4, - 0x01, - 0xe5, - 0x01, - 0xe4, - 0x01, - 0xe6, - 0x01, - 0x02, - 0x00, - 0xe7, - 0x01, - 0xe8, - 0x01, - 0xe9, - 0x01, - 0xea, - 0x01, - 0xeb, - 0x01, - 0xec, - 0x01, - 0xed, - 0x01, - 0xee, - 0x01, - 0xef, - 0x01, - 0xf0, - 0x01, - 0xf1, - 0x01, - 0xf2, - 0x01, - 0xf3, - 0x01, - 0xf4, - 0x01, - 0xf5, - 0x01, - 0xf6, - 0x01, - 0xf7, - 0x01, - 0xf8, - 0x01, - 0xf9, - 0x01, - 0xfa, - 0x01, - 0xfb, - 0x01, - 0xfc, - 0x01, - 0xfd, - 0x01, - 0xfe, - 0x01, - 0xff, - 0x01, - 0x00, - 0x02, - 0x01, - 0x02, - 0x02, - 0x02, - 0x03, - 0x02, - 0x04, - 0x02, - 0x05, - 0x02, - 0x06, - 0x02, - 0x07, - 0x02, - 0x08, - 0x02, - 0x09, - 0x02, - 0x0a, - 0x02, - 0x0b, - 0x02, - 0x0c, - 0x02, - 0x0d, - 0x02, - 0x0e, - 0x02, - 0x0f, - 0x02, - 0x10, - 0x02, - 0x11, - 0x02, - 0x12, - 0x02, - 0x13, - 0x02, - 0x14, - 0x02, - 0x15, - 0x02, - 0x16, - 0x02, - 0x17, - 0x02, - 0x18, - 0x02, - 0x19, - 0x02, - 0x1a, - 0x02, - 0x1b, - 0x02, - 0x1c, - 0x02, - 0x1d, - 0x02, - 0x1e, - 0x02, - 0x1f, - 0x02, - 0x20, - 0x02, - 0x21, - 0x02, - 0x22, - 0x02, - 0x23, - 0x02, - 0x24, - 0x02, - 0x25, - 0x02, - 0x26, - 0x02, - 0x27, - 0x02, - 0x28, - 0x02, - 0x29, - 0x02, - 0x2a, - 0x02, - 0x2b, - 0x02, - 0x2c, - 0x02, - 0x2d, - 0x02, - 0x2e, - 0x02, - 0x2f, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0xf3, - 0x02, - 0xf4, - 0x02, - 0xe4, - 0x01, - 0x30, - 0x02, - 0x02, - 0x00, - 0x31, - 0x02, - 0x32, - 0x02, - 0x33, - 0x02, - 0x34, - 0x02, - 0x35, - 0x02, - 0xf5, - 0x02, - 0xf6, - 0x02, - 0xf7, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x36, - 0x02, - 0x02, - 0x00, - 0x37, - 0x02, - 0x05, - 0x00, - 0xe4, - 0x01, - 0x38, - 0x02, - 0x02, - 0x00, - 0x39, - 0x02, - 0x3a, - 0x02, - 0x5e, - 0x03, - 0x5f, - 0x03, - 0x60, - 0x03, - 0x61, - 0x03, - 0x62, - 0x03, - 0x63, - 0x03, - 0x64, - 0x03, - 0x42, - 0x02, - 0x65, - 0x03, - 0x66, - 0x03, - 0x67, - 0x03, - 0x46, - 0x02, - 0x47, - 0x02, - 0x42, - 0x02, - 0x68, - 0x03, - 0x46, - 0x02, - 0x69, - 0x03, - 0x6a, - 0x03, - 0x6b, - 0x03, - 0x6c, - 0x03, - 0x6d, - 0x03, - 0x6e, - 0x03, - 0x6f, - 0x03, - 0x70, - 0x03, - 0x71, - 0x03, - 0x72, - 0x03, - 0x73, - 0x03, - 0x74, - 0x03, - 0x75, - 0x03, - 0x76, - 0x03, - 0x77, - 0x03, - 0x78, - 0x03, - 0x79, - 0x03, - 0x7a, - 0x03, - 0x7b, - 0x03, - 0x7c, - 0x03, - 0x17, - 0x03, - 0x18, - 0x03, - 0x19, - 0x03, - 0x54, - 0x02, - 0x5d, - 0x00, - 0xe4, - 0x01, +// IMAGE +0x53, 0x52, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x54, 0x41, 0x45, 0x46, +0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x45, 0x4d, 0x41, 0x4e, 0x5f, 0x54, 0x41, 0x4d, 0x06, 0x00, 0x00, +0x00, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x00, 0x4c, 0x44, 0x4d, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x4e, 0x4d, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4c, 0x46, 0x56, +0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x46, 0x49, 0x4e, 0x55, 0x5f, 0x54, 0x41, 0x4d, +0x98, 0x00, 0x00, 0x00, 0x09, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x00, +0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x01, 0x4c, 0x69, 0x67, 0x68, +0x74, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x04, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x05, 0x46, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x06, 0x46, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x73, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x07, 0x42, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x00, 0x02, 0x4d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x03, +0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x08, 0x50, 0x4d, 0x41, 0x53, +0x5f, 0x54, 0x41, 0x4d, 0xe1, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x07, 0x07, 0x01, 0x02, 0x09, 0x07, 0x01, 0x0a, 0x01, +0x01, 0x0b, 0x00, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x00, 0x01, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x00, 0x02, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x00, 0x03, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, +0x73, 0x61, 0x6f, 0x00, 0x04, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x00, 0x05, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x00, 0x06, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, +0x6f, 0x67, 0x00, 0x07, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, +0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x00, 0x08, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, +0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x00, +0x09, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, +0x65, 0x00, 0x0a, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, +0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, 0x20, 0x42, 0x49, 0x55, 0x5f, 0x54, 0x41, +0x4d, 0x59, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, +0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x02, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, +0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x73, 0x68, 0x6f, 0x77, 0x49, 0x6d, +0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x20, 0x42, 0x49, 0x53, 0x5f, 0x54, +0x41, 0x4d, 0x21, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x00, 0x00, 0x02, 0x03, 0x00, 0x53, +0x4e, 0x4f, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x42, 0x55, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, +0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 0x4f, 0x44, 0x5f, 0x54, +0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, +0x4e, 0x45, 0x4c, 0x42, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x44, 0x4d, 0x52, 0x54, 0x5f, 0x54, 0x41, +0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, +0x52, 0x57, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x41, 0x4d, +0x01, 0x00, 0x00, 0x00, 0x01, 0x49, 0x52, 0x57, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x53, 0x45, +0x54, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x54, 0x53, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, +0x00, 0x00, 0x00, 0x00, 0x53, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x43, 0x32, +0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4d, 0x55, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, +0x00, 0x00, 0x00, 0x50, 0x4f, 0x52, 0x50, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x44, 0x49, 0x55, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x71, 0x20, 0x8a, 0x14, 0xbe, +0xed, 0x26, 0x66, 0x44, 0x41, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, +0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, +0x00, 0x00, 0x54, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x49, 0x43, 0x5f, +0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x41, 0x51, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x41, 0x41, 0x50, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x41, 0x56, +0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x19, 0x3e, 0x52, 0x48, 0x54, 0x53, 0x5f, 0x54, 0x41, +0x4d, 0x04, 0x00, 0x00, 0x00, 0xcd, 0xcc, 0x4c, 0x3e, 0x4f, 0x44, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, +0x00, 0x03, 0x52, 0x54, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x44, 0x53, 0x43, 0x5f, +0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x89, 0x75, 0x00, 0x00, +0x7d, 0x03, 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x30, 0x30, 0x20, 0x65, 0x73, 0x00, +0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, +0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x7b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, +0x55, 0x56, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x3b, 0x00, 0x7d, 0x3b, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, +0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, +0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, +0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, +0x00, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x43, +0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x56, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, +0x52, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x41, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, +0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, +0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, +0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, +0x20, 0x63, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x65, 0x5b, 0x34, +0x5d, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x6a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x32, 0x20, 0x6f, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, +0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x3b, 0x00, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x78, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, +0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, +0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x65, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, +0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, +0x5d, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, +0x6b, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x7a, 0x3b, 0x00, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, +0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, +0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, +0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x66, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, +0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6b, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, +0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, +0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x7a, +0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, +0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x7a, 0x7a, +0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, +0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x7a, 0x3b, 0x00, +0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, 0x5b, 0x34, 0x30, 0x5d, +0x3b, 0x00, 0x7d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x6c, +0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, +0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x3b, 0x00, 0x66, 0x6c, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x3b, 0x00, 0x6f, +0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x6f, 0x69, 0x64, +0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, +0x4f, 0x57, 0x45, 0x52, 0x5f, 0x56, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x41, +0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x29, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x20, 0x2b, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x49, 0x44, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x00, 0x7d, 0x00, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x69, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x30, 0x34, 0x20, 0x3d, +0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x33, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x34, 0x3b, 0x00, 0x5f, 0x33, 0x34, 0x36, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x30, 0x34, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x2d, 0x30, 0x2e, 0x35, 0x29, 0x29, +0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x38, 0x30, 0x20, 0x3d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x33, +0x34, 0x36, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, +0x30, 0x2e, 0x77, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, +0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x38, 0x32, 0x29, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, +0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x5f, +0x32, 0x38, 0x30, 0x3b, 0x00, 0x5f, 0x33, 0x35, 0x30, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x38, 0x32, 0x20, +0x3c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x3f, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, +0x65, 0x2d, 0x31, 0x39, 0x29, 0x20, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, +0x39, 0x3b, 0x00, 0x5f, 0x33, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x3b, 0x00, 0x5f, 0x33, 0x36, 0x33, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x30, 0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, +0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, +0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, +0x20, 0x2f, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, +0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x30, 0x34, 0x2e, 0x78, 0x79, 0x20, +0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x00, +0x5f, 0x33, 0x33, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x33, 0x33, +0x37, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x20, +0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, +0x74, 0x73, 0x28, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, +0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, +0x56, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x2e, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x32, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, +0x32, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x36, +0x3b, 0x00, 0x5f, 0x33, 0x34, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x34, 0x36, 0x2e, 0x7a, 0x20, 0x2a, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x5f, 0x33, 0x34, 0x36, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x36, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, +0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x70, 0x72, 0x65, +0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x00, +0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, +0x73, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x65, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, +0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, +0x72, 0x43, 0x6f, 0x61, 0x74, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, +0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x30, 0x34, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x30, +0x35, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x30, 0x36, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, +0x35, 0x35, 0x33, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, +0x34, 0x20, 0x62, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, +0x61, 0x74, 0x34, 0x20, 0x65, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, +0x20, 0x66, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x32, 0x20, 0x69, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x6d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x75, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, +0x7a, 0x3b, 0x00, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, 0x5d, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x6b, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, +0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, +0x32, 0x20, 0x72, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x74, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x76, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, +0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x6d, 0x61, 0x74, 0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, +0x20, 0x6b, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x6d, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x70, 0x7a, 0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x72, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, 0x5b, +0x34, 0x30, 0x5d, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, +0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, +0x6d, 0x73, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x3b, 0x00, 0x7d, 0x20, +0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, +0x44, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x61, +0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, +0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, +0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, +0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, +0x55, 0x56, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, +0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, +0x2e, 0x78, 0x79, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x3b, 0x00, +0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x34, 0x31, 0x34, +0x29, 0x00, 0x5f, 0x34, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x2e, 0x78, 0x20, 0x3e, 0x20, 0x31, 0x2e, +0x30, 0x3b, 0x00, 0x5f, 0x34, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, +0x20, 0x5f, 0x34, 0x32, 0x38, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x34, 0x32, 0x31, 0x29, 0x00, 0x5f, 0x34, +0x32, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x00, 0x5f, +0x34, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x34, 0x33, +0x35, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x34, 0x32, 0x38, 0x29, 0x00, 0x5f, 0x34, 0x33, 0x35, 0x20, 0x3d, +0x20, 0x5f, 0x34, 0x31, 0x31, 0x2e, 0x79, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x00, 0x5f, 0x34, 0x33, 0x35, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x32, 0x38, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x34, 0x34, 0x32, 0x3b, 0x00, 0x69, +0x66, 0x20, 0x28, 0x21, 0x5f, 0x34, 0x33, 0x35, 0x29, 0x00, 0x5f, 0x34, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, +0x31, 0x2e, 0x79, 0x20, 0x3e, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x00, 0x5f, 0x34, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x34, +0x33, 0x35, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x36, 0x33, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, +0x34, 0x34, 0x32, 0x29, 0x00, 0x5f, 0x35, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, +0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x31, +0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, +0x35, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x5f, +0x34, 0x31, 0x31, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x70, +0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x34, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x34, +0x35, 0x37, 0x2e, 0x77, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, +0x35, 0x37, 0x3b, 0x00, 0x5f, 0x35, 0x34, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x2e, 0x78, 0x3b, +0x00, 0x5f, 0x35, 0x34, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x35, +0x34, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x34, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2b, 0x20, 0x28, 0x6d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x2e, 0x78, 0x79, 0x7a, 0x20, +0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, +0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, +0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, +0x29, 0x2c, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x2c, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x2c, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x2c, +0x20, 0x5f, 0x35, 0x35, 0x33, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x5f, 0x35, +0x34, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x35, 0x34, 0x38, 0x2e, +0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x35, 0x34, 0x38, 0x2e, 0x7a, 0x20, 0x3d, +0x20, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x5f, 0x35, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x38, +0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, +0x75, 0x74, 0x73, 0x28, 0x5f, 0x35, 0x36, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x34, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x35, +0x2c, 0x20, 0x5f, 0x35, 0x30, 0x35, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x35, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x36, 0x29, 0x2e, +0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x34, 0x2c, 0x20, 0x5f, 0x35, 0x30, +0x35, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x35, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x35, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x36, 0x29, +0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x37, 0x34, +0x30, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x34, 0x31, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x37, 0x34, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x34, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x37, 0x39, 0x35, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, +0x69, 0x75, 0x6d, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, +0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, +0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, +0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, +0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, +0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x7a, 0x7a, 0x29, 0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, +0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, +0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, +0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, +0x31, 0x34, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x5f, 0x38, 0x30, 0x35, 0x20, +0x3d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, +0x7a, 0x20, 0x2d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, +0x7a, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x29, 0x29, 0x20, 0x2f, +0x20, 0x5f, 0x32, 0x31, 0x34, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, +0x38, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, +0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, +0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, +0x32, 0x34, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, +0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x36, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, +0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x34, +0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, +0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, +0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, +0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, +0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, +0x38, 0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, +0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x37, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, +0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, +0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x36, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x38, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, +0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, +0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x38, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, +0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, +0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, +0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, +0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, +0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, +0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, +0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x37, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x38, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, +0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x35, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, +0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, 0x31, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x38, +0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x31, 0x20, 0x3d, +0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x20, 0x3d, 0x20, +0x28, 0x5f, 0x33, 0x37, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, +0x32, 0x35, 0x34, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x38, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x2e, 0x78, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x2e, 0x79, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x37, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, +0x36, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, +0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x76, 0x61, 0x72, +0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x76, 0x65, +0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2c, +0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, +0x20, 0x5f, 0x36, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, +0x6d, 0x73, 0x2e, 0x63, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x36, 0x34, 0x38, +0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x36, 0x34, 0x31, 0x29, 0x00, 0x5f, 0x36, 0x34, 0x38, 0x20, 0x3d, 0x20, +0x5f, 0x36, 0x33, 0x38, 0x2e, 0x78, 0x20, 0x3e, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x00, 0x5f, 0x36, 0x34, 0x38, 0x20, 0x3d, +0x20, 0x5f, 0x36, 0x34, 0x31, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x3b, 0x00, 0x69, 0x66, +0x20, 0x28, 0x21, 0x5f, 0x36, 0x34, 0x38, 0x29, 0x00, 0x5f, 0x36, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x33, 0x38, +0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x00, 0x5f, 0x36, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, +0x38, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x36, 0x36, 0x32, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, +0x36, 0x35, 0x35, 0x29, 0x00, 0x5f, 0x36, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x33, 0x38, 0x2e, 0x79, 0x20, 0x3c, +0x20, 0x30, 0x2e, 0x30, 0x3b, 0x00, 0x5f, 0x36, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x3b, 0x00, 0x62, +0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x36, 0x36, 0x39, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x36, 0x36, 0x32, 0x29, +0x00, 0x5f, 0x36, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x33, 0x38, 0x2e, 0x79, 0x20, 0x3e, 0x20, 0x31, 0x2e, 0x30, +0x3b, 0x00, 0x5f, 0x36, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x36, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x36, 0x39, 0x29, 0x00, 0x5f, 0x38, 0x30, 0x34, +0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x3b, +0x00, 0x5f, 0x36, 0x33, 0x38, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x33, 0x38, +0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x36, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, +0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, +0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x5f, 0x36, 0x33, 0x38, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x70, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, +0x2e, 0x30, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x38, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x36, +0x38, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x38, 0x34, 0x2e, 0x77, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x5f, 0x37, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x38, 0x34, 0x3b, 0x00, 0x5f, 0x37, 0x37, 0x36, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x38, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x37, 0x37, 0x36, 0x2e, 0x79, 0x20, 0x3d, +0x20, 0x5f, 0x36, 0x38, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x37, 0x37, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x36, +0x38, 0x39, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x37, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x37, +0x37, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2b, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, +0x5f, 0x37, 0x37, 0x36, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x37, 0x38, 0x33, 0x20, +0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, +0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, +0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x37, 0x39, 0x35, 0x2c, 0x20, +0x5f, 0x37, 0x39, 0x35, 0x2c, 0x20, 0x5f, 0x37, 0x39, 0x35, 0x2c, 0x20, 0x5f, 0x37, 0x39, 0x34, 0x29, 0x2e, 0x62, 0x61, +0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x5f, 0x37, 0x38, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, +0x30, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x37, 0x38, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x35, 0x2e, +0x79, 0x3b, 0x00, 0x5f, 0x37, 0x38, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x35, 0x2e, 0x7a, 0x3b, 0x00, +0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x33, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, +0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x5f, 0x38, 0x30, 0x34, 0x2c, +0x20, 0x5f, 0x37, 0x34, 0x30, 0x2c, 0x20, 0x5f, 0x37, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x37, 0x34, 0x31, 0x2c, 0x20, 0x5f, +0x37, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x37, 0x34, 0x32, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x2c, 0x20, 0x5f, 0x37, 0x34, 0x30, 0x2c, 0x20, 0x5f, 0x37, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x37, 0x34, 0x31, 0x2c, 0x20, +0x5f, 0x37, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x37, 0x34, 0x32, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x67, +0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, +0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x70, 0x61, 0x72, +0x61, 0x6d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, +0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x33, 0x39, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x50, +0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, +0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, +0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, +0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, +0x74, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, +0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, +0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, +0x31, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, +0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x20, 0x36, 0x34, 0x00, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, +0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, +0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x69, +0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x37, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, +0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, +0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, +0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, +0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x69, 0x6e, 0x74, 0x42, 0x69, 0x74, 0x73, 0x54, 0x6f, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x37, 0x5d, 0x2e, +0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, +0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, +0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, +0x4c, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x63, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, +0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, +0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, +0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, +0x5f, 0x38, 0x20, 0x32, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, +0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, +0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, +0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, +0x38, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x36, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, +0x37, 0x36, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x2d, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x30, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x31, 0x2e, 0x77, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x39, 0x30, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x38, 0x32, 0x29, 0x20, 0x3c, 0x20, +0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x38, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x31, 0x3b, 0x00, 0x5f, 0x38, 0x39, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, +0x5f, 0x38, 0x32, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x3f, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x38, 0x34, +0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x20, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, +0x32, 0x65, 0x2d, 0x31, 0x39, 0x3b, 0x00, 0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x39, 0x3b, 0x00, 0x5f, 0x39, +0x30, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x31, 0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, +0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, +0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x39, 0x30, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, +0x20, 0x5f, 0x39, 0x30, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x35, 0x20, 0x3d, +0x20, 0x5f, 0x39, 0x34, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, +0x39, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x37, 0x36, 0x2e, 0x78, 0x79, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, +0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x39, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x39, 0x2e, +0x79, 0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, +0x75, 0x74, 0x73, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, +0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x5f, 0x39, 0x35, 0x2c, 0x20, 0x5f, 0x39, 0x34, +0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x76, 0x61, 0x72, +0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, +0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x78, 0x3b, 0x00, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, +0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, +0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x32, +0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, +0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x31, +0x35, 0x29, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x2e, 0x78, 0x20, 0x2a, 0x20, +0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x29, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x38, 0x30, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, +0x32, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, +0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x2e, 0x78, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x5f, +0x38, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x38, 0x30, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, +0x5f, 0x31, 0x31, 0x35, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x30, 0x2e, 0x77, 0x29, +0x29, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x38, 0x30, 0x2e, 0x7a, 0x20, 0x2a, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x5f, 0x38, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x20, 0x2f, 0x3d, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, +0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, +0x20, 0x34, 0x31, 0x30, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x41, +0x52, 0x42, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, +0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x6c, 0x61, 0x79, +0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x38, 0x29, 0x20, 0x66, 0x6c, +0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x61, 0x72, +0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, +0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, +0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, +0x33, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x35, 0x3b, 0x00, 0x5f, +0x33, 0x34, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x30, 0x35, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x2d, +0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, +0x38, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, +0x20, 0x2a, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x33, 0x20, +0x3d, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x77, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x3b, +0x00, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x38, 0x33, 0x29, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x30, +0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x35, +0x31, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x3b, 0x00, 0x5f, 0x33, 0x35, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, +0x5f, 0x32, 0x38, 0x33, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x3f, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x38, +0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x20, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, +0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x3b, 0x00, 0x5f, 0x33, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x31, 0x3b, +0x00, 0x5f, 0x33, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x20, +0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, +0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x20, 0x2a, +0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, +0x55, 0x56, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x30, +0x35, 0x2e, 0x78, 0x79, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, +0x2e, 0x35, 0x29, 0x3b, 0x00, 0x5f, 0x33, 0x33, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x32, 0x2e, 0x78, +0x3b, 0x00, 0x5f, 0x33, 0x33, 0x38, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x4d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, +0x5f, 0x33, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, +0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x5f, 0x33, 0x33, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x76, 0x61, 0x72, 0x69, 0x61, +0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x32, 0x2e, 0x69, +0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x39, 0x32, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x34, 0x32, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, +0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x3b, 0x00, 0x5f, 0x33, 0x34, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, +0x34, 0x37, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x33, 0x34, 0x37, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, +0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x3b, 0x00, 0x75, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x6d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3b, 0x00, 0x6c, 0x61, +0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, +0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, +0x65, 0x55, 0x56, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, +0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, +0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x2c, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x2c, +0x20, 0x5f, 0x35, 0x35, 0x34, 0x2c, 0x20, 0x5f, 0x35, 0x35, 0x33, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, +0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, +0x65, 0x55, 0x56, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, +0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, +0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x5f, 0x35, 0x32, 0x36, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x2e, +0x78, 0x3b, 0x00, 0x5f, 0x35, 0x32, 0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x79, 0x3b, 0x00, +0x5f, 0x35, 0x32, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x5f, 0x35, 0x36, +0x33, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x32, 0x36, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, +0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, +0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, +0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, +0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, +0x65, 0x63, 0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, +0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, +0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, +0x38, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, +0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, +0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, +0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, +0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, +0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, +0x5f, 0x31, 0x38, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, +0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, +0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, +0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, +0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, +0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x38, 0x30, 0x35, 0x20, 0x2a, +0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x37, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, +0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, +0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x37, 0x39, 0x35, 0x2c, 0x20, 0x5f, 0x37, 0x39, 0x35, 0x2c, 0x20, 0x5f, 0x37, +0x39, 0x35, 0x2c, 0x20, 0x5f, 0x37, 0x39, 0x34, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x36, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6c, +0x61, 0x6d, 0x70, 0x28, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, +0x2e, 0x78, 0x79, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, +0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2e, 0x78, +0x79, 0x3b, 0x00, 0x5f, 0x37, 0x36, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x35, 0x2e, 0x78, 0x3b, 0x00, +0x5f, 0x37, 0x36, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x37, 0x36, +0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x35, 0x2e, 0x7a, 0x3b, 0x00, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, +0x20, 0x5f, 0x37, 0x36, 0x31, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, +0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, +0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x3b, 0x00, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6d, +0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x69, 0x6e, 0x74, +0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, +0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, +0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, +0x38, 0x5d, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, +0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, +0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, +0x32, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x32, 0x3b, 0x00, 0x5f, 0x34, 0x31, +0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, 0x32, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x2d, 0x30, 0x2e, +0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x38, +0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, +0x20, 0x5f, 0x34, 0x31, 0x34, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x34, 0x38, 0x2e, 0x77, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x34, 0x32, 0x3b, 0x00, 0x69, +0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x33, 0x35, 0x30, 0x29, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x30, 0x38, 0x34, +0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x31, 0x38, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x34, 0x38, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x38, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, +0x35, 0x30, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x3f, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, +0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x20, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, +0x65, 0x2d, 0x31, 0x39, 0x3b, 0x00, 0x5f, 0x34, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x38, 0x3b, 0x00, 0x5f, +0x34, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x38, 0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, +0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x34, 0x30, 0x32, 0x20, 0x3d, 0x20, +0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, +0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x32, 0x20, 0x2a, 0x20, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x34, 0x32, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x34, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x32, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, 0x32, 0x2e, +0x78, 0x79, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, +0x29, 0x3b, 0x00, 0x5f, 0x34, 0x30, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x2e, 0x78, 0x3b, 0x00, +0x5f, 0x34, 0x30, 0x35, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x4d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x34, +0x30, 0x39, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, +0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x5f, 0x34, 0x30, 0x35, 0x2c, 0x20, 0x5f, 0x34, 0x30, 0x32, 0x2e, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, +0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x39, 0x2e, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x55, 0x56, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x34, +0x30, 0x39, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, +0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x39, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x35, 0x2e, 0x7a, 0x3b, +0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, +0x34, 0x31, 0x34, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, +0x2f, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x31, 0x38, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x3b, +0x00, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x38, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, +0x32, 0x32, 0x39, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, +0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, +0x34, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x29, 0x20, +0x2a, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x78, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x38, 0x20, 0x2a, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, +0x34, 0x31, 0x34, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, +0x34, 0x31, 0x34, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, +0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x3b, 0x00, 0x23, +0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, +0x62, 0x3e, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69, 0x6d, 0x64, 0x2f, 0x73, 0x69, +0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x00, 0x00, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, +0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x78, 0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, +0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x78, 0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, +0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x34, 0x5d, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x74, +0x72, 0x6f, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x4e, +0x6f, 0x69, 0x73, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x73, 0x65, +0x72, 0x54, 0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, +0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, +0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6c, +0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, +0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x65, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x64, 0x4f, +0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, +0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, +0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x61, +0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x46, 0x61, 0x72, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x76, 0x31, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x43, 0x68, 0x61, +0x6e, 0x6e, 0x65, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x53, 0x61, +0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x64, 0x45, 0x64, 0x67, 0x65, +0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x61, 0x6f, 0x42, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x7a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, +0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x66, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, +0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x78, 0x65, +0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x58, 0x59, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, 0x6c, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x65, 0x4c, +0x65, 0x76, 0x65, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x69, 0x62, 0x6c, +0x53, 0x48, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x33, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x73, 0x75, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, +0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, +0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, +0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x53, 0x68, 0x61, 0x64, 0x6f, +0x77, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x52, +0x61, 0x74, 0x69, 0x6f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x32, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, +0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, +0x73, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x76, 0x73, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x42, 0x6c, 0x65, 0x65, 0x64, +0x52, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, +0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, +0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, +0x69, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, +0x6c, 0x6f, 0x66, 0x66, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, +0x75, 0x74, 0x4f, 0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, +0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, +0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, +0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, +0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x46, 0x72, +0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x52, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, +0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, +0x72, 0x55, 0x76, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, +0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x42, 0x69, 0x61, 0x73, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x53, 0x74, +0x72, 0x69, 0x64, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x73, +0x74, 0x6f, 0x6d, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x37, +0x30, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, +0x65, 0x72, 0x76, 0x65, 0x64, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, +0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x34, 0x30, 0x5d, 0x3b, +0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, +0x61, 0x67, 0x65, 0x55, 0x56, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x30, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, +0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x34, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, +0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, +0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, +0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, +0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, +0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, +0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, +0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, +0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, +0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, +0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, +0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, +0x64, 0x65, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x38, +0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x36, 0x20, 0x3d, 0x20, +0x5f, 0x32, 0x38, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x66, +0x6d, 0x61, 0x28, 0x5f, 0x32, 0x38, 0x34, 0x2e, 0x7a, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x36, 0x30, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, +0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x20, 0x3d, 0x20, +0x5f, 0x32, 0x36, 0x30, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x33, 0x33, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x36, +0x32, 0x29, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x00, +0x20, 0x20, 0x20, 0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x33, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x33, 0x33, 0x30, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x36, 0x32, 0x20, 0x3c, 0x20, 0x30, +0x2e, 0x30, 0x29, 0x20, 0x3f, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, +0x39, 0x29, 0x20, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x30, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x39, 0x20, +0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x33, 0x33, 0x39, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x5f, 0x32, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x38, +0x34, 0x2e, 0x78, 0x79, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2b, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, +0x28, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, +0x33, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x33, 0x33, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x33, 0x33, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x31, 0x2e, 0x79, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x55, 0x56, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x36, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x32, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, +0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x49, 0x6d, +0x61, 0x67, 0x65, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, +0x5f, 0x35, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x70, +0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, +0x33, 0x20, 0x7b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, +0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, +0x65, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, +0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, +0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x5b, +0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, +0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, +0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, +0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, +0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x33, 0x26, 0x20, 0x73, 0x70, +0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x20, 0x5b, 0x5b, 0x62, 0x75, +0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x39, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, +0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, +0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, +0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, +0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x31, 0x30, 0x20, 0x3d, 0x20, +0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x66, 0x6f, 0x72, 0x6d, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, +0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, +0x61, 0x67, 0x65, 0x55, 0x56, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, +0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, +0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x34, +0x31, 0x31, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x5f, 0x34, 0x31, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x49, 0x6d, 0x61, 0x67, +0x65, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x34, 0x32, +0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x34, 0x31, 0x34, 0x29, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x30, 0x2e, 0x78, 0x20, +0x3e, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x34, 0x32, +0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x34, 0x32, 0x31, 0x29, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x30, 0x2e, 0x78, 0x20, +0x3c, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x38, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x34, 0x33, +0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x34, 0x32, 0x38, 0x29, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x30, 0x2e, 0x79, 0x20, +0x3c, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x33, 0x35, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x32, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x34, 0x34, +0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x34, 0x33, 0x35, 0x29, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x30, 0x2e, 0x79, 0x20, +0x3e, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x34, 0x32, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x33, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x35, +0x36, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x34, 0x32, 0x29, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, +0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x34, 0x31, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, +0x5f, 0x34, 0x31, 0x30, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, +0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, +0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, +0x6d, 0x61, 0x67, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x5f, 0x34, +0x31, 0x31, 0x29, 0x2c, 0x20, 0x62, 0x69, 0x61, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x34, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, +0x37, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, +0x34, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x35, +0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x35, 0x34, +0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x34, 0x36, 0x32, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x31, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x35, 0x34, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x5f, +0x35, 0x34, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2b, 0x20, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, +0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x68, 0x61, 0x6c, 0x66, +0x28, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x35, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x34, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x38, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x38, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, +0x34, 0x37, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x38, 0x31, 0x2e, +0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x35, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x38, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, +0x5f, 0x35, 0x36, 0x33, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x6f, 0x69, 0x64, +0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, +0x63, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, +0x75, 0x66, 0x66, 0x65, 0x72, 0x31, 0x20, 0x7b, 0x00, 0x64, 0x65, 0x70, 0x74, 0x68, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, +0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, +0x6f, 0x77, 0x4d, 0x61, 0x70, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, +0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, +0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, +0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, +0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x53, 0x6d, +0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, +0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x34, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, +0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x35, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, +0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x20, 0x5b, +0x5b, 0x69, 0x64, 0x28, 0x36, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, +0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x37, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, +0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x20, 0x5b, 0x5b, +0x69, 0x64, 0x28, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, +0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x39, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x5b, 0x5b, 0x69, 0x64, +0x28, 0x31, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, +0x64, 0x28, 0x31, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, +0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x20, 0x5b, 0x5b, +0x69, 0x64, 0x28, 0x31, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, +0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x33, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, +0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, +0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, +0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x31, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, +0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x37, 0x29, +0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, +0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x33, 0x26, 0x20, 0x73, 0x70, +0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x20, 0x5b, 0x5b, 0x62, 0x75, +0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x39, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, +0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, +0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, +0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, +0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x36, 0x34, 0x34, 0x20, 0x3d, 0x20, +0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x66, 0x6f, 0x72, 0x6d, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, +0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, +0x61, 0x67, 0x65, 0x55, 0x56, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, +0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, +0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x36, +0x34, 0x35, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x5f, 0x36, 0x34, 0x34, 0x29, 0x2e, 0x78, 0x79, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x36, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x49, 0x6d, 0x61, 0x67, +0x65, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x36, 0x35, +0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x36, 0x34, 0x38, 0x29, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, 0x34, 0x2e, 0x78, 0x20, +0x3e, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x20, +0x3d, 0x20, 0x5f, 0x36, 0x34, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x36, 0x36, +0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, 0x34, 0x2e, 0x78, 0x20, +0x3c, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x36, 0x32, 0x20, +0x3d, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x36, 0x36, +0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x36, 0x36, 0x32, 0x29, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, 0x34, 0x2e, 0x79, 0x20, +0x3c, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x36, 0x39, 0x20, +0x3d, 0x20, 0x5f, 0x36, 0x36, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x36, 0x37, +0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x36, 0x36, 0x39, 0x29, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, 0x34, 0x2e, 0x79, 0x20, +0x3e, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x37, 0x36, 0x20, +0x3d, 0x20, 0x5f, 0x36, 0x36, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x39, +0x39, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x37, 0x36, 0x29, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, +0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x36, 0x34, 0x35, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, +0x5f, 0x36, 0x34, 0x34, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x34, 0x20, 0x5f, 0x36, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, +0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, +0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, +0x6d, 0x61, 0x67, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x5f, 0x36, +0x34, 0x35, 0x29, 0x2c, 0x20, 0x62, 0x69, 0x61, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x34, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x36, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x39, +0x31, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, +0x36, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x39, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x39, +0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x39, 0x36, +0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x36, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x36, 0x39, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x36, 0x31, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x39, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x39, 0x36, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x39, 0x36, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x5f, +0x39, 0x36, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2b, 0x20, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, +0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x68, 0x61, 0x6c, 0x66, +0x28, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x39, 0x33, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x34, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 0x32, +0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x35, 0x2e, 0x79, 0x20, +0x3d, 0x20, 0x5f, 0x37, 0x31, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, +0x30, 0x32, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x35, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x39, 0x39, 0x36, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x33, 0x20, 0x5f, 0x35, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, +0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x64, 0x6f, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x36, +0x39, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x5f, 0x35, 0x33, 0x34, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x37, 0x36, 0x39, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, 0x66, +0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x34, 0x20, 0x3d, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x33, 0x34, 0x2e, 0x79, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x38, 0x36, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, +0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x38, 0x35, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x39, 0x37, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x37, 0x38, 0x36, +0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, +0x79, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, +0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x5f, 0x37, 0x38, 0x35, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x31, 0x5d, +0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x37, 0x38, 0x36, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, +0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x38, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x5f, 0x31, +0x30, 0x32, 0x38, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x39, 0x39, +0x37, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x37, 0x36, 0x39, 0x20, 0x2d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, +0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, +0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, +0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x39, 0x39, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, +0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, +0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, +0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, +0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x39, +0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, +0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, +0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, +0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x35, 0x33, 0x34, 0x29, 0x2c, 0x20, 0x6c, 0x65, +0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x31, 0x30, +0x33, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x6d, 0x61, +0x28, 0x5f, 0x37, 0x36, 0x39, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, +0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, +0x65, 0x61, 0x72, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, +0x30, 0x32, 0x38, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x36, 0x38, 0x20, 0x3d, +0x20, 0x5f, 0x39, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, +0x29, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x31, 0x39, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3e, 0x20, +0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, +0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x38, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, +0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, +0x77, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x61, 0x73, 0x74, +0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, +0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x35, 0x33, 0x34, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, +0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x29, 0x20, +0x2a, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, +0x2d, 0x28, 0x5f, 0x39, 0x39, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, +0x37, 0x36, 0x39, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, +0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x38, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x38, 0x20, +0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x39, +0x31, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x38, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x5f, +0x31, 0x30, 0x32, 0x38, 0x20, 0x2d, 0x20, 0x5f, 0x38, 0x31, 0x39, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x30, 0x30, +0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x39, 0x38, +0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x39, 0x38, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x38, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x34, 0x2e, 0x79, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x38, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, +0x31, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x34, 0x20, +0x3d, 0x20, 0x5f, 0x39, 0x38, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, +0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x31, 0x30, 0x30, 0x34, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, +0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, +0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, +0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, +0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, +0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, +0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, +0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x37, 0x20, 0x3d, 0x20, +0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, +0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, +0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, +0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, +0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, +0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, +0x31, 0x38, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, +0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x3e, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x37, 0x5d, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, +0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, +0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, +0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x5b, 0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, +0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, +0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, +0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x66, +0x69, 0x6e, 0x65, 0x64, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x29, 0x20, 0x3f, 0x20, 0x43, 0x4f, 0x4e, 0x46, +0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, +0x74, 0x6d, 0x70, 0x20, 0x3a, 0x20, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, +0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x5b, 0x5b, 0x63, 0x6c, 0x69, +0x70, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, 0x5d, 0x20, 0x5b, 0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x30, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, +0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, +0x69, 0x70, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x36, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x30, 0x20, 0x3d, 0x20, +0x5f, 0x36, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, +0x28, 0x5f, 0x36, 0x37, 0x2e, 0x7a, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x30, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 0x2e, 0x77, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x37, 0x32, 0x29, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x30, 0x38, +0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x37, 0x32, 0x20, 0x3c, 0x20, +0x30, 0x2e, 0x30, 0x29, 0x20, 0x3f, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, +0x31, 0x39, 0x29, 0x20, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x20, +0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x38, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x5f, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x36, 0x37, 0x2e, 0x78, +0x79, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2b, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, +0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, 0x38, 0x20, 0x3d, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, +0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x38, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x20, 0x3d, 0x20, 0x5f, +0x38, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, +0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, +0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, +0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, +0x6e, 0x74, 0x20, 0x5f, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, +0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x20, 0x3d, 0x20, +0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x31, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x38, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, +0x28, 0x5f, 0x36, 0x37, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, +0x30, 0x20, 0x2f, 0x20, 0x5f, 0x39, 0x39, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x37, 0x2e, 0x77, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, +0x29, 0x20, 0x2f, 0x20, 0x5f, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, +0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, +0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x2c, 0x20, 0x31, 0x2e, +0x30, 0x29, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x2e, 0x77, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x30, +0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x38, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, +0x30, 0x29, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x2e, 0x77, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, +0x5f, 0x37, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x3d, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, +0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, +0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x35, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x32, 0x38, +0x35, 0x2e, 0x7a, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, +0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x31, 0x2e, 0x77, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x36, 0x33, 0x29, 0x20, 0x3c, 0x20, 0x31, +0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x31, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x33, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, +0x5f, 0x32, 0x36, 0x33, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x3f, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x38, +0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x20, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, +0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x34, 0x30, +0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x34, +0x30, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x32, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, +0x2f, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x32, 0x20, 0x5f, 0x32, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x38, 0x35, 0x2e, 0x78, 0x79, 0x20, 0x2a, 0x20, +0x30, 0x2e, 0x35, 0x29, 0x20, 0x2b, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x32, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x33, 0x34, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x56, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x33, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, +0x32, 0x37, 0x37, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, +0x5f, 0x32, 0x37, 0x37, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x37, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x35, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x30, 0x2e, 0x78, +0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x35, 0x36, 0x33, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, +0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x2e, +0x79, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x34, 0x31, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x37, 0x20, 0x3d, 0x20, +0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, +0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, +0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, +0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, +0x20, 0x5f, 0x34, 0x31, 0x31, 0x2c, 0x20, 0x62, 0x69, 0x61, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x37, 0x2e, 0x77, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x35, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x20, +0x3d, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2b, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, +0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x34, +0x35, 0x39, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x35, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, +0x37, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x2e, 0x79, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x35, 0x34, 0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x36, +0x33, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x31, 0x30, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x32, 0x20, 0x5f, 0x36, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, 0x34, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x39, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x39, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x34, 0x35, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x31, +0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x34, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x36, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, +0x3a, 0x6d, 0x61, 0x78, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, +0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x69, 0x6d, +0x61, 0x67, 0x65, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, +0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, +0x61, 0x6d, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x5f, 0x36, 0x34, 0x35, +0x2c, 0x20, 0x62, 0x69, 0x61, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, +0x2e, 0x30, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x36, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x39, 0x31, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x36, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x39, +0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x39, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x36, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, +0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2b, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, +0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, +0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x39, 0x33, 0x29, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x36, 0x38, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x36, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 0x32, 0x2e, 0x78, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x36, 0x38, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, +0x31, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x36, 0x38, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x39, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x39, 0x36, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x35, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x31, 0x30, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x33, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x73, 0x74, +0x3a, 0x3a, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x39, +0x39, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x37, 0x36, 0x39, 0x20, +0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, +0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, +0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, +0x39, 0x39, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x32, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, +0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x39, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x20, +0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, +0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, +0x6f, 0x67, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, +0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, +0x6c, 0x72, 0x2c, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x78, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, +0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, +0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, +0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x35, 0x33, 0x34, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, +0x28, 0x6d, 0x69, 0x78, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x31, 0x34, 0x2e, 0x79, 0x29, 0x2c, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x31, 0x34, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x61, 0x73, +0x74, 0x3a, 0x3a, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x37, 0x36, 0x39, 0x2c, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, +0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, +0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x2c, 0x20, 0x30, 0x2e, +0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x33, 0x20, 0x5f, 0x38, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, +0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x31, 0x39, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, +0x38, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, +0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, +0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, +0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, +0x5f, 0x35, 0x33, 0x34, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, +0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, +0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, +0x2d, 0x28, 0x5f, 0x39, 0x39, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, +0x37, 0x36, 0x39, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, +0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x35, 0x33, 0x36, +0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x38, 0x31, 0x39, 0x29, 0x29, +0x20, 0x2b, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x33, 0x36, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x30, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x32, +0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x35, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x66, 0x6d, +0x61, 0x28, 0x5f, 0x33, 0x35, 0x32, 0x2e, 0x7a, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x20, 0x3d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x39, 0x34, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x32, 0x38, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, +0x31, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x33, 0x33, 0x30, +0x29, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x39, 0x38, 0x20, 0x3d, +0x20, 0x5f, 0x33, 0x32, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x39, 0x38, 0x2e, +0x77, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x33, 0x30, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x3f, 0x20, 0x28, +0x2d, 0x31, 0x2e, 0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x29, 0x20, 0x3a, 0x20, 0x31, 0x2e, +0x30, 0x38, 0x34, 0x32, 0x30, 0x32, 0x32, 0x65, 0x2d, 0x31, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x34, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x34, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x38, 0x20, 0x2a, 0x20, +0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x31, 0x38, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x5f, 0x33, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x35, 0x32, 0x2e, +0x78, 0x79, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2b, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, +0x2e, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x30, 0x31, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x34, 0x30, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x34, 0x30, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, +0x55, 0x56, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x39, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x37, 0x20, 0x3d, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, +0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, +0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, +0x30, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, +0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, +0x32, 0x31, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x31, 0x20, +0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x30, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x33, 0x35, 0x32, +0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x32, 0x31, 0x35, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, +0x5f, 0x32, 0x31, 0x30, 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x31, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x32, 0x31, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x32, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, +0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, +0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, +0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x32, 0x30, 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x31, 0x2c, 0x20, 0x31, 0x2e, +0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x35, 0x32, 0x2e, 0x77, 0x2c, 0x20, 0x5f, 0x32, 0x33, 0x36, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x32, +0x30, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x30, 0x37, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, +0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x35, 0x32, 0x2e, 0x77, 0x2c, 0x20, 0x5f, 0x32, 0x33, 0x36, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x3b, 0x00, 0x4c, 0x53, 0x4c, 0x47, 0x5f, 0x54, 0x41, 0x4d, 0xf6, 0x0b, 0x00, +0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x96, +0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xe8, 0x02, 0x00, 0x00, 0x01, 0x20, 0x01, +0xfc, 0x02, 0x00, 0x00, 0x01, 0x30, 0x01, 0xc4, 0x04, 0x00, 0x00, 0x01, 0x44, 0x01, 0x06, 0x05, 0x00, 0x00, 0x01, 0x80, +0x00, 0x1e, 0x05, 0x00, 0x00, 0x01, 0x90, 0x00, 0x1e, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x02, +0x00, 0x01, 0x5c, 0x07, 0x00, 0x00, 0x02, 0x10, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x02, 0x10, 0x01, 0xac, 0x08, 0x00, 0x00, +0x02, 0x20, 0x01, 0xbe, 0x08, 0x00, 0x00, 0x02, 0x30, 0x01, 0x74, 0x0a, 0x00, 0x00, 0x02, 0x44, 0x01, 0xb4, 0x0a, 0x00, +0x00, 0x02, 0x80, 0x00, 0xca, 0x0a, 0x00, 0x00, 0x02, 0x90, 0x00, 0xca, 0x0a, 0x00, 0x00, 0x82, 0x09, 0x00, 0x00, 0x84, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, +0x00, 0x09, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, +0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, +0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, +0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, +0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, +0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, +0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, +0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, +0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x02, 0x00, 0x5b, 0x00, 0x02, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, +0x00, 0x5f, 0x00, 0x5d, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x02, +0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x5d, 0x00, 0x6b, 0x00, 0x6c, +0x00, 0x6d, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, +0x00, 0x77, 0x00, 0x78, 0x00, 0x5d, 0x00, 0xbf, 0x09, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x7a, +0x00, 0x7b, 0x00, 0x02, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x05, 0x00, 0x82, +0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x8a, +0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, +0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, +0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, +0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, +0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, +0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, +0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0x54, +0x00, 0xd0, 0x00, 0x02, 0x00, 0x87, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0x5a, +0x00, 0x02, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0x02, 0x00, 0xdb, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, +0x00, 0xdc, 0x00, 0x5d, 0x00, 0xdd, 0x00, 0xde, 0x00, 0x02, 0x00, 0xdf, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0xe0, +0x00, 0x5d, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0xe4, 0x00, 0x5d, +0x00, 0xe5, 0x00, 0xe6, 0x00, 0x02, 0x00, 0xe7, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0xe8, 0x00, 0x5d, 0x00, 0xe9, +0x00, 0xea, 0x00, 0x02, 0x00, 0xeb, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, +0x00, 0xf0, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0x5d, +0x00, 0xf9, 0x00, 0x5d, 0x00, 0x51, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x5a, +0x00, 0x02, 0x00, 0x5d, 0x00, 0x80, 0x10, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, +0x00, 0x02, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x05, 0x00, 0xfa, 0x00, 0xfb, +0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, +0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, +0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, +0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, +0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, +0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, +0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, +0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0x54, 0x00, 0xd0, +0x00, 0x02, 0x00, 0x87, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xff, 0x00, 0xd4, 0x00, 0x00, 0x01, 0xd5, 0x00, 0xd6, +0x00, 0x01, 0x01, 0x02, 0x00, 0x02, 0x01, 0x03, 0x01, 0x02, 0x00, 0x04, 0x01, 0x5d, 0x00, 0x05, 0x01, 0x06, 0x01, 0x07, +0x01, 0x02, 0x00, 0x08, 0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x09, 0x01, 0x5d, 0x00, 0x0a, 0x01, 0x0b, 0x01, 0x0c, +0x01, 0x0d, 0x01, 0x0e, 0x01, 0x02, 0x00, 0x0f, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, +0x00, 0x13, 0x01, 0x5d, 0x00, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x02, 0x00, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, +0x01, 0x1b, 0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x1c, 0x01, 0x5d, 0x00, 0x1d, 0x01, 0x1e, 0x01, 0x1f, 0x01, 0x20, +0x01, 0x21, 0x01, 0x04, 0x01, 0x5d, 0x00, 0x5a, 0x00, 0x02, 0x00, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x02, +0x00, 0x26, 0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x27, 0x01, 0x5d, 0x00, 0x28, 0x01, 0x29, 0x01, 0x02, 0x00, 0x2a, +0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x2b, 0x01, 0x5d, 0x00, 0x2c, 0x01, 0x2d, 0x01, 0x02, 0x00, 0x2e, 0x01, 0x5d, +0x00, 0x5e, 0x00, 0x02, 0x00, 0x2f, 0x01, 0x5d, 0x00, 0x30, 0x01, 0x31, 0x01, 0x02, 0x00, 0x32, 0x01, 0x5d, 0x00, 0x5e, +0x00, 0x02, 0x00, 0x33, 0x01, 0x5d, 0x00, 0x34, 0x01, 0x35, 0x01, 0x02, 0x00, 0x36, 0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, +0x00, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x01, 0x40, +0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x01, 0x5d, 0x00, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x5d, +0x00, 0xec, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x49, 0x01, 0x02, 0x00, 0x4a, +0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x05, 0x00, 0x51, 0x01, 0x52, 0x01, 0x08, +0x00, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x02, 0x00, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x00, 0x02, +0x00, 0x5a, 0x01, 0x5b, 0x01, 0x5d, 0x00, 0x91, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x7a, +0x00, 0xd6, 0x00, 0x5a, 0x00, 0x02, 0x00, 0x5c, 0x01, 0x5d, 0x00, 0xba, 0x0b, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, +0x00, 0x5d, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, +0x00, 0x5e, 0x01, 0x5f, 0x01, 0x08, 0x00, 0x60, 0x01, 0x0a, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, +0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, +0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, +0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, +0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, +0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, +0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, +0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, +0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x02, 0x00, 0x5b, 0x00, 0x02, 0x00, 0x5c, +0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x5f, 0x00, 0x5d, 0x00, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, +0x01, 0x66, 0x01, 0x67, 0x01, 0x02, 0x00, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x6b, +0x01, 0x5d, 0x00, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, +0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, +0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x5d, 0x00, 0xd7, 0x08, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x83, +0x01, 0x84, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, +0x00, 0x0a, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, +0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, +0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, +0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0x2c, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0x30, +0x00, 0xad, 0x00, 0xae, 0x00, 0x33, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0x36, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, +0x00, 0x3b, 0x00, 0x3c, 0x00, 0xb9, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x43, 0x00, 0xc0, +0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0x4e, +0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0x54, 0x00, 0x55, 0x00, 0x85, 0x01, 0x86, 0x01, 0x87, +0x01, 0x88, 0x01, 0x5a, 0x00, 0x02, 0x00, 0x5b, 0x00, 0x02, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x5f, +0x00, 0x5d, 0x00, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x02, 0x00, 0x90, +0x01, 0x91, 0x01, 0x92, 0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x93, 0x01, 0x5d, 0x00, 0x94, 0x01, 0x95, 0x01, 0x96, +0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x9c, 0x01, 0x9d, +0x01, 0x9e, 0x01, 0x5d, 0x00, 0xe9, 0x08, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x83, 0x01, 0x84, 0x01, 0x7b, 0x00, 0x02, +0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x05, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, +0x00, 0x85, 0x00, 0x86, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, +0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x96, +0x00, 0x97, 0x00, 0x98, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, +0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0x2c, 0x00, 0xa9, 0x00, 0xaa, +0x00, 0xab, 0x00, 0x30, 0x00, 0xad, 0x00, 0xae, 0x00, 0x33, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0x36, 0x00, 0xb3, 0x00, 0xb4, +0x00, 0xb5, 0x00, 0xb6, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0xb9, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0xbd, 0x00, 0xbe, +0x00, 0x43, 0x00, 0xc0, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, +0x00, 0xc9, 0x00, 0x4e, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0x54, 0x00, 0xd0, 0x00, 0x02, +0x00, 0x0b, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0x9f, 0x01, 0xa0, 0x01, 0xd6, 0x00, 0x5a, 0x00, 0x02, 0x00, 0xa1, +0x01, 0xa2, 0x01, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0x02, 0x00, 0xdb, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0xdc, +0x00, 0x5d, 0x00, 0xdd, 0x00, 0xde, 0x00, 0x02, 0x00, 0xdf, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0xe0, 0x00, 0x5d, +0x00, 0xe1, 0x00, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0xe4, 0x00, 0x5d, 0x00, 0xe5, +0x00, 0xe6, 0x00, 0x02, 0x00, 0xe7, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0xe8, 0x00, 0x5d, 0x00, 0xe9, 0x00, 0xea, +0x00, 0x02, 0x00, 0xeb, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, 0x00, 0xf0, +0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0x5d, 0x00, 0xf9, 0x00, 0x5d, +0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x83, 0x01, 0x84, 0x01, 0x5a, 0x00, 0x02, 0x00, 0x5d, 0x00, 0xa5, +0x0e, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x83, 0x01, 0x84, 0x01, 0x7b, 0x00, 0x02, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, +0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x05, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0x0a, +0x00, 0x02, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, +0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x1d, +0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, +0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0x2c, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0x30, 0x00, 0xad, +0x00, 0xae, 0x00, 0x33, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0x36, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0x3b, +0x00, 0x3c, 0x00, 0xb9, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x43, 0x00, 0xc0, 0x00, 0x45, +0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0x4e, 0x00, 0xcb, +0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0x54, 0x00, 0xd0, 0x00, 0x02, 0x00, 0x0b, 0x00, 0xd1, 0x00, 0xd2, +0x00, 0xd3, 0x00, 0xa7, 0x01, 0x9f, 0x01, 0xa8, 0x01, 0xa0, 0x01, 0xd6, 0x00, 0xa9, 0x01, 0x02, 0x00, 0xaa, 0x01, 0x03, +0x01, 0x02, 0x00, 0x04, 0x01, 0x5d, 0x00, 0xab, 0x01, 0xac, 0x01, 0x07, 0x01, 0x02, 0x00, 0x08, 0x01, 0x5d, 0x00, 0x5e, +0x00, 0x02, 0x00, 0x09, 0x01, 0x5d, 0x00, 0xad, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x02, 0x00, 0xae, 0x01, 0xaf, 0x01, 0x5d, +0x00, 0x5e, 0x00, 0x02, 0x00, 0x13, 0x01, 0x5d, 0x00, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x02, 0x00, 0xb0, 0x01, 0x5d, +0x00, 0x5e, 0x00, 0x02, 0x00, 0x1c, 0x01, 0x5d, 0x00, 0x1d, 0x01, 0x1e, 0x01, 0x1f, 0x01, 0x20, 0x01, 0x21, 0x01, 0x04, +0x01, 0x5d, 0x00, 0x5a, 0x00, 0x02, 0x00, 0xb1, 0x01, 0xb2, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x02, 0x00, 0x26, +0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x27, 0x01, 0x5d, 0x00, 0x28, 0x01, 0x29, 0x01, 0x02, 0x00, 0x2a, 0x01, 0x5d, +0x00, 0x5e, 0x00, 0x02, 0x00, 0x2b, 0x01, 0x5d, 0x00, 0x2c, 0x01, 0x2d, 0x01, 0x02, 0x00, 0x2e, 0x01, 0x5d, 0x00, 0x5e, +0x00, 0x02, 0x00, 0x2f, 0x01, 0x5d, 0x00, 0x30, 0x01, 0x31, 0x01, 0x02, 0x00, 0x32, 0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, +0x00, 0x33, 0x01, 0x5d, 0x00, 0x34, 0x01, 0x35, 0x01, 0x02, 0x00, 0x36, 0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x37, +0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, +0x01, 0xb6, 0x01, 0x5d, 0x00, 0x44, 0x01, 0x45, 0x01, 0xb7, 0x01, 0x47, 0x01, 0x48, 0x01, 0x5d, 0x00, 0xcc, 0x02, 0x00, +0x00, 0x1c, 0x00, 0x00, 0x00, 0x83, 0x01, 0x84, 0x01, 0x49, 0x01, 0x02, 0x00, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, +0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x05, 0x00, 0x51, 0x01, 0x52, 0x01, 0x08, 0x00, 0x53, 0x01, 0x54, 0x01, 0x55, +0x01, 0x02, 0x00, 0x56, 0x01, 0x57, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0x5a, 0x00, 0x02, 0x00, 0x5a, 0x01, 0x5b, 0x01, 0x5d, +0x00, 0x92, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x83, 0x01, 0x84, 0x01, 0xd6, 0x00, 0x5a, 0x00, 0x02, 0x00, 0x5c, +0x01, 0x5d, 0x00, 0x0e, 0x0b, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x83, 0x01, 0x84, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, +0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x5e, 0x01, 0x5f, 0x01, 0x08, 0x00, 0x60, +0x01, 0x0a, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, +0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, +0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, +0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0x2c, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0x30, +0x00, 0xad, 0x00, 0xae, 0x00, 0x33, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0x36, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, +0x00, 0x3b, 0x00, 0x3c, 0x00, 0xb9, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x43, 0x00, 0xc0, +0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0x4e, +0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0x54, 0x00, 0x55, 0x00, 0x85, 0x01, 0x86, 0x01, 0x87, +0x01, 0x88, 0x01, 0x5a, 0x00, 0x02, 0x00, 0x5b, 0x00, 0x02, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x5f, +0x00, 0x5d, 0x00, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0x02, 0x00, 0xc8, +0x01, 0xc9, 0x01, 0xca, 0x01, 0x5d, 0x00, 0x5e, 0x00, 0x02, 0x00, 0xcb, 0x01, 0x5d, 0x00, 0xcc, 0x01, 0xcd, 0x01, 0xce, +0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, +0x01, 0xd9, 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0x82, +0x01, 0x5d, 0x00, 0x4c, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x41, 0x4d, 0x52, 0x0c, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x92, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, +0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xf6, 0x02, 0x00, 0x00, 0x01, 0x20, 0x01, 0x10, 0x03, 0x00, 0x00, 0x01, 0x30, +0x01, 0x04, 0x05, 0x00, 0x00, 0x01, 0x44, 0x01, 0x68, 0x05, 0x00, 0x00, 0x01, 0x80, 0x00, 0x92, 0x05, 0x00, 0x00, 0x01, +0x90, 0x00, 0x92, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0xc2, 0x06, 0x00, 0x00, 0x02, 0x00, 0x01, 0xce, 0x07, 0x00, 0x00, +0x02, 0x10, 0x00, 0xc2, 0x06, 0x00, 0x00, 0x02, 0x10, 0x01, 0xf6, 0x02, 0x00, 0x00, 0x02, 0x20, 0x01, 0x32, 0x09, 0x00, +0x00, 0x02, 0x30, 0x01, 0x04, 0x05, 0x00, 0x00, 0x02, 0x44, 0x01, 0x68, 0x05, 0x00, 0x00, 0x02, 0x80, 0x00, 0x22, 0x0b, +0x00, 0x00, 0x02, 0x90, 0x00, 0x22, 0x0b, 0x00, 0x00, 0x66, 0x0d, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0xe2, 0x01, 0xe3, +0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe4, 0x01, 0xe6, 0x01, 0x02, 0x00, 0xe7, 0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, +0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, +0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, +0x01, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, +0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, +0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, +0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, +0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x05, 0x00, 0xe4, +0x01, 0x30, 0x02, 0x02, 0x00, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x36, +0x02, 0x02, 0x00, 0x37, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x38, 0x02, 0x02, 0x00, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, +0x02, 0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x46, +0x02, 0x47, 0x02, 0x42, 0x02, 0x48, 0x02, 0x46, 0x02, 0x49, 0x02, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, +0x02, 0x4f, 0x02, 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, 0x5d, 0x00, 0xe4, 0x01, 0x64, 0x10, 0x00, +0x00, 0xae, 0x00, 0x00, 0x00, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe4, 0x01, 0xe6, 0x01, 0x02, 0x00, 0xe7, +0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, +0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, +0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x01, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, +0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, +0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, +0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, +0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, +0x02, 0x2e, 0x02, 0x2f, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x55, 0x02, 0x02, 0x00, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x05, +0x00, 0xe4, 0x01, 0x59, 0x02, 0xe4, 0x01, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x30, 0x02, 0x02, +0x00, 0x5d, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x36, 0x02, 0x02, 0x00, 0x31, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x5e, 0x02, 0x02, +0x00, 0x39, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0x42, 0x02, 0x64, 0x02, 0x46, 0x02, 0x47, +0x02, 0x42, 0x02, 0x65, 0x02, 0x46, 0x02, 0x66, 0x02, 0x67, 0x02, 0x42, 0x02, 0x68, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, +0x02, 0x69, 0x02, 0x46, 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x42, 0x02, 0x6c, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0x6d, +0x02, 0x46, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x42, 0x02, 0x70, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0x71, 0x02, 0x46, +0x02, 0x72, 0x02, 0x73, 0x02, 0x42, 0x02, 0x74, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0x75, 0x02, 0x76, 0x02, 0x77, +0x02, 0x78, 0x02, 0x79, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, +0x02, 0x82, 0x02, 0x46, 0x02, 0x83, 0x02, 0x54, 0x02, 0x5d, 0x00, 0xe4, 0x01, 0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, +0x00, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe4, 0x01, 0x84, 0x02, 0x02, 0x00, 0x5d, 0x00, 0xe4, 0x01, 0x06, +0x1d, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe4, 0x01, 0xe6, 0x01, 0x02, +0x00, 0xe7, 0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, +0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, +0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x01, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, +0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, +0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, +0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, 0x02, 0x22, +0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, +0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x55, 0x02, 0x02, 0x00, 0x56, 0x02, 0x57, 0x02, 0x58, +0x02, 0x05, 0x00, 0xe4, 0x01, 0x85, 0x02, 0xe4, 0x01, 0x86, 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, 0x02, 0x8a, 0x02, 0x8b, +0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, 0x02, 0x91, 0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x05, +0x00, 0xe4, 0x01, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x30, 0x02, 0x02, 0x00, 0x5d, 0x02, 0x05, +0x00, 0xe4, 0x01, 0x36, 0x02, 0x02, 0x00, 0x31, 0x02, 0x32, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x95, 0x02, 0x02, 0x00, 0x39, +0x02, 0x96, 0x02, 0x97, 0x02, 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x42, 0x02, 0x9b, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, +0x02, 0x9c, 0x02, 0x46, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x42, 0x02, 0x9f, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0xa0, +0x02, 0x46, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0x42, 0x02, 0xa3, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0xa4, 0x02, 0x46, +0x02, 0xa5, 0x02, 0xa6, 0x02, 0x42, 0x02, 0xa7, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0xa8, 0x02, 0x46, 0x02, 0xa9, +0x02, 0xaa, 0x02, 0x42, 0x02, 0xab, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xaf, +0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, +0x02, 0x46, 0x02, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0x42, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, +0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0xc0, 0x02, 0xc8, 0x02, 0xc3, 0x02, 0xc9, +0x02, 0xc0, 0x02, 0xca, 0x02, 0xc3, 0x02, 0xcb, 0x02, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xc0, 0x02, 0xd0, +0x02, 0xd1, 0x02, 0xc3, 0x02, 0xc9, 0x02, 0xc0, 0x02, 0xd2, 0x02, 0xc3, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, 0x02, 0xc0, +0x02, 0xd6, 0x02, 0xc3, 0x02, 0xc9, 0x02, 0xc0, 0x02, 0xd7, 0x02, 0xc3, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, +0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0x54, 0x02, 0x5d, 0x00, 0xe4, 0x01, 0xbc, +0x03, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe4, 0x01, 0x49, 0x01, 0x02, +0x00, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x51, +0x01, 0x52, 0x01, 0x08, 0x00, 0xe9, 0x02, 0xe4, 0x01, 0xea, 0x02, 0x02, 0x00, 0xeb, 0x02, 0x05, 0x00, 0xe4, 0x01, 0xec, +0x02, 0xe4, 0x01, 0x30, 0x02, 0x02, 0x00, 0xed, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x36, 0x02, 0x02, 0x00, 0x33, 0x02, 0x05, +0x00, 0xe4, 0x01, 0xee, 0x02, 0x02, 0x00, 0x39, 0x02, 0xef, 0x02, 0xf0, 0x02, 0x54, 0x02, 0x5d, 0x00, 0xe4, 0x01, 0xec, +0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe4, 0x01, 0x30, 0x02, 0x02, +0x00, 0x5d, 0x02, 0x05, 0x00, 0xe4, 0x01, 0xf1, 0x02, 0x02, 0x00, 0x39, 0x02, 0xf2, 0x02, 0x54, 0x02, 0x5d, 0x00, 0xe4, +0x01, 0xec, 0x10, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe4, 0x01, 0xe6, +0x01, 0x02, 0x00, 0xe7, 0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, +0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, +0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x01, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, +0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, +0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, +0x02, 0x18, 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, +0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x2b, +0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x05, 0x00, 0xe4, 0x01, 0xf3, 0x02, 0xf4, 0x02, 0xe4, 0x01, 0x30, +0x02, 0x02, 0x00, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0x05, +0x00, 0xe4, 0x01, 0x36, 0x02, 0x02, 0x00, 0x37, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x38, 0x02, 0x02, 0x00, 0x39, 0x02, 0x3a, +0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0x42, 0x02, 0xff, 0x02, 0x00, +0x03, 0x01, 0x03, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0x02, 0x03, 0x46, 0x02, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, +0x03, 0x07, 0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, +0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, 0x18, 0x03, 0x19, 0x03, 0x54, +0x02, 0x5d, 0x00, 0xe4, 0x01, 0x66, 0x0d, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, +0x01, 0xe4, 0x01, 0xe6, 0x01, 0x02, 0x00, 0xe7, 0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, +0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, +0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x01, 0x00, 0x02, 0x01, +0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, +0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, +0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, +0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, +0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x30, 0x02, 0x02, +0x00, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x36, 0x02, 0x02, 0x00, 0x37, +0x02, 0x05, 0x00, 0xe4, 0x01, 0x38, 0x02, 0x02, 0x00, 0x39, 0x02, 0x3a, 0x02, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x1d, +0x03, 0x1e, 0x03, 0x1f, 0x03, 0x20, 0x03, 0x42, 0x02, 0x21, 0x03, 0x22, 0x03, 0x23, 0x03, 0x46, 0x02, 0x47, 0x02, 0x42, +0x02, 0x24, 0x03, 0x46, 0x02, 0x25, 0x03, 0x26, 0x03, 0x27, 0x03, 0x28, 0x03, 0x29, 0x03, 0x2a, 0x03, 0x2b, 0x03, 0x2c, +0x03, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x54, 0x02, 0x5d, 0x00, 0xe4, 0x01, 0x2d, 0x10, 0x00, 0x00, 0xae, 0x00, 0x00, +0x00, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe4, 0x01, 0xe6, 0x01, 0x02, 0x00, 0xe7, 0x01, 0xe8, 0x01, 0xe9, +0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, +0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, +0x01, 0xfe, 0x01, 0xff, 0x01, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, +0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, +0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, +0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, +0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, +0x02, 0x05, 0x00, 0xe4, 0x01, 0x55, 0x02, 0x02, 0x00, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x30, +0x03, 0xe4, 0x01, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x30, 0x02, 0x02, 0x00, 0x5d, 0x02, 0x05, +0x00, 0xe4, 0x01, 0x36, 0x02, 0x02, 0x00, 0x31, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x5e, 0x02, 0x02, 0x00, 0x39, 0x02, 0x5f, +0x02, 0x31, 0x03, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0x42, 0x02, 0x64, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0x65, +0x02, 0x46, 0x02, 0x66, 0x02, 0x67, 0x02, 0x42, 0x02, 0x68, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0x69, 0x02, 0x46, +0x02, 0x6a, 0x02, 0x6b, 0x02, 0x42, 0x02, 0x6c, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0x6d, 0x02, 0x46, 0x02, 0x6e, +0x02, 0x6f, 0x02, 0x42, 0x02, 0x70, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0x71, 0x02, 0x46, 0x02, 0x32, 0x03, 0x73, +0x02, 0x42, 0x02, 0x33, 0x03, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x38, +0x03, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x39, 0x03, 0x3a, 0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x46, +0x02, 0x3f, 0x03, 0x54, 0x02, 0x5d, 0x00, 0xe4, 0x01, 0x5e, 0x1c, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xe2, 0x01, 0xe3, +0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe4, 0x01, 0xe6, 0x01, 0x02, 0x00, 0xe7, 0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, +0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, +0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, +0x01, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, +0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, +0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, +0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, +0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x05, 0x00, 0xe4, +0x01, 0x55, 0x02, 0x02, 0x00, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x40, 0x03, 0xe4, 0x01, 0x86, +0x02, 0x87, 0x02, 0x88, 0x02, 0x89, 0x02, 0x8a, 0x02, 0x8b, 0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, +0x02, 0x91, 0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x05, +0x00, 0xe4, 0x01, 0x30, 0x02, 0x02, 0x00, 0x5d, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x36, 0x02, 0x02, 0x00, 0x31, 0x02, 0x32, +0x02, 0x05, 0x00, 0xe4, 0x01, 0x95, 0x02, 0x02, 0x00, 0x39, 0x02, 0x96, 0x02, 0x41, 0x03, 0x98, 0x02, 0x99, 0x02, 0x9a, +0x02, 0x42, 0x02, 0x9b, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0x9c, 0x02, 0x46, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x42, +0x02, 0x9f, 0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0xa0, 0x02, 0x46, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0x42, 0x02, 0xa3, +0x02, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0xa4, 0x02, 0x46, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0x42, 0x02, 0xa7, 0x02, 0x46, +0x02, 0x47, 0x02, 0x42, 0x02, 0xa8, 0x02, 0x46, 0x02, 0x42, 0x03, 0xaa, 0x02, 0x42, 0x02, 0x43, 0x03, 0x46, 0x02, 0x47, +0x02, 0x42, 0x02, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0x49, +0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x46, 0x02, 0x4f, 0x03, 0xbb, 0x02, 0x50, 0x03, 0x51, +0x03, 0xbd, 0x02, 0x42, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0x52, 0x03, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, +0x02, 0xc6, 0x02, 0xc7, 0x02, 0xc0, 0x02, 0xc8, 0x02, 0xc3, 0x02, 0xc9, 0x02, 0xc0, 0x02, 0xca, 0x02, 0xc3, 0x02, 0x53, +0x03, 0x54, 0x03, 0xcf, 0x02, 0xc0, 0x02, 0x55, 0x03, 0x56, 0x03, 0xc3, 0x02, 0xc9, 0x02, 0xc0, 0x02, 0x57, 0x03, 0xc3, +0x02, 0x58, 0x03, 0x59, 0x03, 0xd5, 0x02, 0xc0, 0x02, 0x5a, 0x03, 0xc3, 0x02, 0xc9, 0x02, 0xc0, 0x02, 0xd7, 0x02, 0xc3, +0x02, 0x5b, 0x03, 0x5c, 0x03, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0x5d, 0x03, 0x54, +0x02, 0x5d, 0x00, 0xe4, 0x01, 0x1b, 0x11, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, +0x01, 0xe4, 0x01, 0xe6, 0x01, 0x02, 0x00, 0xe7, 0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, +0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, +0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x01, 0x00, 0x02, 0x01, +0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, +0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, +0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, +0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, +0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x05, 0x00, 0xe4, 0x01, 0xf3, 0x02, 0xf4, +0x02, 0xe4, 0x01, 0x30, 0x02, 0x02, 0x00, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0xf5, 0x02, 0xf6, +0x02, 0xf7, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x36, 0x02, 0x02, 0x00, 0x37, 0x02, 0x05, 0x00, 0xe4, 0x01, 0x38, 0x02, 0x02, +0x00, 0x39, 0x02, 0x3a, 0x02, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x42, +0x02, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x46, 0x02, 0x47, 0x02, 0x42, 0x02, 0x68, 0x03, 0x46, 0x02, 0x69, 0x03, 0x6a, +0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, +0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x17, 0x03, 0x18, +0x03, 0x19, 0x03, 0x54, 0x02, 0x5d, 0x00, 0xe4, 0x01, }; diff --git a/thermion_dart/native/include/material/image.h b/thermion_dart/native/include/material/image.h index 4761bfae..a3d5b42b 100644 --- a/thermion_dart/native/include/material/image.h +++ b/thermion_dart/native/include/material/image.h @@ -3,16 +3,11 @@ #include -#if defined(__cplusplus) -extern "C" -{ -#endif +extern "C" { extern const uint8_t IMAGE_PACKAGE[]; extern int IMAGE_IMAGE_OFFSET; extern int IMAGE_IMAGE_SIZE; -#if defined(__cplusplus) } -#endif #define IMAGE_IMAGE_DATA (IMAGE_PACKAGE + IMAGE_IMAGE_OFFSET) #endif From c3319ebbf321b139d8934cb468e6258268e24d0d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:00:15 +0800 Subject: [PATCH 009/232] feat: add new grid overlay files to web CmakeLists --- thermion_dart/native/web/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/thermion_dart/native/web/CMakeLists.txt b/thermion_dart/native/web/CMakeLists.txt index 1fe65068..8ff7af04 100644 --- a/thermion_dart/native/web/CMakeLists.txt +++ b/thermion_dart/native/web/CMakeLists.txt @@ -56,6 +56,7 @@ add_executable(${MODULE_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/../src/ThermionDartApi.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/ThermionDartFFIApi.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/Gizmo.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../src/GridOverlay.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/StreamBufferAdapter.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/TimeIt.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/camutils/Manipulator.cpp" From f87f89427de54ced54b099572f95f2cf9d7ea7d5 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:01:03 +0800 Subject: [PATCH 010/232] feat: add getCameraFov to FilamentViewer --- thermion_dart/native/include/FilamentViewer.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index 11e7a140..3d932483 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -86,7 +86,9 @@ namespace thermion_filament bool setCamera(EntityId asset, const char *nodeName); void setMainCamera(); EntityId getMainCamera(); - void setCameraFov(double fovDegrees, double aspect); + + float getCameraFov(bool horizontal); + void setCameraFov(double fovDegrees, bool horizontal); void createSwapChain(const void *surface, uint32_t width, uint32_t height); void destroySwapChain(); @@ -188,8 +190,6 @@ namespace thermion_filament Skybox *_skybox = nullptr; Texture *_iblTexture = nullptr; IndirectLight *_indirectLight = nullptr; - bool _recomputeAabb = false; - bool _actualSize = false; float _frameInterval = 1000.0 / 60.0; From c08611b2c3c75d6ab6adfcee13d74c4c1827e997 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:02:06 +0800 Subject: [PATCH 011/232] feat: expose set_layer_enabled, get_camera_fov and queue_relative_position_updateg_world_axis to ThermionDartApi.h --- thermion_dart/native/include/ThermionDartApi.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index c6c1226a..6eee3eb3 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -194,6 +194,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE bool set_material_color(void *sceneManager, EntityId entity, const char *meshName, int materialIndex, const float r, const float g, const float b, const float a); EMSCRIPTEN_KEEPALIVE void transform_to_unit_cube(void *sceneManager, EntityId asset); EMSCRIPTEN_KEEPALIVE void queue_position_update(void *sceneManager, EntityId entity, float x, float y, float z, bool relative); + EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(void *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z); EMSCRIPTEN_KEEPALIVE void queue_rotation_update(void *sceneManager, EntityId entity, float rads, float x, float y, float z, float w, bool relative); EMSCRIPTEN_KEEPALIVE void set_position(void *sceneManager, EntityId entity, float x, float y, float z); EMSCRIPTEN_KEEPALIVE void set_rotation(void *sceneManager, EntityId entity, float rads, float x, float y, float z, float w); @@ -216,7 +217,8 @@ extern "C" EMSCRIPTEN_KEEPALIVE double get_camera_culling_far(const void *const viewer); EMSCRIPTEN_KEEPALIVE const double *const get_camera_culling_projection_matrix(const void *const viewer); EMSCRIPTEN_KEEPALIVE const double *const get_camera_frustum(const void *const viewer); - EMSCRIPTEN_KEEPALIVE void set_camera_fov(const void *const viewer, float fovInDegrees, float aspect); + EMSCRIPTEN_KEEPALIVE float get_camera_fov(const void *const viewer, bool horizontal); + EMSCRIPTEN_KEEPALIVE void set_camera_fov(const void *const viewer, float fovInDegrees, bool horizontal); EMSCRIPTEN_KEEPALIVE void set_camera_focal_length(const void *const viewer, float focalLength); EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(const void *const viewer, float focusDistance); EMSCRIPTEN_KEEPALIVE void set_camera_manipulator_options(const void *const viewer, _ManipulatorMode mode, double orbitSpeedX, double orbitSpeedY, double zoomSpeed); @@ -250,6 +252,8 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_priority(void *const sceneManager, EntityId entityId, int priority); EMSCRIPTEN_KEEPALIVE void get_gizmo(void *const sceneManager, EntityId *out); EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity); + EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float* minX, float* minY, float* maxX, float* maxY); + EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled); #ifdef __cplusplus } From 2e1f2cd56dd1026d80ae8821c74981016d52b9d4 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:02:54 +0800 Subject: [PATCH 012/232] feat: SceneManager updates (setLayer, add grid, queueRelativePositionUpdateWorld --- thermion_dart/native/src/SceneManager.cpp | 282 +++++++++++++++++----- 1 file changed, 215 insertions(+), 67 deletions(-) diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 1f4da40a..73924817 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -91,7 +92,15 @@ namespace thermion_filament _collisionComponentManager = new CollisionComponentManager(tm); _animationComponentManager = new AnimationComponentManager(tm, _engine->getRenderableManager()); - _gizmo = new Gizmo(_engine); + gizmo = new Gizmo(*_engine); + _gridOverlay = new GridOverlay(*_engine); + + _scene->addEntity(_gridOverlay->sphere()); + _scene->addEntity(_gridOverlay->grid()); + + _view->setLayerEnabled(0, true); // scene assets + _view->setLayerEnabled(1, true); // gizmo + _view->setLayerEnabled(2, false); // world grid } SceneManager::~SceneManager() @@ -99,7 +108,8 @@ namespace thermion_filament destroyAll(); - _gizmo->destroy(_engine); + gizmo->destroy(); + _gridOverlay->destroy(); _gltfResourceLoader->asyncCancelLoad(); _ubershaderProvider->destroyMaterials(); @@ -1628,16 +1638,12 @@ namespace thermion_filament _animationComponentManager->update(); } - - void SceneManager::updateTransforms() { std::lock_guard lock(_mutex); auto &tm = _engine->getTransformManager(); - _gizmo->updateTransform(); - for (const auto &[entityId, transformUpdate] : _transformUpdates) { const auto &pos = _instances.find(entityId); @@ -1723,6 +1729,7 @@ namespace thermion_filament tm.setTransform(transformInstance, transform); } _transformUpdates.clear(); + gizmo->updateTransform(_view->getCamera(), _view->getViewport()); } void SceneManager::setScale(EntityId entityId, float newScale) @@ -1796,77 +1803,222 @@ namespace thermion_filament tm.setTransform(transformInstance, newTransform); } - void SceneManager::queuePositionUpdate(EntityId entity, float x, float y, float z, bool relative) -{ - std::lock_guard lock(_mutex); - const auto &pos = _transformUpdates.find(entity); - if (pos == _transformUpdates.end()) + // Log("view matrix %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", + // viewMatrix[0][0], viewMatrix[0][1], viewMatrix[0][2], viewMatrix[0][3], + // viewMatrix[1][0], viewMatrix[1][1], viewMatrix[1][2], viewMatrix[1][3], + // viewMatrix[2][0], viewMatrix[2][1], viewMatrix[2][2], viewMatrix[2][3], + // viewMatrix[3][0], viewMatrix[3][1], viewMatrix[3][2], viewMatrix[3][3]); + + + + // math::float4 worldspace = { 250.0f, 0.0f, 0.0f, 1.0f }; + // math::float4 viewSpace = viewMatrix * worldspace; + // Log("viewspace %f %f %f %f", viewSpace.x, viewSpace.y, viewSpace.z, viewSpace.w); + + // math::float4 clipSpace = camera.getProjectionMatrix() * viewSpace; + // Log("clip space %f %f %f %f", clipSpace.x, clipSpace.y, clipSpace.z, clipSpace.w); + + // math::float4 ndc = clipSpace / clipSpace.w; + // Log("ndc %f %f %f %f", ndc.x, ndc.y, ndc.z, ndc.w); + + // ndc.x = -1.0; + + // // Multiply by inverse view-projection matrix + // auto inverseProj = inverse(camera.getProjectionMatrix()); + // clipSpace = inverseProj * math::float4 { ndc.x, ndc.y, ndc.z, 1.0f }; + // viewSpace = clipSpace / clipSpace.w; + // Log("clip space %f %f %f %f", viewSpace.x, viewSpace.y, viewSpace.z, viewSpace.w); + + // auto inverseView = inverse(viewMatrix); + // worldspace = inverseView * viewSpace; + // Log("worldspace space %f %f %f %f", worldspace.x, worldspace.y, worldspace.z, worldspace.w); + + // return; + + void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z) { - _transformUpdates.emplace(entity, std::make_tuple(math::float3(), true, math::quatf(1.0f), true, 1.0f)); - } - auto curr = _transformUpdates[entity]; - auto &trans = std::get<0>(curr); - const auto &tm = _engine->getTransformManager(); - auto transformInstance = tm.getInstance(Entity::import(entity)); - auto transform = tm.getTransform(transformInstance); - math::double4 position { 0.0f, 0.0f, 0.0f, 1.0f}; - math::mat4 worldTransform = tm.getWorldTransformAccurate(transformInstance); - position = worldTransform * position; + auto worldAxis = math::float3 { x, y, z}; - // Get camera's view matrix and its inverse - const Camera &camera = _view->getCamera(); + // Get the camera + const auto &camera = _view->getCamera(); + const auto &vp = _view->getViewport(); + auto viewMatrix = camera.getViewMatrix(); + + // Scale the viewport movement to NDC coordinates view axis + math::float2 viewportMovementNDC(viewportCoordX / (vp.width / 2), viewportCoordY / (vp.height / 2)); - math::mat4 viewMatrix = camera.getViewMatrix(); - math::mat4 invViewMatrix = inverse(viewMatrix); + // First we need to get the orientation of the specified world axis in screen space + math::float4 viewAxis = viewMatrix * math::float4 { x, y, z, 1.0f }; + // Apply projection matrix to get clip space axis + math::float4 clipAxis = camera.getProjectionMatrix() * viewAxis; + // Perform perspective division to get normalized device coordinates (NDC) + math::float2 ndcAxis = (clipAxis.xyz / clipAxis.w).xy; - // Transform object position to view space - math::double4 viewSpacePos = viewMatrix * position; + // project viewportMovementNDC onto axis + float projectedMovement = dot(viewportMovementNDC, normalize(ndcAxis)); + auto translationNDC = projectedMovement * normalize(ndcAxis); - Log("viewSpacePos %f %f %f %f", viewSpacePos.x, viewSpacePos.y, viewSpacePos.z, viewSpacePos.w); + // Log("projectedMovement %f translationNDC %f %f", projectedMovement, translationNDC.x, translationNDC.y); - // Calculate plane distance from camera - float planeDistance = -viewSpacePos.z; + // Get the camera's field of view and aspect ratio + float fovY = camera.getFieldOfViewInDegrees(filament::Camera::Fov::VERTICAL); + float fovX = camera.getFieldOfViewInDegrees(filament::Camera::Fov::HORIZONTAL); - const auto &vp = _view->getViewport(); + // Convert to radians + fovY = (fovY / 180) * M_PI; + fovX = (fovX / 180) * M_PI; - // Calculate viewport to world scale at the object's distance - float viewportToWorldScale = planeDistance * std::tan(camera.getFieldOfViewInDegrees(Camera::Fov::VERTICAL) * 0.5f * M_PI / 180.0f) * 2.0f / vp.height; + // Log("Fov vertical %f horizontal %f", fovY, fovX); + float aspectRatio = static_cast(vp.width) / vp.height; - Log("viewportToWorldScale %f", viewportToWorldScale); + auto &transformManager = _engine->getTransformManager(); + auto transformInstance = transformManager.getInstance(Entity::import(entity)); + const auto &transform = transformManager.getWorldTransform(transformInstance); - // Calculate view space delta - math::float4 viewSpaceDelta( - x * viewportToWorldScale, - -y * viewportToWorldScale, // Invert y-axis - z * viewportToWorldScale, - 0.0f); // Use 0 for the w component as it's a direction, not a position + math::float3 translation; + math::quatf rotation; + math::float3 scale; - Log("viewSpaceDelta %f %f %f", viewSpaceDelta.x, viewSpaceDelta.y, viewSpaceDelta.z); + decomposeMatrix(transform, &translation, &rotation, &scale); - // Transform delta to world space - math::float4 worldDelta = invViewMatrix * viewSpaceDelta; + const auto entityWorldPosition = transform * math::float4{0.0f, 0.0f, 0.0f, 1.0f}; - Log("worldDelta %f %f %f", worldDelta.x, worldDelta.y, worldDelta.z); + // Log("entityWorldPosition %f %f %f", entityWorldPosition.x, entityWorldPosition.y, entityWorldPosition.z); - if (relative) - { - trans.x += worldDelta.x; - trans.y += worldDelta.y; - trans.z += worldDelta.z; - } - else - { - trans.x = worldDelta.x; - trans.y = worldDelta.y; - trans.z = worldDelta.z; + float distanceToCamera = length(entityWorldPosition.xyz - camera.getPosition()); + + // Calculate the height of the view frustum at the given distance + float frustumHeight = 2.0f * distanceToCamera * tan(fovY * 0.5f); + + // Calculate the width of the view frustum at the given distance + float frustumWidth = frustumHeight * aspectRatio; + + // Log("frustum %fx%f", frustumWidth, frustumHeight); + + // Convert projected viewport movement to world space distance + float worldDistance = length(math::float2 { (translationNDC /2) * math::float2 { frustumWidth, frustumHeight } }); + + if(projectedMovement < 0) { + worldDistance *= -1; + } + + // Log("%f units in world ", worldDistance); + + auto newWorldTranslation = worldAxis * worldDistance; + + queuePositionUpdate(entity, newWorldTranslation.x, newWorldTranslation.y, newWorldTranslation.z, true); + + // // Convert to local space + // math::mat4f newWorldTransform = transformManager.getWorldTransform(transformInstance) * math::mat4f::translation(worldAxis * worldDistance); + // const auto parent = transformManager.getParent(transformInstance); + // const auto parentTransformInstance = transformManager.getInstance(parent); + // const auto inverseParentWorldTransformInverse = inverse(transformManager.getWorldTransform(parentTransformInstance)); + // math::mat4f newLocalTransform = inverseParentWorldTransformInverse * newWorldTransform; + + // Log("newLocalTransform %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", + // newLocalTransform[0][0], newLocalTransform[0][1], newLocalTransform[0][2], newLocalTransform[0][3], + // newLocalTransform[1][0], newLocalTransform[1][1], newLocalTransform[1][2], newLocalTransform[1][3], + // newLocalTransform[2][0], newLocalTransform[2][1], newLocalTransform[2][2], newLocalTransform[2][3], + // newLocalTransform[3][0], newLocalTransform[3][1], newLocalTransform[3][2], newLocalTransform[3][3]); + + + + // transformManager.setTransform(transformInstance, newLocalTransform); } - auto &isRelative = std::get<1>(curr); - isRelative = relative; - _transformUpdates[entity] = curr; -} + void SceneManager::queuePositionUpdate(EntityId entity, float x, float y, float z, bool relative) + { + std::lock_guard lock(_mutex); + + const auto &pos = _transformUpdates.find(entity); + if (pos == _transformUpdates.end()) + { + _transformUpdates.emplace(entity, std::make_tuple(math::float3(), true, math::quatf(1.0f), true, 1.0f)); + } + auto curr = _transformUpdates[entity]; + auto &trans = std::get<0>(curr); + trans.x = x; + trans.y = y; + trans.z = z; + + auto &isRelative = std::get<1>(curr); + isRelative = relative; + _transformUpdates[entity] = curr; + } + + // void SceneManager::queuePositionUpdate(EntityId entity, float x, float y, float z, bool relative) + // { + // std::lock_guard lock(_mutex); + + // const auto &pos = _transformUpdates.find(entity); + // if (pos == _transformUpdates.end()) + // { + // _transformUpdates.emplace(entity, std::make_tuple(math::float3(), true, math::quatf(1.0f), true, 1.0f)); + // } + // auto curr = _transformUpdates[entity]; + // auto &trans = std::get<0>(curr); + + // const auto &tm = _engine->getTransformManager(); + // auto transformInstance = tm.getInstance(Entity::import(entity)); + // auto transform = tm.getTransform(transformInstance); + // math::double4 position { 0.0f, 0.0f, 0.0f, 1.0f}; + // math::mat4 worldTransform = tm.getWorldTransformAccurate(transformInstance); + // position = worldTransform * position; + + // // Get camera's view matrix and its inverse + // const Camera &camera = _view->getCamera(); + + // math::mat4 viewMatrix = camera.getViewMatrix(); + // math::mat4 invViewMatrix = inverse(viewMatrix); + + // // Transform object position to view space + // math::double4 viewSpacePos = viewMatrix * position; + + // Log("viewSpacePos %f %f %f %f", viewSpacePos.x, viewSpacePos.y, viewSpacePos.z, viewSpacePos.w); + + // // Calculate plane distance from camera + // float planeDistance = -viewSpacePos.z; + + // const auto &vp = _view->getViewport(); + + // // Calculate viewport to world scale at the object's distance + // float viewportToWorldScale = planeDistance * std::tan(camera.getFieldOfViewInDegrees(Camera::Fov::VERTICAL) * 0.5f * M_PI / 180.0f) * 2.0f / vp.height; + + // // Log("viewportToWorldScale %f", viewportToWorldScale); + + // // Calculate view space delta + // math::float4 viewSpaceDelta( + // x * viewportToWorldScale, + // -y * viewportToWorldScale, // Invert y-axis + // z * viewportToWorldScale, + // 0.0f); // Use 0 for the w component as it's a direction, not a position + + // // Log("viewSpaceDelta %f %f %f", viewSpaceDelta.x, viewSpaceDelta.y, viewSpaceDelta.z); + + // // Transform delta to world space + // math::float4 worldDelta = invViewMatrix * viewSpaceDelta; + + // // Log("worldDelta %f %f %f", worldDelta.x, worldDelta.y, worldDelta.z); + + // if (relative) + // { + // trans.x += worldDelta.x; + // trans.y += worldDelta.y; + // trans.z += worldDelta.z; + // } + // else + // { + // trans.x = worldDelta.x; + // trans.y = worldDelta.y; + // trans.z = worldDelta.z; + // } + + // auto &isRelative = std::get<1>(curr); + // isRelative = relative; + // _transformUpdates[entity] = curr; + // } void SceneManager::queueRotationUpdate(EntityId entity, float rads, float x, float y, float z, float w, bool relative) { @@ -2132,8 +2284,6 @@ namespace thermion_filament auto min = aabb.getMin(); auto max = aabb.getMax(); - Log("min %f %f %f max %f %f %f", min.x, min.y, min.z, max.x, max.y, max.z); - // Transform the 8 corners of the AABB to clip space std::array corners = { worldTransform * math::float4(min.x, min.y, min.z, 1.0f), @@ -2182,12 +2332,10 @@ namespace thermion_filament return Aabb2{minX, minY, maxX, maxY}; } - void SceneManager::getGizmo(EntityId *out) - { - out[0] = Entity::smuggle(_gizmo->x()); - out[1] = Entity::smuggle(_gizmo->y()); - out[2] = Entity::smuggle(_gizmo->z()); - out[3] = Entity::smuggle(_gizmo->center()); + void SceneManager::setLayerEnabled(int layer, bool enabled) { + Log("Setting layer %d to %d", layer, enabled); + _view->setLayerEnabled(layer, enabled); } + } // namespace thermion_filament From 11756fcedde3e072b17caf4f820491b34f63476c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:17:34 +0800 Subject: [PATCH 013/232] feat: ignore grid overlay and gizmo center when picking, implement highlighting --- thermion_dart/native/src/FilamentViewer.cpp | 300 +++++++++++--------- 1 file changed, 167 insertions(+), 133 deletions(-) diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 300551de..5ede24a9 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -88,6 +88,7 @@ #include #include #include +#include #include "Log.hpp" @@ -115,10 +116,6 @@ namespace thermion_filament using std::string; - // const float kAperture = 1.0f; - // const float kShutterSpeed = 1.0f; - // const float kSensitivity = 50.0f; - static constexpr float4 sFullScreenTriangleVertices[3] = { {-1.0f, -1.0f, 1.0f, 1.0f}, {3.0f, -1.0f, 1.0f, 1.0f}, @@ -129,7 +126,7 @@ namespace thermion_filament FilamentViewer::FilamentViewer(const void *sharedContext, const ResourceLoaderWrapperImpl *const resourceLoader, void *const platform, const char *uberArchivePath) : _resourceLoaderWrapper(resourceLoader) { - _context = (void*) sharedContext; + _context = (void *)sharedContext; ASSERT_POSTCONDITION(_resourceLoaderWrapper != nullptr, "Resource loader must be non-null"); #if TARGET_OS_IPHONE @@ -142,19 +139,16 @@ namespace thermion_filament _engine = Engine::create(Engine::Backend::OPENGL, (backend::Platform *)new filament::backend::PlatformWebGL(), (void *)sharedContext, nullptr); #elif defined(_WIN32) Engine::Config config; - config.stereoscopicEyeCount = 1; + config.stereoscopicEyeCount = 1; _engine = Engine::create(Engine::Backend::OPENGL, (backend::Platform *)platform, (void *)sharedContext, &config); #else _engine = Engine::create(Engine::Backend::OPENGL, (backend::Platform *)platform, (void *)sharedContext, nullptr); #endif - Log("Created engine"); _engine->setAutomaticInstancingEnabled(true); _renderer = _engine->createRenderer(); - Log("Created renderer"); - _frameInterval = 1000.0f / 60.0f; setFrameInterval(_frameInterval); @@ -179,10 +173,10 @@ namespace thermion_filament _view->setAmbientOcclusionOptions({.enabled = false}); _view->setDynamicResolutionOptions({.enabled = false}); - - #if defined(_WIN32) + +#if defined(_WIN32) _view->setStereoscopicOptions({.enabled = true}); - #endif +#endif _view->setDithering(filament::Dithering::NONE); setAntiAliasing(false, false, false); @@ -196,8 +190,7 @@ namespace thermion_filament _cameraFocalLength = 28.0f; _mainCamera->setLensProjection(_cameraFocalLength, 1.0f, _near, _far); - // _mainCamera->setExposure(kAperture, kShutterSpeed, kSensitivity); - Log("View created"); + const float aperture = _mainCamera->getAperture(); const float shutterSpeed = _mainCamera->getShutterSpeed(); const float sens = _mainCamera->getSensitivity(); @@ -207,13 +200,11 @@ namespace thermion_filament EntityManager &em = EntityManager::get(); _sceneManager = new SceneManager( + _view, _resourceLoaderWrapper, _engine, _scene, uberArchivePath); - - Log("Created scene maager"); - } void FilamentViewer::setAntiAliasing(bool msaa, bool fxaa, bool taa) @@ -243,22 +234,22 @@ namespace thermion_filament _view->setShadowType(shadowType); } - void FilamentViewer::setSoftShadowOptions(float penumbraScale, float penumbraRatioScale) { + void FilamentViewer::setSoftShadowOptions(float penumbraScale, float penumbraRatioScale) + { SoftShadowOptions opts; opts.penumbraRatioScale = penumbraRatioScale; opts.penumbraScale = penumbraScale; _view->setSoftShadowOptions(opts); } - void FilamentViewer::setBloom(float strength) { - #ifndef __EMSCRIPTEN__ +#ifndef __EMSCRIPTEN__ decltype(_view->getBloomOptions()) opts; opts.enabled = true; opts.strength = strength; _view->setBloomOptions(opts); - #endif +#endif } void FilamentViewer::setToneMapping(ToneMapping toneMapping) @@ -301,22 +292,22 @@ namespace thermion_filament } EntityId FilamentViewer::addLight( - LightManager::Type t, - float colour, - float intensity, - float posX, - float posY, - float posZ, - float dirX, - float dirY, - float dirZ, - float falloffRadius, - float spotLightConeInner, - float spotLightConeOuter, - float sunAngularRadius, - float sunHaloSize, - float sunHaloFallof, - bool shadows) + LightManager::Type t, + float colour, + float intensity, + float posX, + float posY, + float posZ, + float dirX, + float dirY, + float dirZ, + float falloffRadius, + float spotLightConeInner, + float spotLightConeOuter, + float sunAngularRadius, + float sunHaloSize, + float sunHaloFallof, + bool shadows) { auto light = EntityManager::get().create(); auto &transformManager = _engine->getTransformManager(); @@ -324,20 +315,23 @@ namespace thermion_filament auto parent = transformManager.getInstance(light); auto result = LightManager::Builder(t) - .color(Color::cct(colour)) - .intensity(intensity) - .falloff(falloffRadius) - .spotLightCone(spotLightConeInner, spotLightConeOuter) - .sunAngularRadius(sunAngularRadius) - .sunHaloSize(sunHaloSize) - .sunHaloFalloff(sunHaloFallof) - .position(math::float3(posX, posY, posZ)) - .direction(math::float3(dirX, dirY, dirZ)) - .castShadows(shadows) - .build(*_engine, light); - if(result != LightManager::Builder::Result::Success) { + .color(Color::cct(colour)) + .intensity(intensity) + .falloff(falloffRadius) + .spotLightCone(spotLightConeInner, spotLightConeOuter) + .sunAngularRadius(sunAngularRadius) + .sunHaloSize(sunHaloSize) + .sunHaloFalloff(sunHaloFallof) + .position(math::float3(posX, posY, posZ)) + .direction(math::float3(dirX, dirY, dirZ)) + .castShadows(shadows) + .build(*_engine, light); + if (result != LightManager::Builder::Result::Success) + { Log("ERROR : failed to create light"); - } else { + } + else + { _scene->addEntity(light); _lights.push_back(light); } @@ -507,7 +501,8 @@ namespace thermion_filament { std::lock_guard lock(_imageMutex); - if(_imageEntity.isNull()) { + if (_imageEntity.isNull()) + { createBackgroundImage(); } _imageMaterial->setDefaultParameter("showImage", 0); @@ -515,15 +510,16 @@ namespace thermion_filament _imageMaterial->setDefaultParameter("transform", _imageScale); } - void FilamentViewer::createBackgroundImage() { + void FilamentViewer::createBackgroundImage() + { _dummyImageTexture = Texture::Builder() - .width(1) - .height(1) - .levels(0x01) - .format(Texture::InternalFormat::RGB16F) - .sampler(Texture::Sampler::SAMPLER_2D) - .build(*_engine); + .width(1) + .height(1) + .levels(0x01) + .format(Texture::InternalFormat::RGB16F) + .sampler(Texture::Sampler::SAMPLER_2D) + .build(*_engine); try { _imageMaterial = @@ -561,7 +557,7 @@ namespace thermion_filament _imageIb->setBuffer(*_engine, {sFullScreenTriangleIndices, sizeof(sFullScreenTriangleIndices)}); - auto & em = EntityManager::get(); + auto &em = EntityManager::get(); _imageEntity = em.create(); RenderableManager::Builder(1) .boundingBox({{}, {1.0f, 1.0f, 1.0f}}) @@ -576,8 +572,9 @@ namespace thermion_filament void FilamentViewer::clearBackgroundImage() { std::lock_guard lock(_imageMutex); - - if(_imageEntity.isNull()) { + + if (_imageEntity.isNull()) + { createBackgroundImage(); } _imageMaterial->setDefaultParameter("image", _dummyImageTexture, _imageSampler); @@ -595,7 +592,8 @@ namespace thermion_filament std::lock_guard lock(_imageMutex); - if(_imageEntity.isNull()) { + if (_imageEntity.isNull()) + { createBackgroundImage(); } @@ -610,7 +608,7 @@ namespace thermion_filament // This currently just anchors the image at the bottom left of the viewport at its original size // TODO - implement stretch/etc const Viewport &vp = _view->getViewport(); - Log("Image width %d height %d vp width %d height %d", _imageWidth, _imageHeight, vp.width, vp.height); + // Log("Image width %d height %d vp width %d height %d", _imageWidth, _imageHeight, vp.width, vp.height); float xScale = float(vp.width) / float(_imageWidth); @@ -641,7 +639,8 @@ namespace thermion_filament { std::lock_guard lock(_imageMutex); - if(_imageEntity.isNull()) { + if (_imageEntity.isNull()) + { createBackgroundImage(); } @@ -724,7 +723,8 @@ namespace thermion_filament { clearLights(); destroySwapChain(); - if(!_imageEntity.isNull()) { + if (!_imageEntity.isNull()) + { _engine->destroy(_imageEntity); _engine->destroy(_imageTexture); _engine->destroy(_imageVb); @@ -735,9 +735,10 @@ namespace thermion_filament _engine->destroyCameraComponent(_mainCamera->getEntity()); _mainCamera = nullptr; _engine->destroy(_view); + _engine->destroy(_scene); _engine->destroy(_renderer); - Engine::destroy(&_engine); + Engine::destroy(&_engine); delete _resourceLoaderWrapper; } @@ -806,11 +807,11 @@ namespace thermion_filament _swapChain = nullptr; Log("Swapchain destroyed."); } - #ifdef __EMSCRIPTEN__ +#ifdef __EMSCRIPTEN__ _engine->execute(); - #else +#else _engine->flushAndWait(); - #endif +#endif } void FilamentViewer::clearEntities() @@ -821,8 +822,6 @@ namespace thermion_filament void FilamentViewer::removeEntity(EntityId asset) { - Log("Removing asset from scene"); - mtx.lock(); // todo - what if we are using a camera from this asset? _sceneManager->remove(asset); @@ -835,7 +834,6 @@ namespace thermion_filament void FilamentViewer::setCameraExposure(float aperture, float shutterSpeed, float sensitivity) { Camera &cam = _view->getCamera(); - Log("Setting aperture (%03f) shutterSpeed (%03f) and sensitivity (%03f)", aperture, shutterSpeed, sensitivity); cam.setExposure(aperture, shutterSpeed, sensitivity); } @@ -846,7 +844,15 @@ namespace thermion_filament { Camera &cam = _view->getCamera(); _cameraFocalLength = focalLength; - cam.setLensProjection(_cameraFocalLength, 1.0f, _near, + const auto &vp = _view->getViewport(); + if (vp.height == 0) + { + Log("Viewport height has not yet been set, returning"); + return; + } + auto aspect = vp.width / vp.height; + + cam.setLensProjection(_cameraFocalLength, aspect, _near, _far); } @@ -858,8 +864,9 @@ namespace thermion_filament Camera &cam = _view->getCamera(); _near = near; _far = far; - cam.setLensProjection(_cameraFocalLength, 1.0f, _near, _far); - Log("Set lens projection to focal length %f, near %f and far %f", _cameraFocalLength, _near, _far); + const auto &vp = _view->getViewport(); + auto aspect = vp.width / vp.height; + cam.setLensProjection(_cameraFocalLength, aspect, _near, _far); } double FilamentViewer::getCameraCullingNear() @@ -1005,8 +1012,7 @@ namespace thermion_filament ResourceBuffer* rb = (ResourceBuffer*) vec->at(1); loader->free(*rb); delete rb; - delete vec; - }, + delete vec; }, callbackData); _skybox = filament::Skybox::Builder().environment(_skyboxTexture).build(*_engine); @@ -1148,12 +1154,11 @@ namespace thermion_filament _skippedFrames++; } - // beginFrame = true; - if (beginFrame) { - + _renderer->render(_view); + _frameCount++; if (_recording) @@ -1185,53 +1190,54 @@ namespace thermion_filament } _renderer->endFrame(); } - #ifdef __EMSCRIPTEN__ - _engine->execute(); - #endif +#ifdef __EMSCRIPTEN__ + _engine->execute(); +#endif } - void FilamentViewer::capture(uint8_t *out, void (*onComplete)()) { - - Viewport const &vp = _view->getViewport(); - size_t pixelBufferSize = vp.width * vp.height * 4; - auto *pixelBuffer = new uint8_t[pixelBufferSize]; - auto callback = [](void *buf, size_t size, void *data) - { + void FilamentViewer::capture(uint8_t *out, void (*onComplete)()) + { - auto frameCallbackData = (std::vector*)data; - uint8_t *out = (uint8_t *)(frameCallbackData->at(0)); - void* callbackPtr = frameCallbackData->at(1); + Viewport const &vp = _view->getViewport(); + size_t pixelBufferSize = vp.width * vp.height * 4; + auto *pixelBuffer = new uint8_t[pixelBufferSize]; + auto callback = [](void *buf, size_t size, void *data) + { + auto frameCallbackData = (std::vector *)data; + uint8_t *out = (uint8_t *)(frameCallbackData->at(0)); + void *callbackPtr = frameCallbackData->at(1); - void (*callback)(void) = (void (*)(void))callbackPtr; - memcpy(out, buf, size); - delete frameCallbackData; - callback(); - }; + void (*callback)(void) = (void (*)(void))callbackPtr; + memcpy(out, buf, size); + delete frameCallbackData; + callback(); + }; - auto userData = new std::vector { out, (void*)onComplete } ; + auto userData = new std::vector{out, (void *)onComplete}; - auto pbd = Texture::PixelBufferDescriptor( - pixelBuffer, pixelBufferSize, - Texture::Format::RGBA, - Texture::Type::UBYTE, nullptr, callback, userData); - _renderer->beginFrame(_swapChain, 0); - - _renderer->render(_view); + auto pbd = Texture::PixelBufferDescriptor( + pixelBuffer, pixelBufferSize, + Texture::Format::RGBA, + Texture::Type::UBYTE, nullptr, callback, userData); + _renderer->beginFrame(_swapChain, 0); - if(_rt) { - _renderer->readPixels(_rt, 0, 0, vp.width, vp.height, std::move(pbd)); - } else { - _renderer->readPixels(0, 0, vp.width, vp.height, std::move(pbd)); - } - _renderer->endFrame(); + _renderer->render(_view); - #ifdef __EMSCRIPTEN__ - _engine->execute(); - emscripten_webgl_commit_frame(); - #endif + if (_rt) + { + _renderer->readPixels(_rt, 0, 0, vp.width, vp.height, std::move(pbd)); } + else + { + _renderer->readPixels(0, 0, vp.width, vp.height, std::move(pbd)); + } + _renderer->endFrame(); - +#ifdef __EMSCRIPTEN__ + _engine->execute(); + emscripten_webgl_commit_frame(); +#endif + } void FilamentViewer::savePng(void *buf, size_t size, int frameNumber) { @@ -1319,10 +1325,14 @@ namespace thermion_filament const double aspect = (double)width / height; Camera &cam = _view->getCamera(); - cam.setLensProjection(_cameraFocalLength, 1.0f, _near, + + cam.setLensProjection(_cameraFocalLength, aspect, _near, _far); - cam.setScaling({1.0 / aspect, 1.0}); + // cam.setScaling({1.0 / aspect, 1.0}); + + // Camera &gizmoCam = _gizmoView->getCamera(); + // gizmoCam.setScaling({1.0 / aspect, 1.0}); Log("Set viewport to width: %d height: %d aspect %f scaleFactor : %f", width, height, aspect, contentScaleFactor); @@ -1333,11 +1343,18 @@ namespace thermion_filament _view->setFrustumCullingEnabled(enabled); } - void FilamentViewer::setCameraFov(double fovInDegrees, double aspect) + float FilamentViewer::getCameraFov(bool horizontal) { Camera &cam = _view->getCamera(); - cam.setProjection(fovInDegrees, aspect, _near, _far, Camera::Fov::HORIZONTAL); - Log("Set camera projection fov to %f", fovInDegrees); + return cam.getFieldOfViewInDegrees(horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); + } + + void FilamentViewer::setCameraFov(double fovInDegrees, bool horizontal) + { + Camera &cam = _view->getCamera(); + const auto &vp = _view->getViewport(); + auto aspect = vp.width / vp.height; + cam.setProjection(fovInDegrees, aspect, _near, _far, horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); } void FilamentViewer::setCameraPosition(float x, float y, float z) @@ -1494,14 +1511,14 @@ namespace thermion_filament { _createManipulator(); } - if (pan) - { - Log("Beginning pan at %f %f", x, y); - } - else - { - Log("Beginning rotate at %f %f", x, y); - } + // if (pan) + // { + // Log("Beginning pan at %f %f", x, y); + // } + // else + // { + // Log("Beginning rotate at %f %f", x, y); + // } _manipulator->grabBegin(x, y, pan); } @@ -1574,9 +1591,26 @@ namespace thermion_filament _view->pick(x, y, [=](filament::View::PickingQueryResult const &result) { - if(result.renderable != _imageEntity) { - callback(Entity::smuggle(result.renderable), x, y); - } }); + + Log("Picked entity %d at screen space (%f,%f,(%f))", result.renderable, result.fragCoords.x, result.fragCoords.y, result.fragCoords.z); + auto* gizmo = _sceneManager->gizmo; + std::unordered_set nonPickableEntities = { + _imageEntity, + gizmo->center(), + _sceneManager->_gridOverlay->sphere(), + _sceneManager->_gridOverlay->grid(), + }; + + if(result.renderable == gizmo->x() || result.renderable == gizmo->y() || result.renderable == gizmo->z()) { + gizmo->highlight(result.renderable); + } else { + gizmo->unhighlight(); + } + if (nonPickableEntities.find(result.renderable) == nonPickableEntities.end()) { + callback(Entity::smuggle(result.renderable), x, y); + } else { + Log("Ignored"); + } }); } EntityId FilamentViewer::createGeometry(float *vertices, uint32_t numVertices, uint16_t *indices, uint32_t numIndices, RenderableManager::PrimitiveType primitiveType, const char *materialPath) From 7d1e706045953f2934b77ad17a471c650dd865e7 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:18:12 +0800 Subject: [PATCH 014/232] feat: layers, grid --- thermion_dart/native/include/SceneManager.hpp | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 70882f2c..c781994e 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -20,6 +20,7 @@ #include "material/gizmo.h" #include "utils/NameComponentManager.h" #include "Gizmo.hpp" +#include "GridOverlay.hpp" #include "ResourceBuffer.hpp" #include "components/CollisionComponentManager.hpp" #include "components/AnimationComponentManager.hpp" @@ -74,6 +75,7 @@ namespace thermion_filament void setRotation(EntityId e, float rads, float x, float y, float z, float w); void queuePositionUpdate(EntityId e, float x, float y, float z, bool relative); void queueRotationUpdate(EntityId e, float rads, float x, float y, float z, float w, bool relative); + void queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z); const utils::Entity *getCameraEntities(EntityId e); size_t getCameraEntityCount(EntityId e); const utils::Entity *getLightEntities(EntityId e) noexcept; @@ -169,27 +171,31 @@ namespace thermion_filament /// void setPriority(EntityId entity, int priority); - /// @brief returns the gizmo entity, used to manipulate the global transform for entities - /// @param out a pointer sized large enough to hold three EntityId values (representing the x, y, and z axis of the translation gizmo). - /// @return - /// - void getGizmo(EntityId *out); - - /// @brief returns the 2D min/max viewport coordinates of the bounding box for the specified enitty; /// @param out a pointer large enough to store four floats (the min/max coordinates of the bounding box) /// @return /// Aabb2 getBoundingBox(EntityId entity); + /// + /// Toggles the visibility of the given layer. + /// Layer 0 - regular scene assets + /// Layer 1 - gizmo + /// Layer 2 - grid + /// + void setLayerEnabled(int layer, bool enabled); + friend class FilamentViewer; + Gizmo* gizmo = nullptr; + private: gltfio::AssetLoader *_assetLoader = nullptr; const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; Engine *_engine; - Scene *_scene; + Scene *_scene; View* _view; + gltfio::MaterialProvider *_ubershaderProvider = nullptr; gltfio::ResourceLoader *_gltfResourceLoader = nullptr; gltfio::TextureProvider *_stbDecoder = nullptr; @@ -216,7 +222,8 @@ namespace thermion_filament const char *entityName); EntityId addGizmo(); - Gizmo* _gizmo = nullptr; + + GridOverlay* _gridOverlay = nullptr; }; From 3cc876f9727dc0ec8191c23a1025c4e3fbd94daa Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:18:23 +0800 Subject: [PATCH 015/232] feat: layers, grid --- thermion_dart/native/src/ThermionDartApi.cpp | 31 ++++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 4b6a4811..d65648d8 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -200,9 +200,13 @@ extern "C" return ((FilamentViewer *)viewer)->setCamera(asset, nodeName); } - EMSCRIPTEN_KEEPALIVE void set_camera_fov(const void *const viewer, float fovInDegrees, float aspect) + EMSCRIPTEN_KEEPALIVE float get_camera_fov(const void *const viewer, bool horizontal) { + return ((FilamentViewer*)viewer)->getCameraFov(horizontal); + } + + EMSCRIPTEN_KEEPALIVE void set_camera_fov(const void *const viewer, float fovInDegrees, bool horizontal) { - return ((FilamentViewer *)viewer)->setCameraFov(double(fovInDegrees), double(aspect)); + return ((FilamentViewer *)viewer)->setCameraFov(double(fovInDegrees), horizontal); } const double *const get_camera_model_matrix(const void *const viewer) @@ -721,6 +725,10 @@ extern "C" ((SceneManager *)sceneManager)->queuePositionUpdate(asset, x, y, z, relative); } + EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(void *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z) { + ((SceneManager *)sceneManager)->queueRelativePositionUpdateWorldAxis(entity, viewportX, viewportY, x, y, z); + } + EMSCRIPTEN_KEEPALIVE void queue_rotation_update(void *sceneManager, EntityId asset, float rads, float x, float y, float z, float w, bool relative) { ((SceneManager *)sceneManager)->queueRotationUpdate(asset, rads, x, y, z, w, relative); @@ -839,12 +847,29 @@ extern "C" EMSCRIPTEN_KEEPALIVE void get_gizmo(void *const sceneManager, EntityId *out) { - return ((SceneManager *)sceneManager)->getGizmo(out); + auto gizmo = ((SceneManager *)sceneManager)->gizmo; + out[0] = Entity::smuggle(gizmo->x()); + out[1] = Entity::smuggle(gizmo->y()); + out[2] = Entity::smuggle(gizmo->z()); + out[3] = Entity::smuggle(gizmo->center()); } EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity) { return ((SceneManager *)sceneManager)->getBoundingBox(entity); } + EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float* minX, float* minY, float* maxX, float* maxY) { + auto box =((SceneManager *)sceneManager)->getBoundingBox(entity); + *minX = box.minX; + *minY = box.minY; + *maxX = box.maxX; + *maxY = box.maxY; + } + + EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled) { + ((SceneManager*)sceneManager)->setLayerEnabled(layer, enabled); + } + + } From 92fdda722bd496a92f36c6520b2a8742ac43ca7f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:18:53 +0800 Subject: [PATCH 016/232] chore: add viewport test --- thermion_dart/test/viewport_gizmo.dart | 81 ++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 thermion_dart/test/viewport_gizmo.dart diff --git a/thermion_dart/test/viewport_gizmo.dart b/thermion_dart/test/viewport_gizmo.dart new file mode 100644 index 00000000..e0bb9740 --- /dev/null +++ b/thermion_dart/test/viewport_gizmo.dart @@ -0,0 +1,81 @@ +import 'dart:io'; +import 'package:thermion_dart/thermion_dart/swift/swift_bindings.g.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.dart'; +import 'package:thermion_dart/thermion_dart/utils/dart_resources.dart'; +import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; +import 'package:test/test.dart'; +import 'package:animation_tools_dart/animation_tools_dart.dart'; + +/// Test files are run in a variety of ways, find this package root in all. +/// +/// Test files can be run from source from any working directory. The Dart SDK +/// `tools/test.py` runs them from the root of the SDK for example. +/// +/// Test files can be run from dill from the root of package. `package:test` +/// does this. +Uri findPackageRoot(String packageName) { + final script = Platform.script; + final fileName = script.name; + + // We're likely running from source. + var directory = script.resolve('.'); + while (true) { + final dirName = directory.name; + if (dirName == packageName) { + return directory; + } + final parent = directory.resolve('..'); + if (parent == directory) break; + directory = parent; + } + + throw StateError("Could not find package root for package '$packageName'. " + 'Tried finding the package root via Platform.script ' + "'${Platform.script.toFilePath()}' and Directory.current " + "'${Directory.current.uri.toFilePath()}'."); +} + +extension on Uri { + String get name => pathSegments.where((e) => e != '').last; +} + +late String testDir; +void main() async { + final packageUri = findPackageRoot('thermion_dart'); + testDir = Directory("${packageUri.toFilePath()}/test").path; + final lib = ThermionDartTexture1(DynamicLibrary.open( + '${packageUri.toFilePath()}/native/lib/macos/swift/libthermion_swift.dylib')); + final object = ThermionDartTexture.new1(lib); + object.initWithWidth_height_(500, 500); + + final resourceLoader = calloc(1); + var loadToOut = NativeCallable< + Void Function(Pointer, + Pointer)>.listener(DartResourceLoader.loadResource); + + resourceLoader.ref.loadToOut = loadToOut.nativeFunction; + var freeResource = NativeCallable.listener( + DartResourceLoader.freeResource); + resourceLoader.ref.freeResource = freeResource.nativeFunction; + + var viewer = ThermionViewerFFI(resourceLoader: resourceLoader.cast()); + + await viewer.initialized; + await viewer.createSwapChain(500, 500); + await viewer.createRenderTarget(500, 500, object.metalTextureAddress); + await viewer.updateViewportAndCameraProjection(500, 500); + + print(await viewer.getCameraFov(true)); + print(await viewer.getCameraFov(false)); + + group('viewport', () { + test('viewport', () async { + var entity = await viewer + .createGeometry([0.0], [0], primitiveType: PrimitiveType.POINTS); + await viewer.setCameraPosition(0.0, 0.0, 4.0); + await viewer.queueRelativePositionUpdateWorldAxis( + entity, -250.0, 250.0, 1, 0, 0); + }); + }); +} From ad60c6bbe189204d186618fa83c93f640e38ced3 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:19:07 +0800 Subject: [PATCH 017/232] chore: update bindings --- .../compatibility/native/thermion_dart.g.dart | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart index b12b7d42..89a692a9 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart @@ -620,6 +620,19 @@ external void queue_position_update( bool relative, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Float, ffi.Float, ffi.Float)>() +external void queue_relative_position_update_world_axis( + ffi.Pointer sceneManager, + int entity, + double viewportX, + double viewportY, + double x, + double y, + double z, +); + @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float, ffi.Float, ffi.Float, ffi.Bool)>() @@ -763,11 +776,17 @@ external ffi.Pointer get_camera_frustum( ffi.Pointer viewer, ); -@ffi.Native, ffi.Float, ffi.Float)>() +@ffi.Native, ffi.Bool)>() +external double get_camera_fov( + ffi.Pointer viewer, + bool horizontal, +); + +@ffi.Native, ffi.Float, ffi.Bool)>() external void set_camera_fov( ffi.Pointer viewer, double fovInDegrees, - double aspect, + bool horizontal, ); @ffi.Native, ffi.Float)>() @@ -1011,6 +1030,30 @@ external Aabb2 get_bounding_box( int entity, ); +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>() +external void get_bounding_box_to_out( + ffi.Pointer sceneManager, + int entity, + ffi.Pointer minX, + ffi.Pointer minY, + ffi.Pointer maxX, + ffi.Pointer maxY, +); + +@ffi.Native, ffi.Int, ffi.Bool)>() +external void set_layer_enabled( + ffi.Pointer sceneManager, + int layer, + bool enabled, +); + @ffi.Native< ffi.Void Function( ffi.Pointer, @@ -1534,6 +1577,20 @@ final class Aabb2 extends ffi.Struct { external double maxY; } +final class int32_t_4 extends ffi.Struct { + @ffi.Int32() + external int i0; + + @ffi.Int32() + external int i1; + + @ffi.Int32() + external int i2; + + @ffi.Int32() + external int i3; +} + /// This header replicates most of the methods in ThermionDartApi.h. /// It represents the interface for: /// - invoking those methods that must be called on the main Filament engine thread From 6f7d03737eff381f8da240dfa80e35837d432429 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:19:50 +0800 Subject: [PATCH 018/232] fix!: (flutter) pass pixelRatio to createTexture --- .../lib/thermion_flutter_platform_interface.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart b/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart index 1ba13a90..7a3b45d9 100644 --- a/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart +++ b/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart @@ -20,7 +20,7 @@ abstract class ThermionFlutterPlatform extends PlatformInterface { Future createViewer({String? uberArchivePath}); Future createTexture( - int width, int height, int offsetLeft, int offsetRight); + double width, double height, double offsetLeft, double offsetRight, double pixelRatio); Future destroyTexture(ThermionFlutterTexture texture); From 497ecbf88143e11d4dd97c954984b6edb79845a8 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:20:06 +0800 Subject: [PATCH 019/232] fix!: (flutter) pass pixelRatio to createTexture --- .../lib/thermion/thermion_flutter_plugin.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart b/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart index da02e615..8892ebb3 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart @@ -80,9 +80,9 @@ class ThermionFlutterPlugin { } static Future createTexture( - int width, int height, int offsetLeft, int offsetRight) async { + double width, double height, double offsetLeft, double offsetRight, double pixelRatio) async { return ThermionFlutterPlatform.instance - .createTexture(width, height, offsetLeft, offsetRight); + .createTexture(width, height, offsetLeft, offsetRight, pixelRatio); } static Future destroyTexture(ThermionFlutterTexture texture) async { From d6713c090ce7f7c9737695af71480ae62609eb53 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:21:35 +0800 Subject: [PATCH 020/232] stub out new methods --- .../thermion_dart/thermion_viewer_stub.dart | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart index ad4dc644..a04127d1 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart @@ -764,4 +764,22 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement getBoundingBox throw UnimplementedError(); } + + @override + Future getCameraFov(bool horizontal) { + // TODO: implement getCameraFov + throw UnimplementedError(); + } + + @override + Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, double viewportX, double viewportY, double x, double y, double z) { + // TODO: implement queueRelativePositionUpdateWorldAxis + throw UnimplementedError(); + } + + @override + Future setLayerEnabled(int layer, bool enabled) { + // TODO: implement setLayerEnabled + throw UnimplementedError(); + } } From 08e1eb7778b9d99cb3fc7cb2a685a142f215ced7 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:22:12 +0800 Subject: [PATCH 021/232] feat: expose setLayerEnabled, viewportDimensions and getCameraFov on ThermionView --- .../lib/thermion_dart/thermion_viewer.dart | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index 14597a90..d268ba16 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -63,6 +63,8 @@ abstract class ThermionViewer { /// late (double, double) viewportDimensions; + late double pixelRatio; + /// /// The result(s) of calling [pick] (see below). /// This may be a broadcast stream, so you should ensure you have subscribed to this stream before calling [pick]. @@ -430,9 +432,15 @@ abstract class ThermionViewer { Future getMainCamera(); /// - /// Sets the current scene camera to the glTF camera under [name] in [entity]. + /// Sets the horizontal field of view (if [horizontal] is true) or vertical field of view for the currently active camera to [degrees]. + /// The aspect ratio of the current viewport is used. /// - Future setCameraFov(double degrees, double width, double height); + Future setCameraFov(double degrees, {bool horizontal = true}); + + /// + /// Gets the field of view (in degrees). + /// + Future getCameraFov(bool horizontal); /// /// Sets the tone mapping (requires postprocessing). @@ -571,6 +579,12 @@ abstract class ThermionViewer { ThermionEntity entity, double x, double y, double z, {bool relative = false}); + /// + /// TODO + /// + Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, + double viewportX, double viewportY, double x, double y, double z); + /// /// Queues an update to the worldspace rotation for [entity]. /// The actual update will occur on the next frame, and will be subject to collision detection. @@ -719,7 +733,8 @@ abstract class ThermionViewer { /// /// Sets the parent transform of [child] to [parent]. /// - Future setParent(ThermionEntity child, ThermionEntity parent, { bool preserveScaling }); + Future setParent(ThermionEntity child, ThermionEntity parent, + {bool preserveScaling}); /// /// Test all collidable entities against this entity to see if any have collided. @@ -751,5 +766,11 @@ abstract class ThermionViewer { /// Gets the 2D bounding box (in viewport coordinates) for the given entity. /// Future getBoundingBox(ThermionEntity entity); -} + /// + /// Filament assigns renderables to a numeric layer. + /// We place all scene assets in layer 0 (enabled by default), gizmos in layer 1 (enabled by default), world grid in layer 2 (disabled by default). + /// Use this method to toggle visibility of the respective layer. + /// + Future setLayerEnabled(int layer, bool enabled); +} From b10fec196376515979e56b25050ca34462d8d2dd Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:22:31 +0800 Subject: [PATCH 022/232] fix!: (flutter) pass pixelRatio to createTexture --- .../lib/thermion/widgets/thermion_widget.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart index 2f86d154..3f874b42 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart @@ -44,9 +44,7 @@ class _ThermionWidgetState extends State { }); var dpr = MediaQuery.of(context).devicePixelRatio; var size = ((context.findRenderObject()) as RenderBox).size; - var width = (dpr * size.width).ceil(); - var height = (dpr * size.height).ceil(); - _texture = await ThermionFlutterPlugin.createTexture(width, height, 0, 0); + _texture = await ThermionFlutterPlugin.createTexture(size.width, size.height, 0, 0, dpr); if (mounted) { setState(() {}); From 53d0301828872952ad3c7d69129112e3610dce89 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:23:00 +0800 Subject: [PATCH 023/232] feat!: (flutter) (web) upgrade package:web dep to 1.0.0 --- thermion_flutter/thermion_flutter_web/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_flutter/thermion_flutter_web/pubspec.yaml b/thermion_flutter/thermion_flutter_web/pubspec.yaml index 15dbc120..d6aa7ef3 100644 --- a/thermion_flutter/thermion_flutter_web/pubspec.yaml +++ b/thermion_flutter/thermion_flutter_web/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: flutter: sdk: flutter plugin_platform_interface: ^2.1.0 - web: ^0.5.1 + web: ^1.0.0 thermion_dart: ^0.1.3 thermion_flutter_platform_interface: ^0.1.0+11 flutter_web_plugins: From 88e8a138ac770778a4765ea29d7c56d6bf5c86f8 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:23:54 +0800 Subject: [PATCH 024/232] (flutter) (web) initialize viewer to 1x1 then resize on createTexture --- .../lib/thermion_flutter_web.dart | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart index 230a08b1..ad9eaee1 100644 --- a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart +++ b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart @@ -4,8 +4,6 @@ import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_in import 'package:thermion_flutter_platform_interface/thermion_flutter_texture.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; import 'package:web/web.dart'; -import 'dart:js_interop'; -import 'dart:js_interop_unsafe'; class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { ThermionViewerWasm? _viewer; @@ -15,15 +13,20 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { } @override - Future createTexture( - int width, int height, int offsetLeft, int offsetRight) async { + Future createTexture(double width, double height, + double offsetLeft, double offsetRight, double pixelRatio) async { await _viewer!.destroySwapChain(); - await _viewer!.createSwapChain(width, height); - _viewer!.updateViewportAndCameraProjection(width, height, 1.0); + var physicalWidth = (width * pixelRatio).ceil(); + var physicalHeight = (width * pixelRatio).ceil(); + await _viewer!.createSwapChain(physicalWidth, physicalHeight); final canvas = document.getElementById("canvas") as HTMLCanvasElement; - canvas.width = width; - canvas.height = height; + canvas.width = physicalWidth; + canvas.height = physicalHeight; + + print("canvas dimensions ${width}x${height}"); + + _viewer!.updateViewportAndCameraProjection(physicalWidth, physicalHeight, 1.0); return ThermionFlutterTexture(null, null, 0, 0, null); } @@ -39,10 +42,7 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { final canvas = document.getElementById("canvas") as HTMLCanvasElement; canvas.width = width; canvas.height = height; - _viewer!.updateViewportAndCameraProjection(width, height, 1.0); - - print("Resized canvas to ${canvas.width}x${canvas.height}"); return ThermionFlutterTexture(null, null, 0, 0, null); } @@ -52,7 +52,7 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { canvas.id = "canvas"; document.body!.appendChild(canvas); canvas.style.display = 'none'; - await _viewer!.initialize(0, 0, uberArchivePath:uberArchivePath); + await _viewer!.initialize(1, 1, uberArchivePath: uberArchivePath); return _viewer!; } } From f1a2926bdf692c64d758d1f49c23baa3ff21e9bc Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:24:06 +0800 Subject: [PATCH 025/232] fix!: (flutter) pass pixelRatio to createTexture --- .../lib/thermion_flutter_ffi.dart | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart b/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart index 805fe622..dce8d700 100644 --- a/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart +++ b/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart @@ -98,8 +98,10 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { /// The current design doesn't accommodate this (for example, it seems we can /// only create a single native window from a Surface at any one time). /// - Future createTexture( - int width, int height, int offsetLeft, int offsetRight) async { + Future createTexture(double width, double height, + double offsetLeft, double offsetRight, double pixelRatio) async { + final physicalWidth = (width * pixelRatio).ceil(); + final physicalHeight = (height * pixelRatio).ceil(); // when a ThermionWidget is inserted, disposed then immediately reinserted // into the widget hierarchy (e.g. rebuilding due to setState(() {}) being called in an ancestor widget) // the first call to createTexture may not have completed before the second. @@ -113,7 +115,7 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { if (_textures.length > 1) { throw Exception("Multiple textures not yet supported"); } else if (_textures.length == 1) { - if (_textures.first.height == height && _textures.first.width == width) { + if (_textures.first.height == physicalHeight && _textures.first.width == physicalWidth) { return _textures.first; } else { await _viewer!.setRendering(false); @@ -126,7 +128,7 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { _creatingTexture = true; var result = await _channel - .invokeMethod("createTexture", [width, height, offsetLeft, offsetLeft]); + .invokeMethod("createTexture", [physicalWidth, physicalHeight, offsetLeft, offsetLeft]); if (result == null || (result[0] == -1)) { throw Exception("Failed to create texture"); @@ -138,12 +140,12 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { _logger.info( "Created texture with flutter texture id ${flutterTextureId}, hardwareTextureId $hardwareTextureId and surfaceAddress $surfaceAddress"); - _viewer?.viewportDimensions = (width.toDouble(), height.toDouble()); + _viewer?.viewportDimensions = (physicalWidth.toDouble(), physicalHeight.toDouble()); final texture = ThermionFlutterTexture( - flutterTextureId, hardwareTextureId, width, height, surfaceAddress); + flutterTextureId, hardwareTextureId, physicalWidth, physicalHeight, surfaceAddress); - await _viewer?.createSwapChain(width.toDouble(), height.toDouble(), + await _viewer?.createSwapChain(physicalWidth.toDouble(), physicalHeight.toDouble(), surface: texture.surfaceAddress == null ? nullptr : Pointer.fromAddress(texture.surfaceAddress!)); @@ -151,11 +153,11 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { if (texture.hardwareTextureId != null) { // ignore: unused_local_variable var renderTarget = await _viewer?.createRenderTarget( - width.toDouble(), height.toDouble(), texture.hardwareTextureId!); + physicalWidth.toDouble(), physicalHeight.toDouble(), texture.hardwareTextureId!); } await _viewer?.updateViewportAndCameraProjection( - width.toDouble(), height.toDouble()); + physicalWidth.toDouble(), physicalHeight.toDouble()); _viewer?.render(); _creatingTexture = false; From 3c05cc6a437b3945528f61ad1b9c7d161857a398 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:24:59 +0800 Subject: [PATCH 026/232] add implementations to FFI viewer --- .../entities/abstract_gizmo.dart | 9 +-- .../lib/thermion_dart/entities/gizmo.dart | 62 ++++++++++-------- .../thermion_dart/thermion_viewer_ffi.dart | 64 +++++++++++++------ 3 files changed, 80 insertions(+), 55 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart b/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart index 30d5e5c1..790fcc57 100644 --- a/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart +++ b/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart @@ -1,6 +1,3 @@ - - - import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:vector_math/vector_math_64.dart'; @@ -15,9 +12,7 @@ abstract class AbstractGizmo { void detach(); - Aabb2 boundingBox = Aabb2(); + Stream get boundingBox; - void checkHover(double x, double y) { - if(boundingBox.containsVector2(Vector2(x, y))); - } + void checkHover(double x, double y); } diff --git a/thermion_dart/lib/thermion_dart/entities/gizmo.dart b/thermion_dart/lib/thermion_dart/entities/gizmo.dart index 0434fe84..fac67297 100644 --- a/thermion_dart/lib/thermion_dart/entities/gizmo.dart +++ b/thermion_dart/lib/thermion_dart/entities/gizmo.dart @@ -1,15 +1,13 @@ -import 'dart:ffi'; - -import 'package:ffi/ffi.dart'; +import 'dart:async'; import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; import 'package:vector_math/vector_math_64.dart'; import '../thermion_viewer.dart'; class Gizmo extends AbstractGizmo { + final ThermionEntity x; final ThermionEntity y; final ThermionEntity z; - final ThermionEntity center; final ThermionViewer _viewer; @@ -20,11 +18,14 @@ class Gizmo extends AbstractGizmo { final Set ignore; - Aabb2 boundingBox = Aabb2(); + Stream get boundingBox => _boundingBoxController.stream; + final _boundingBoxController = StreamController.broadcast(); + Gizmo(this.x, this.y, this.z, this.center, this._viewer, {this.ignore = const {}}) { _viewer.pickResult.listen(_onPickResult); + } Future _reveal() async { @@ -42,19 +43,19 @@ class Gizmo extends AbstractGizmo { if (!_stopwatch.isRunning) { _stopwatch.start(); } - if (_activeAxis == x) { - _translation += Vector3(transX, 0.0, 0.0); - } else { - _translation += Vector3(0.0, transY, 0.0); - } - if (_stopwatch.elapsedMilliseconds > 16) { - await _viewer.queuePositionUpdate( - _activeEntity!, _translation.x, _translation.y, _translation.z, - relative: true); - _stopwatch.reset(); - _translation = Vector3.zero(); - } + _translation = Vector3(_activeAxis == x ? 1.0 : 0.0, + _activeAxis == y ? 1.0 : 0.0, _activeAxis == z ? 1.0 : 0.0); + + await _viewer.queueRelativePositionUpdateWorldAxis( + _activeEntity!, + transX * _viewer.pixelRatio, + -transY * _viewer.pixelRatio, + _translation.x, + _translation.y, + _translation.z); + _stopwatch.reset(); + _translation = Vector3.zero(); } void reset() { @@ -62,14 +63,19 @@ class Gizmo extends AbstractGizmo { } void _onPickResult(FilamentPickResult result) async { - if (ignore.contains(result)) { - detach(); - return; - } + // print( + // "Pick result ${result}, x is ${x}, y is $y, z is $z, ignore is $ignore"); + // if (ignore.contains(result)) { + // print("Ignore/detach"); + // detach(); + // return; + // } if (result.entity == x || result.entity == y || result.entity == z) { _activeAxis = result.entity; + print("Set active axis to $_activeAxis"); } else { attach(result.entity); + print("Attaching to ${result.entity}"); } } @@ -78,21 +84,21 @@ class Gizmo extends AbstractGizmo { _activeEntity = entity; await _reveal(); - await _viewer.setParent(x, entity); - await _viewer.setParent(y, entity); - await _viewer.setParent(z, entity); await _viewer.setParent(center, entity); - boundingBox = await _viewer.getBoundingBox(x); + + _boundingBoxController.sink.add(await _viewer.getBoundingBox(x)); } void detach() async { - await _viewer.setParent(x, 0); - await _viewer.setParent(y, 0); - await _viewer.setParent(z, 0); await _viewer.setParent(center, 0); await _viewer.hide(x, null); await _viewer.hide(y, null); await _viewer.hide(z, null); await _viewer.hide(center, null); } + + @override + void checkHover(double x, double y) { + _viewer.pick(x.toInt(), y.toInt()); + } } diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index 77a8776d..12a0b9a3 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -24,7 +24,7 @@ class ThermionViewerFFI extends ThermionViewer { SceneImpl? _scene; Scene get scene => _scene!; - double _pixelRatio = 1.0; + double pixelRatio = 1.0; Pointer? _sceneManager; @@ -85,6 +85,7 @@ class ThermionViewerFFI extends ThermionViewer { } Future updateViewportAndCameraProjection(double width, double height) async { + viewportDimensions = (width * pixelRatio, height * pixelRatio); await withVoidCallback((callback) { update_viewport_and_camera_projection_ffi( _viewer!, width.toInt(), height.toInt(), 1.0, callback); @@ -128,11 +129,11 @@ class ThermionViewerFFI extends ThermionViewer { await setCameraManipulatorOptions(zoomSpeed: 1.0); - final out = allocator(4); - get_gizmo(_sceneManager!, out); - _gizmo = Gizmo(out[0], out[1], out[2], out[3], this); - allocator.free(out); - + final gizmoEntities = allocator(4); + get_gizmo(_sceneManager!, gizmoEntities); + _gizmo = Gizmo(gizmoEntities[0], gizmoEntities[1], gizmoEntities[2], + gizmoEntities[3], this); + allocator.free(gizmoEntities); this._initialized.complete(true); } @@ -466,7 +467,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future panStart(double x, double y) async { - grab_begin(_viewer!, x * _pixelRatio, y * _pixelRatio, true); + grab_begin(_viewer!, x * pixelRatio, y * pixelRatio, true); } /// @@ -474,7 +475,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future panUpdate(double x, double y) async { - grab_update(_viewer!, x * _pixelRatio, y * _pixelRatio); + grab_update(_viewer!, x * pixelRatio, y * pixelRatio); } /// @@ -490,7 +491,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future rotateStart(double x, double y) async { - grab_begin(_viewer!, x * _pixelRatio, y * _pixelRatio, false); + grab_begin(_viewer!, x * pixelRatio, y * pixelRatio, false); } /// @@ -498,7 +499,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future rotateUpdate(double x, double y) async { - grab_update(_viewer!, x * _pixelRatio, y * _pixelRatio); + grab_update(_viewer!, x * pixelRatio, y * pixelRatio); } /// @@ -1136,12 +1137,19 @@ class ThermionViewerFFI extends ThermionViewer { set_camera_focal_length(_viewer!, focalLength); } + /// + /// + /// + Future getCameraFov(bool horizontal) async { + return get_camera_fov(_viewer!, horizontal); + } + /// /// /// @override - Future setCameraFov(double degrees, double width, double height) async { - set_camera_fov(_viewer!, degrees, width / height); + Future setCameraFov(double degrees, {bool horizontal = true}) async { + set_camera_fov(_viewer!, degrees, horizontal); } /// @@ -1319,6 +1327,12 @@ class ThermionViewerFFI extends ThermionViewer { queue_position_update(_sceneManager!, entity, x, y, z, relative); } + Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, + double viewportX, double viewportY, double x, double y, double z) async { + queue_relative_position_update_world_axis( + _sceneManager!, entity, viewportX, viewportY, x, y, z); + } + /// /// /// @@ -1359,8 +1373,8 @@ class ThermionViewerFFI extends ThermionViewer { void _onPickResult(ThermionEntity entityId, int x, int y) { _pickResultController.add(( entity: entityId, - x: (x / _pixelRatio).toDouble(), - y: (viewportDimensions.$2 - y) / _pixelRatio + x: (x / pixelRatio).toDouble(), + y: (viewportDimensions.$2 - y) / pixelRatio )); _scene!.registerSelected(entityId); } @@ -1375,11 +1389,10 @@ class ThermionViewerFFI extends ThermionViewer { void pick(int x, int y) async { _scene!.unregisterSelected(); - filament_pick( - _viewer!, - (x * _pixelRatio).toInt(), - (viewportDimensions.$2 - (y * _pixelRatio)).toInt(), - _onPickResultCallable.nativeFunction); + x = (x * pixelRatio).ceil(); + y = (viewportDimensions.$2 - (y * pixelRatio)).ceil(); + + filament_pick(_viewer!, x, y, _onPickResultCallable.nativeFunction); } /// @@ -1700,7 +1713,8 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future setParent(ThermionEntity child, ThermionEntity parent, { bool preserveScaling = false}) async { + Future setParent(ThermionEntity child, ThermionEntity parent, + {bool preserveScaling = false}) async { if (_sceneManager == null) { throw Exception("Asset manager must be non-null"); } @@ -1738,10 +1752,20 @@ class ThermionViewerFFI extends ThermionViewer { set_priority(_sceneManager!, entityId, priority); } + /// + /// + /// @override Future getBoundingBox(ThermionEntity entityId) async { final result = get_bounding_box(_sceneManager!, entityId); return v64.Aabb2.minMax(v64.Vector2(result.minX, result.minY), v64.Vector2(result.maxX, result.maxY)); } + + /// + /// + /// + Future setLayerEnabled(int layer, bool enabled) async { + set_layer_enabled(_sceneManager!, layer, enabled); + } } From 026acb74676a152580c526126f5d175d3d6fb8dc Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:25:17 +0800 Subject: [PATCH 027/232] feat: highlight gizmo on hover --- .../thermion_gesture_detector_desktop.dart | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart index e01e96b3..45c7232a 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart @@ -1,8 +1,11 @@ import 'dart:async'; import 'package:logging/logging.dart'; +import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; + import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:vector_math/vector_math_64.dart' as v64; /// /// A widget that translates finger/mouse gestures to zoom/pan/rotate actions. @@ -110,16 +113,14 @@ class _ThermionGestureDetectorDesktopState @override Widget build(BuildContext context) { return Listener( - // onPointerHover: (event) async { - // if (_gizmo.isActive) { - // return; - // } - // _pickTimer?.cancel(); - // _pickTimer = Timer(const Duration(milliseconds: 100), () async { - // widget.controller - // .pick(event.position.dx.toInt(), event.position.dy.toInt()); - // }); - // }, + onPointerHover: (event) async { + // print( + // "local position ${event.localPosition} globalPosition ${event.position}");r + _gizmo?.checkHover(event.localPosition.dx, event.localPosition.dy); + if (_gizmo == null || _gizmo!.isActive == true) { + return; + } + }, onPointerSignal: (PointerSignalEvent pointerSignal) async { if (pointerSignal is PointerScrollEvent) { if (widget.enableCamera) { From c0941e3b7f9b5ebcc3dd0ea09c0d16096440704a Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:25:37 +0800 Subject: [PATCH 028/232] add missing methods to wasm viewer --- .../web/interop/thermion_viewer_wasm.dart | 232 ++++++++++++++---- 1 file changed, 184 insertions(+), 48 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart index 429536ff..de9cf77f 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart @@ -5,6 +5,8 @@ import 'dart:math'; import 'dart:typed_data' as td; import 'dart:typed_data'; import 'package:logging/logging.dart'; +import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; +import 'package:thermion_dart/thermion_dart/entities/gizmo.dart'; import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:web/web.dart'; import 'package:animation_tools_dart/animation_tools_dart.dart'; @@ -57,6 +59,8 @@ class ThermionViewerWasm implements ThermionViewer { late (double, double) viewportDimensions; + late double pixelRatio; + /// /// Construct an instance of this class by explicitly passing the /// module instance via the [module] property, or by specifying [moduleName], @@ -116,6 +120,23 @@ class ThermionViewerWasm implements ThermionViewer { updateViewportAndCameraProjection(width, height, 1.0); _sceneManager = _module!.ccall("get_scene_manager", "void*", ["void*".toJS].toJS, [_viewer!].toJS, null) as JSNumber; + + _pickCallbackPtr = _module!.addFunction(_onPickCallback.toJS, "viii"); + // _module!.removeFunction(_pickCallbackPtr); + + var gizmoOut = _module!._malloc(4 * 4) as JSNumber; + + _module!.ccall("get_gizmo", "void", ["void*".toJS, "void*".toJS].toJS, + [_sceneManager!, gizmoOut].toJS, null); + + var x = _module!.getValue(gizmoOut, "i32") as JSNumber; + var y = _module!.getValue((gizmoOut.toDartInt + 4).toJS, "i32") as JSNumber; + var z = _module!.getValue((gizmoOut.toDartInt + 8).toJS, "i32") as JSNumber; + var center = + _module!.getValue((gizmoOut.toDartInt + 12).toJS, "i32") as JSNumber; + _gizmo = + Gizmo(x.toDartInt, y.toDartInt, z.toDartInt, center.toDartInt, this); + _module!._free(gizmoOut); _initialized = true; } @@ -150,6 +171,9 @@ class ThermionViewerWasm implements ThermionViewer { void updateViewportAndCameraProjection( int width, int height, double scaleFactor) { + if (width == 0 || height == 0) { + throw Exception("Width/height must be greater than zero"); + } _width = width; _height = height; viewportDimensions = (width.toDouble(), height.toDouble()); @@ -166,9 +190,12 @@ class ThermionViewerWasm implements ThermionViewer { return _initialized; } + final _pickResultController = + StreamController.broadcast(); + @override Stream get pickResult { - throw UnimplementedError(); + return _pickResultController.stream; } @override @@ -628,8 +655,8 @@ class ThermionViewerWasm implements ThermionViewer { } @override - // TODO: implement gizmo - AbstractGizmo? get gizmo => throw UnimplementedError(); + AbstractGizmo? get gizmo => _gizmo; + Gizmo? _gizmo; @override Future hide(ThermionEntity entity, String? meshName) async { @@ -788,19 +815,17 @@ class ThermionViewerWasm implements ThermionViewer { final pixelBuffer = _module!._malloc(_width * _height * 4) as JSNumber; final completer = Completer(); final callback = () { - print("Callback invoked!"); completer.complete(); }; final callbackPtr = _module!.addFunction(callback.toJS, "v"); - print("Aded functrion ${callbackPtr}, calling capture..."); _module!.ccall( "capture", "void", ["void*".toJS, "uint8_t*".toJS, "void*".toJS].toJS, [_viewer!, pixelBuffer, callbackPtr].toJS, null); - print("Waiting for completer..."); + int iter = 0; while (true) { await Future.delayed(Duration(milliseconds: 5)); @@ -1389,32 +1414,47 @@ class ThermionViewerWasm implements ThermionViewer { @override Future panEnd() async { - _module!.ccall("grab_end", "void", - ["void*".toJS].toJS, [_viewer!].toJS, null); + _module! + .ccall("grab_end", "void", ["void*".toJS].toJS, [_viewer!].toJS, null); } @override Future panStart(double x, double y) async { - _module!.ccall("grab_begin", "void", - ["void*".toJS, "float".toJS, "float".toJS, "bool".toJS].toJS, [_viewer!, x.toJS, y.toJS, true.toJS].toJS, null); + _module!.ccall( + "grab_begin", + "void", + ["void*".toJS, "float".toJS, "float".toJS, "bool".toJS].toJS, + [_viewer!, x.toJS, y.toJS, true.toJS].toJS, + null); } @override Future panUpdate(double x, double y) async { - _module!.ccall("grab_update", "void", - ["void*".toJS, "float".toJS, "float".toJS].toJS, [_viewer!, x.toJS, y.toJS].toJS, null); + _module!.ccall( + "grab_update", + "void", + ["void*".toJS, "float".toJS, "float".toJS].toJS, + [_viewer!, x.toJS, y.toJS].toJS, + null); + } + + late JSNumber _pickCallbackPtr; + + void _onPickCallback(ThermionEntity entity, int x, int y) { + _pickResultController + .add((entity: entity, x: x.toDouble(), y: y.toDouble())); } @override - void pick(int x, int y) { - throw UnimplementedError(); - // _module!.ccall("filament_pick", "void", - // ["void*".toJS, "int".toJS, "int".toJS, "void*".toJS].toJS, [ - // _viewer!, - // x.toJS, - // y.toJS, - // (entityId, x, y) {}.toJS - // ]); + void pick(int x, int y) async { + x = (x * pixelRatio).ceil(); + y = (y * pixelRatio).ceil(); + _module!.ccall( + "filament_pick", + "void", + ["void*".toJS, "int".toJS, "int".toJS, "void*".toJS].toJS, + [_viewer!, x.toJS, y.toJS, _pickCallbackPtr].toJS, + null); } @override @@ -1566,20 +1606,15 @@ class ThermionViewerWasm implements ThermionViewer { @override Future reveal(ThermionEntity entity, String? meshName) async { - if (meshName != null) { - final result = _module!.ccall( - "reveal_mesh", - "int", - ["void*".toJS, "int".toJS, "string".toJS].toJS, - [_sceneManager!, entity.toJS, meshName.toJS].toJS, - null) as JSNumber; - if (result.toDartInt == -1) { - throw Exception( - "Failed to reveal mesh ${meshName} on entity ${entity.toJS}"); - } - } else { + final result = _module!.ccall( + "reveal_mesh", + "int", + ["void*".toJS, "int".toJS, "string".toJS].toJS, + [_sceneManager!, entity.toJS, meshName?.toJS].toJS, + null) as JSNumber; + if (result.toDartInt == -1) { throw Exception( - "Cannot reveal mesh, meshName must be specified when invoking this method"); + "Failed to reveal mesh ${meshName} on entity ${entity.toJS}"); } } @@ -1597,20 +1632,28 @@ class ThermionViewerWasm implements ThermionViewer { @override Future rotateStart(double x, double y) async { - _module!.ccall("grab_begin", "void", - ["void*".toJS, "float".toJS, "float".toJS, "bool".toJS].toJS, [_viewer!, x.toJS, y.toJS, false.toJS].toJS, null); + _module!.ccall( + "grab_begin", + "void", + ["void*".toJS, "float".toJS, "float".toJS, "bool".toJS].toJS, + [_viewer!, x.toJS, y.toJS, false.toJS].toJS, + null); } @override Future rotateUpdate(double x, double y) async { - _module!.ccall("grab_update", "void", - ["void*".toJS, "float".toJS, "float".toJS].toJS, [_viewer!, x.toJS, y.toJS].toJS, null); + _module!.ccall( + "grab_update", + "void", + ["void*".toJS, "float".toJS, "float".toJS].toJS, + [_viewer!, x.toJS, y.toJS].toJS, + null); } @override Future rotateEnd() async { - _module!.ccall("grab_end", "void", - ["void*".toJS].toJS, [_viewer!].toJS, null); + _module! + .ccall("grab_end", "void", ["void*".toJS].toJS, [_viewer!].toJS, null); } @override @@ -1737,12 +1780,12 @@ class ThermionViewerWasm implements ThermionViewer { } @override - Future setCameraFov(double degrees, double width, double height) async { + Future setCameraFov(double degrees, {bool horizontal = true}) async { _module!.ccall( "set_camera_fov", "void", - ["void*".toJS, "float".toJS, "float".toJS].toJS, - [_viewer!, degrees.toJS, (width / height).toJS].toJS, + ["void*".toJS, "float".toJS, "bool".toJS].toJS, + [_viewer!, degrees.toJS, horizontal.toJS].toJS, null); } @@ -1850,12 +1893,13 @@ class ThermionViewerWasm implements ThermionViewer { } @override - Future setParent(ThermionEntity child, ThermionEntity parent) async { + Future setParent(ThermionEntity child, ThermionEntity parent, + {bool preserveScaling = false}) async { _module!.ccall( "set_parent", "void", - ["void*".toJS, "int".toJS, "int".toJS].toJS, - [_sceneManager!, child.toJS, parent.toJS].toJS, + ["void*".toJS, "int".toJS, "int".toJS, "bool".toJS].toJS, + [_sceneManager!, child.toJS, parent.toJS, preserveScaling.toJS].toJS, null); } @@ -1999,8 +2043,8 @@ class ThermionViewerWasm implements ThermionViewer { @override Future zoomEnd() async { - _module! - .ccall("scroll_end", "void", ["void*".toJS].toJS, [_viewer!].toJS, null); + _module!.ccall( + "scroll_end", "void", ["void*".toJS].toJS, [_viewer!].toJS, null); } @override @@ -2047,4 +2091,96 @@ class ThermionViewerWasm implements ThermionViewer { [_viewer!, penumbraScale.toJS, penumbraRatioScale.toJS].toJS, null); } + + @override + Future getBoundingBox(ThermionEntity entity) { + var minX = _module!._malloc(4); + var minY = _module!._malloc(4); + var maxX = _module!._malloc(4); + var maxY = _module!._malloc(4); + _module!.ccall( + "get_bounding_box_to_out", + "void", + [ + "void*".toJS, + "int".toJS, + "float*".toJS, + "float*".toJS, + "float*".toJS, + "float*".toJS + ].toJS, + [_sceneManager!, entity.toJS, minX, minY, maxX, maxY].toJS, + null); + + final min = Vector2( + (_module!.getValue(minX, "float") as JSNumber).toDartDouble, + (_module!.getValue(minY, "float") as JSNumber).toDartDouble); + final max = Vector2( + (_module!.getValue(maxX, "float") as JSNumber).toDartDouble, + (_module!.getValue(maxY, "float") as JSNumber).toDartDouble); + + final box = Aabb2.minMax(min, max); + _module!._free(minX); + _module!._free(minY); + _module!._free(maxX); + _module!._free(maxY); + + return Future.value(box); + } + + @override + Future getCameraFov(bool horizontal) async { + var fov = _module!.ccall( + "get_camera_fov", + "float", + ["void*".toJS, "bool".toJS].toJS, + [_viewer!, horizontal.toJS].toJS, + null); + return (fov as JSNumber).toDartDouble; + } + + @override + Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, + double viewportX, double viewportY, double x, double y, double z) async { + _module!.ccall( + "queue_relative_position_update_world_axis", + "void", + [ + "void*".toJS, + "int".toJS, + "float".toJS, + "float".toJS, + "float".toJS, + "float".toJS, + "float".toJS + ].toJS, + [ + _sceneManager!, + entity.toJS, + viewportX.toJS, + viewportY.toJS, + x.toJS, + y.toJS, + z.toJS + ].toJS, + null); + } + + @override + Future setLayerEnabled(int layer, bool enabled) async { + _module!.ccall( + "set_layer_enabled", + "void", + [ + "void*".toJS, + "int".toJS, + "bool".toJS, + ].toJS, + [ + _sceneManager!, + layer.toJS, + enabled.toJS, + ].toJS, + null); + } } From 714c5754092e7ae60bd2787970a8581688c19b14 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:26:05 +0800 Subject: [PATCH 029/232] add implementations to JS bridge/shim classes --- .../interop/thermion_viewer_dart_bridge.dart | 14 ++++++-- .../web/interop/thermion_viewer_js.dart | 32 ++++++++++++++++--- .../web/interop/thermion_viewer_js_shim.dart | 4 +-- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart index 120cdade..86413551 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart @@ -404,8 +404,16 @@ class ThermionViewerJSDartBridge { } @JSExport() - JSPromise setCameraFov(double degrees, double width, double height) => - viewer.setCameraFov(degrees, width, height).toJS; + JSPromise setParent( + ThermionEntity child, ThermionEntity parent, bool preserveScaling) { + return viewer + .setParent(child, parent, preserveScaling: preserveScaling) + .toJS; + } + + @JSExport() + JSPromise setCameraFov(double degrees, bool horizontal) => + viewer.setCameraFov(degrees, horizontal: horizontal).toJS; @JSExport() JSPromise setToneMapping(int mapper) => @@ -527,9 +535,11 @@ class ThermionViewerJSDartBridge { // b, // a, // ).toJS; + @JSExport() JSPromise transformToUnitCube(ThermionEntity entity) => viewer.transformToUnitCube(entity).toJS; + @JSExport() JSPromise setPosition(ThermionEntity entity, double x, double y, double z) => viewer.setPosition(entity, x, y, z).toJS; diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart index 2872e312..02b454f7 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart @@ -5,6 +5,7 @@ import 'dart:typed_data'; import 'package:animation_tools_dart/animation_tools_dart.dart'; import 'package:logging/logging.dart'; +import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; @@ -423,8 +424,8 @@ class ThermionViewerJS implements ThermionViewer { } @override - Future setCameraFov(double degrees, double width, double height) async { - await _shim.setCameraFov(degrees, width, height).toDart; + Future setCameraFov(double degrees, {bool horizontal = true}) async { + await _shim.setCameraFov(degrees, horizontal).toDart; } @override @@ -737,8 +738,9 @@ class ThermionViewerJS implements ThermionViewer { } @override - Future setParent(ThermionEntity child, ThermionEntity parent) async { - await _shim.setParent(child, parent).toDart; + Future setParent(ThermionEntity child, ThermionEntity parent, + {bool preserveScaling = false}) async { + await _shim.setParent(child, parent, preserveScaling).toDart; } @override @@ -857,4 +859,26 @@ class ThermionViewerJS implements ThermionViewer { final captured = await _shim.capture().toDart; return captured.toDart; } + + @override + late (double, double) viewportDimensions; + + @override + Future getBoundingBox(ThermionEntity entity) { + // return _shim.getBoundingBox(entity); + throw UnimplementedError(); + } + + @override + Future getCameraFov(bool horizontal) { + // TODO: implement getCameraFov + throw UnimplementedError(); + } + + @override + Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, + double viewportX, double viewportY, double x, double y, double z) { + // TODO: implement queueRelativePositionUpdateWorldAxis + throw UnimplementedError(); + } } diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart index d4cf5dd2..5ade4d60 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart @@ -220,7 +220,7 @@ extension type ThermionViewerJSShim(JSObject _) implements JSObject { external JSPromise getMainCamera(); @JS('setCameraFov') - external JSPromise setCameraFov(double degrees, double width, double height); + external JSPromise setCameraFov(double degrees, bool horizontal); @JS('setToneMapping') external JSPromise setToneMapping(int mapper); @@ -378,7 +378,7 @@ extension type ThermionViewerJSShim(JSObject _) implements JSObject { JSArray indices, String? materialPath, int primitiveType); @JS('setParent') - external JSPromise setParent(ThermionEntity child, ThermionEntity parent); + external JSPromise setParent(ThermionEntity child, ThermionEntity parent, bool preserveScaling); @JS('getParent') external JSPromise getParent(ThermionEntity child); From 371bcb370615f19be8f50eeac66abab6b0b6c67c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 24 Aug 2024 16:28:12 +0800 Subject: [PATCH 030/232] fix stub methods --- thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart index a04127d1..fc6e0b02 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart @@ -537,7 +537,7 @@ class ThermionViewerStub extends ThermionViewer { } @override - Future setCameraFov(double degrees, double width, double height) { + Future setCameraFov(double degrees, {bool horizontal=true}) { // TODO: implement setCameraFov throw UnimplementedError(); } From 10db8c39f3b10982ed272881bc2a6bf778a49369 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sun, 25 Aug 2024 21:54:08 +0800 Subject: [PATCH 031/232] fix: add check for nan NDC coordinates for viewport translation --- thermion_dart/native/src/SceneManager.cpp | 83 ++++++++++++++--------- 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 73924817..e33096c6 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -1836,6 +1836,12 @@ namespace thermion_filament // return; + + // Log("viewMatrixRotation %f %f %f %f %f %f %f %f %f", + // viewMatrixRotation[0][0], viewMatrixRotation[0][1], viewMatrixRotation[0][2], + // viewMatrixRotation[1][0], viewMatrixRotation[1][1], viewMatrixRotation[1][2], + // viewMatrixRotation[2][0], viewMatrixRotation[2][1], viewMatrixRotation[2][2]); + void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z) { @@ -1848,19 +1854,47 @@ namespace thermion_filament // Scale the viewport movement to NDC coordinates view axis math::float2 viewportMovementNDC(viewportCoordX / (vp.width / 2), viewportCoordY / (vp.height / 2)); - - // First we need to get the orientation of the specified world axis in screen space - math::float4 viewAxis = viewMatrix * math::float4 { x, y, z, 1.0f }; + + // calculate the translation axis in view space + // ignore the translation component of the view matrix we only care about whether or not the camera has rotated + // (if the entity is in the viewport, we don't need to translate it first back to the "true" X, Y or Z axis - we're just moving parallel to those axes ) + math::float3 viewSpaceAxis = viewMatrix.upperLeft() * worldAxis; + // Apply projection matrix to get clip space axis - math::float4 clipAxis = camera.getProjectionMatrix() * viewAxis; - // Perform perspective division to get normalized device coordinates (NDC) + math::float4 clipAxis = camera.getProjectionMatrix() * math::float4(viewSpaceAxis, 0.0f); + + // Perform perspective division to get the translation axis in normalized device coordinates (NDC) math::float2 ndcAxis = (clipAxis.xyz / clipAxis.w).xy; - // project viewportMovementNDC onto axis + // Check if ndcAxis is too small (camera nearly orthogonal to the axis) + const float epsilon = 1e-6f; + if (std::isnan(ndcAxis.x) || std::isnan(ndcAxis.y) || length(ndcAxis) < epsilon) { + // Use an alternative method when the camera is nearly orthogonal to the axis + math::float3 cameraForward = -viewMatrix.upperLeft()[2]; + math::float3 perpendicularAxis = cross(cameraForward, worldAxis); + + if (length(perpendicularAxis) < epsilon) { + // If worldAxis is parallel to cameraForward, use a fixed perpendicular axis + perpendicularAxis = math::float3{0, 1, 0}; + if (std::abs(dot(perpendicularAxis, cameraForward)) > 0.9f) { + perpendicularAxis = math::float3{1, 0, 0}; + } + } + + ndcAxis = (camera.getProjectionMatrix() * math::float4(viewMatrix.upperLeft() * normalize(perpendicularAxis), 0.0f)).xy; + + Log("Corrected NDC axis %f %f", ndcAxis.x, ndcAxis.y); + + } + + // project the viewport movement (i.e pointer drag) vector onto the translation axis + // this gives the proportion of the pointer drag vector to translate along the translation axis float projectedMovement = dot(viewportMovementNDC, normalize(ndcAxis)); auto translationNDC = projectedMovement * normalize(ndcAxis); - // Log("projectedMovement %f translationNDC %f %f", projectedMovement, translationNDC.x, translationNDC.y); + math::float3 cameraPosition = camera.getPosition(); + math::float3 cameraForward = -viewMatrix.upperLeft()[2]; // Third row of the view matrix is the forward vector + float dotProduct = dot(normalize(worldAxis), cameraForward); // Get the camera's field of view and aspect ratio float fovY = camera.getFieldOfViewInDegrees(filament::Camera::Fov::VERTICAL); @@ -1870,7 +1904,6 @@ namespace thermion_filament fovY = (fovY / 180) * M_PI; fovX = (fovX / 180) * M_PI; - // Log("Fov vertical %f horizontal %f", fovY, fovX); float aspectRatio = static_cast(vp.width) / vp.height; auto &transformManager = _engine->getTransformManager(); @@ -1885,8 +1918,6 @@ namespace thermion_filament const auto entityWorldPosition = transform * math::float4{0.0f, 0.0f, 0.0f, 1.0f}; - // Log("entityWorldPosition %f %f %f", entityWorldPosition.x, entityWorldPosition.y, entityWorldPosition.z); - float distanceToCamera = length(entityWorldPosition.xyz - camera.getPosition()); // Calculate the height of the view frustum at the given distance @@ -1895,39 +1926,27 @@ namespace thermion_filament // Calculate the width of the view frustum at the given distance float frustumWidth = frustumHeight * aspectRatio; - // Log("frustum %fx%f", frustumWidth, frustumHeight); - // Convert projected viewport movement to world space distance float worldDistance = length(math::float2 { (translationNDC /2) * math::float2 { frustumWidth, frustumHeight } }); - if(projectedMovement < 0) { - worldDistance *= -1; + float sign = (dotProduct >= 0) ? -1.0f : 1.0f; + if (projectedMovement < 0) { + sign *= -1.0f; } - // Log("%f units in world ", worldDistance); + // Flip the sign for the Z-axis + if (std::abs(z) > 0.001) { + sign *= -1.0f; + } + + worldDistance *= sign; auto newWorldTranslation = worldAxis * worldDistance; queuePositionUpdate(entity, newWorldTranslation.x, newWorldTranslation.y, newWorldTranslation.z, true); - - // // Convert to local space - // math::mat4f newWorldTransform = transformManager.getWorldTransform(transformInstance) * math::mat4f::translation(worldAxis * worldDistance); - // const auto parent = transformManager.getParent(transformInstance); - // const auto parentTransformInstance = transformManager.getInstance(parent); - // const auto inverseParentWorldTransformInverse = inverse(transformManager.getWorldTransform(parentTransformInstance)); - // math::mat4f newLocalTransform = inverseParentWorldTransformInverse * newWorldTransform; - - // Log("newLocalTransform %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", - // newLocalTransform[0][0], newLocalTransform[0][1], newLocalTransform[0][2], newLocalTransform[0][3], - // newLocalTransform[1][0], newLocalTransform[1][1], newLocalTransform[1][2], newLocalTransform[1][3], - // newLocalTransform[2][0], newLocalTransform[2][1], newLocalTransform[2][2], newLocalTransform[2][3], - // newLocalTransform[3][0], newLocalTransform[3][1], newLocalTransform[3][2], newLocalTransform[3][3]); - - - - // transformManager.setTransform(transformInstance, newLocalTransform); } + void SceneManager::queuePositionUpdate(EntityId entity, float x, float y, float z, bool relative) { std::lock_guard lock(_mutex); From 0e3b014c2cb4fdd72132b043987534d7c923bc47 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 16:50:54 +0800 Subject: [PATCH 032/232] feat: rescale gizmo based on distance from camera --- materials/gizmo.mat | 4 +- thermion_dart/native/src/Gizmo.cpp | 159 ++++++++++++++++++----------- 2 files changed, 104 insertions(+), 59 deletions(-) diff --git a/materials/gizmo.mat b/materials/gizmo.mat index 5b7bc75b..447d4c3b 100644 --- a/materials/gizmo.mat +++ b/materials/gizmo.mat @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3158461d081f058dcb9582ce19cc2daedc73abbe758ba5094c94df89028d8c4d -size 981 +oid sha256:f467a6361958bd8a3381dcd5895665c09932daf37e606b06c7f584de484b0d5d +size 1572 diff --git a/thermion_dart/native/src/Gizmo.cpp b/thermion_dart/native/src/Gizmo.cpp index 39bd255e..75386f30 100644 --- a/thermion_dart/native/src/Gizmo.cpp +++ b/thermion_dart/native/src/Gizmo.cpp @@ -14,8 +14,25 @@ namespace thermion_filament { using namespace filament::gltfio; -Gizmo::Gizmo(Engine &engine) : _engine(engine) +Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) { + if(scene) { + _scene = scene; + _view = view; + _camera = &(_view->getCamera()); + } else { + _scene = _engine.createScene(); + _view = _engine.createView(); + _view->setBlendMode(BlendMode::TRANSLUCENT); + + utils::Entity camera = EntityManager::get().create(); + _camera = engine.createCamera(camera); + _camera->setProjection(Camera::Projection::ORTHO, -1.0, 1.0, -1.0, 1.0, 1.0, 5.0); + _view->setScene(_scene); + _view->setCamera(_camera); + + } + auto &entityManager = EntityManager::get(); auto &transformManager = engine.getTransformManager(); @@ -72,7 +89,7 @@ Gizmo::Gizmo(Engine &engine) : _engine(engine) {centerCubeSize, centerCubeSize, centerCubeSize}}) .material(0, _materialInstances[3]) .layerMask(0xFF, 2) - .priority(0) + .priority(7) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, centerCubeVb, centerCubeIb, 0, 36) .culling(false) .build(engine, _entities[3]); @@ -83,9 +100,9 @@ Gizmo::Gizmo(Engine &engine) : _engine(engine) // Line and arrow vertices float lineLength = 0.8f; - float lineWidth = 0.01f; - float arrowLength = 0.2f; - float arrowWidth = 0.06f; + float lineWidth = 0.005f; + float arrowLength = 0.1f; + float arrowWidth = 0.03f; float *vertices = new float[13 * 3]{ // Line vertices (8 vertices) -lineWidth, -lineWidth, 0.0f, @@ -146,12 +163,15 @@ Gizmo::Gizmo(Engine &engine) : _engine(engine) switch (i) { case Axis::X: + // _materialInstances[i]->setParameter("axisDirection", math::float3 { 1.0f, 0.0f, 0.0f}); transform = math::mat4f::rotation(math::F_PI_2, math::float3{0, 1, 0}); break; case 1: + // _materialInstances[i]->setParameter("axisDirection", math::float3 { 0.0f, 1.0f, 0.0f}); transform = math::mat4f::rotation(-math::F_PI_2, math::float3{1, 0, 0}); break; case 2: + // _materialInstances[i]->setParameter("axisDirection", math::float3 { 0.0f, 0.0f, 1.0f}); break; } @@ -162,7 +182,7 @@ Gizmo::Gizmo(Engine &engine) : _engine(engine) {arrowWidth, arrowWidth, lineLength + arrowLength}}) .material(0, _materialInstances[i]) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, ib, 0, 54) - .priority(0) + .priority(6) .layerMask(0xFF, 2) .culling(false) .receiveShadows(false) @@ -175,7 +195,30 @@ Gizmo::Gizmo(Engine &engine) : _engine(engine) // parent the axis to the center cube transformManager.setParent(instance, cubeTransformInstance); + } + + _scene->addEntities(_entities,4); + + _view->setLayerEnabled(0, true); // scene assets + _view->setLayerEnabled(1, true); // gizmo + _view->setLayerEnabled(2, true); // world grid +} + +Gizmo::~Gizmo() { + _scene->removeEntities(_entities, 4); + for(int i = 0; i < 4; i++) { + _engine.destroy(_materialInstances[i]); + } + _engine.destroy(_material); + for(int i = 0; i < 4; i++) { + _engine.destroy(_entities[i]); + } + + _view->setScene(nullptr); + _engine.destroy(_scene); + _engine.destroy(_view); + } void Gizmo::highlight(Entity entity) { @@ -183,7 +226,7 @@ void Gizmo::highlight(Entity entity) { auto renderableInstance = rm.getInstance(entity); auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, 0); - math::float3 baseColor; + math::float4 baseColor; if(entity == x()) { baseColor = activeColors[Axis::X]; } else if(entity == y()) { @@ -191,10 +234,11 @@ void Gizmo::highlight(Entity entity) { } else if(entity == z()) { baseColor = activeColors[Axis::Z]; } else { - baseColor = math::float3 { 1.0f, 1.0f, 1.0f }; + baseColor = math::float4 { 1.0f, 1.0f, 1.0f, 1.0f }; } materialInstance->setParameter("color", baseColor); + } void Gizmo::unhighlight() { @@ -204,7 +248,7 @@ void Gizmo::unhighlight() { auto renderableInstance = rm.getInstance(_entities[i]); auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, 0); - math::float3 baseColor = inactiveColors[i]; + math::float4 baseColor = inactiveColors[i]; materialInstance->setParameter("color", baseColor); } } @@ -226,72 +270,73 @@ void Gizmo::destroy() } -void Gizmo::updateTransform(Camera& camera, const Viewport &vp) +void Gizmo::updateTransform() { - auto & transformManager = _engine.getTransformManager(); - auto transformInstance = transformManager.getInstance(_entities[3]); + return; + // auto & transformManager = _engine.getTransformManager(); + // auto transformInstance = transformManager.getInstance(_entities[3]); - if(!transformInstance.isValid()) { - Log("No valid gizmo transform"); - return; - } + // if(!transformInstance.isValid()) { + // Log("No valid gizmo transform"); + // return; + // } - auto worldTransform = transformManager.getWorldTransform(transformInstance); - math::float4 worldPosition { 0.0f, 0.0f, 0.0f, 1.0f }; - worldPosition = worldTransform * worldPosition; + // auto worldTransform = transformManager.getWorldTransform(transformInstance); + // math::float4 worldPosition { 0.0f, 0.0f, 0.0f, 1.0f }; + // worldPosition = worldTransform * worldPosition; - // Calculate distance - float distance = length(worldPosition.xyz - camera.getPosition()); + // // Calculate distance + // float distance = length(worldPosition.xyz - camera.getPosition()); - const float desiredScreenSize = 3.0f; // Desired height in pixels - const float baseSize = 0.1f; // Base size in world units + // const float desiredScreenSize = 3.0f; // Desired height in pixels + // const float baseSize = 0.1f; // Base size in world units - // Get the vertical field of view of the camera (assuming it's in radians) - float fovY = camera.getFieldOfViewInDegrees(filament::Camera::Fov::VERTICAL); + // // Get the vertical field of view of the camera (assuming it's in radians) + // float fovY = camera.getFieldOfViewInDegrees(filament::Camera::Fov::VERTICAL); - // Calculate the scale needed to maintain the desired screen size - float newScale = (2.0f * distance * tan(fovY * 0.5f) * desiredScreenSize) / (baseSize * vp.height); + // // Calculate the scale needed to maintain the desired screen size + // float newScale = (2.0f * distance * tan(fovY * 0.5f) * desiredScreenSize) / (baseSize * vp.height); - if(std::isnan(newScale)) { - newScale = 1.0f; - } + // if(std::isnan(newScale)) { + // newScale = 1.0f; + // } - // Log("Distance %f, newscale %f", distance, newScale); + // // Log("Distance %f, newscale %f", distance, newScale); - auto localTransform = transformManager.getTransform(transformInstance); + // auto localTransform = transformManager.getTransform(transformInstance); - // Apply scale to gizmo - math::float3 translation; - math::quatf rotation; - math::float3 scale; + // // Apply scale to gizmo + // math::float3 translation; + // math::quatf rotation; + // math::float3 scale; - decomposeMatrix(localTransform, &translation, &rotation, &scale); + // decomposeMatrix(localTransform, &translation, &rotation, &scale); - scale = math::float3 { newScale, newScale, newScale }; + // scale = math::float3 { newScale, newScale, newScale }; - auto scaledTransform = composeMatrix(translation, rotation, scale); + // auto scaledTransform = composeMatrix(translation, rotation, scale); - transformManager.setTransform(transformInstance, scaledTransform); + // transformManager.setTransform(transformInstance, scaledTransform); - // The following code for logging screen position remains unchanged - auto viewSpacePos = camera.getViewMatrix() * worldPosition; - math::float4 entityScreenPos = camera.getProjectionMatrix() * viewSpacePos; - entityScreenPos /= entityScreenPos.w; - float screenX = (entityScreenPos.x * 0.5f + 0.5f) * vp.width; - float screenY = (entityScreenPos.y * 0.5f + 0.5f) * vp.height; - // Log("gizmo %f %f", screenX, screenY); + // auto viewSpacePos = camera.getViewMatrix() * worldPosition; + // math::float4 entityScreenPos = camera.getProjectionMatrix() * viewSpacePos; + // entityScreenPos /= entityScreenPos.w; + // float screenX = (entityScreenPos.x * 0.5f + 0.5f) * vp.width; + // float screenY = (entityScreenPos.y * 0.5f + 0.5f) * vp.height; } +void Gizmo::pick(uint32_t x, uint32_t y, void (*callback)(EntityId entityId, int x, int y)) + { + auto * gizmo = this; + _view->pick(x, y, [=](filament::View::PickingQueryResult const &result) { + if(result.renderable == gizmo->x() || result.renderable == gizmo->y() || result.renderable == gizmo->z()) { + gizmo->highlight(result.renderable); + callback(Entity::smuggle(result.renderable), x, y); + } else { + gizmo->unhighlight(); + } + }); + } - // Log("scaledTransform %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", - // scaledTransform[0][0], scaledTransform[0][1], scaledTransform[0][2], scaledTransform[0][3], - // scaledTransform[1][0], scaledTransform[1][1], scaledTransform[1][2], scaledTransform[1][3], - // scaledTransform[2][0], scaledTransform[2][1], scaledTransform[2][2], scaledTransform[2][3], - // scaledTransform[3][0], scaledTransform[3][1], scaledTransform[3][2], scaledTransform[3][3]); - // Log("localTransform %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", - // localTransform[0][0], localTransform[0][1], localTransform[0][2], localTransform[0][3], - // localTransform[1][0], localTransform[1][1], localTransform[1][2], localTransform[1][3], - // localTransform[2][0], localTransform[2][1], localTransform[2][2], localTransform[2][3], - // localTransform[3][0], localTransform[3][1], localTransform[3][2], localTransform[3][3]); } \ No newline at end of file From 12b61e87672dbfec74b0f42d55995f6f74a331c0 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 16:54:40 +0800 Subject: [PATCH 033/232] feat: rescale gizmo based on distance from camera --- thermion_dart/native/include/Gizmo.hpp | 38 ++++++++++++++++++-------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/thermion_dart/native/include/Gizmo.hpp b/thermion_dart/native/include/Gizmo.hpp index 4ca793e9..251afbea 100644 --- a/thermion_dart/native/include/Gizmo.hpp +++ b/thermion_dart/native/include/Gizmo.hpp @@ -20,6 +20,7 @@ #include "material/gizmo.h" #include "Aabb2.h" +#include "ThermionDartApi.h" namespace thermion_filament { @@ -31,8 +32,10 @@ class Gizmo { enum Axis { X, Y, Z}; public: - Gizmo(Engine& engine); - void updateTransform(Camera& camera, const Viewport& vp); + Gizmo(Engine& engine, View *view, Scene *scene); + ~Gizmo(); + + void updateTransform(); void destroy(); Entity x() { return _entities[0]; @@ -46,24 +49,37 @@ class Gizmo { Entity center() { return _entities[3]; }; + View* view() { + return _view; + } + + bool isActive() { + return _isActive; + } void highlight(Entity entity); void unhighlight(); + void pick(uint32_t x, uint32_t y, void (*callback)(EntityId entityId, int x, int y)); + private: Engine &_engine; - utils::Entity _entities[4]; + View *_view; + Scene *_scene; + Camera *_camera; + utils::Entity _entities[4] = { utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity() }; Material* _material; MaterialInstance* _materialInstances[4]; - math::float3 inactiveColors[3] { - math::float3 { 0.75f, 0.0f, 0.0f }, - math::float3 { 0.0f, 0.75f, 0.0f }, - math::float3 { 0.0f, 0.0f, 0.75f }, + math::float4 inactiveColors[3] { + math::float4 { 0.75f, 0.0f, 0.0f, 1.0f }, + math::float4 { 0.0f, 0.75f, 0.0f, 1.0f }, + math::float4 { 0.0f, 0.0f, 0.75f, 1.0f }, }; - math::float3 activeColors[3] { - math::float3 { 1.0f, 0.0f, 0.0f }, - math::float3 { 0.0f, 1.0f, 0.0f }, - math::float3 { 0.0f, 0.0f, 1.0f }, + math::float4 activeColors[3] { + math::float4 { 1.0f, 0.0f, 0.0f, 1.0f }, + math::float4 { 0.0f, 1.0f, 0.0f, 1.0f }, + math::float4 { 0.0f, 0.0f, 1.0f, 1.0f }, }; + bool _isActive = true; }; } \ No newline at end of file From a3f7b98bf7471ec52345afe1dc35faf59d909e2f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:45:19 +0800 Subject: [PATCH 034/232] feat: create transparent overlay for gizmo for easier picking --- materials/gizmo.mat | 4 +- thermion_dart/native/include/Gizmo.hpp | 13 +- thermion_dart/native/include/material/gizmo.S | 2 +- .../native/include/material/gizmo.apple.S | 2 +- .../native/include/material/gizmo.bin | Bin 26876 -> 28800 bytes thermion_dart/native/include/material/gizmo.c | 2470 +++++++++-------- thermion_dart/native/include/material/image.c | 3 +- thermion_dart/native/src/Gizmo.cpp | 190 +- 8 files changed, 1419 insertions(+), 1265 deletions(-) diff --git a/materials/gizmo.mat b/materials/gizmo.mat index 447d4c3b..334192b5 100644 --- a/materials/gizmo.mat +++ b/materials/gizmo.mat @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f467a6361958bd8a3381dcd5895665c09932daf37e606b06c7f584de484b0d5d -size 1572 +oid sha256:634f5806365b20f05a3736b5b87c1ba6a49b94e39d3defbd6f22f9784d718388 +size 1754 diff --git a/thermion_dart/native/include/Gizmo.hpp b/thermion_dart/native/include/Gizmo.hpp index 251afbea..4e1af5ca 100644 --- a/thermion_dart/native/include/Gizmo.hpp +++ b/thermion_dart/native/include/Gizmo.hpp @@ -35,7 +35,6 @@ class Gizmo { Gizmo(Engine& engine, View *view, Scene *scene); ~Gizmo(); - void updateTransform(); void destroy(); Entity x() { return _entities[0]; @@ -57,18 +56,21 @@ class Gizmo { return _isActive; } - void highlight(Entity entity); - void unhighlight(); void pick(uint32_t x, uint32_t y, void (*callback)(EntityId entityId, int x, int y)); + bool isGizmoEntity(Entity entity); + void setVisibility(bool visible); private: + void createTransparentRectangles(); + void highlight(Entity entity); + void unhighlight(); Engine &_engine; View *_view; Scene *_scene; Camera *_camera; - utils::Entity _entities[4] = { utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity() }; + utils::Entity _entities[7] = { utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity() }; Material* _material; - MaterialInstance* _materialInstances[4]; + MaterialInstance* _materialInstances[7]; math::float4 inactiveColors[3] { math::float4 { 0.75f, 0.0f, 0.0f, 1.0f }, math::float4 { 0.0f, 0.75f, 0.0f, 1.0f }, @@ -80,6 +82,7 @@ class Gizmo { math::float4 { 0.0f, 0.0f, 1.0f, 1.0f }, }; bool _isActive = true; + }; } \ No newline at end of file diff --git a/thermion_dart/native/include/material/gizmo.S b/thermion_dart/native/include/material/gizmo.S index e3cc4f49..d09453b9 100644 --- a/thermion_dart/native/include/material/gizmo.S +++ b/thermion_dart/native/include/material/gizmo.S @@ -8,5 +8,5 @@ GIZMO_PACKAGE: GIZMO_GIZMO_OFFSET: .int 0 GIZMO_GIZMO_SIZE: - .int 26876 + .int 28800 diff --git a/thermion_dart/native/include/material/gizmo.apple.S b/thermion_dart/native/include/material/gizmo.apple.S index ccc7f03a..5cfe94a9 100644 --- a/thermion_dart/native/include/material/gizmo.apple.S +++ b/thermion_dart/native/include/material/gizmo.apple.S @@ -8,5 +8,5 @@ _GIZMO_PACKAGE: _GIZMO_GIZMO_OFFSET: .int 0 _GIZMO_GIZMO_SIZE: - .int 26876 + .int 28800 diff --git a/thermion_dart/native/include/material/gizmo.bin b/thermion_dart/native/include/material/gizmo.bin index 0fc109c276e828863cca1fbac46d1a412335d852..0d3924799f14c765b9487105af19eb0f7b568c34 100644 GIT binary patch delta 8753 zcmd5=3v`v$mEQY=KoIhPJV-(kZg_+wz~%n`{qG|N3=kd$5(sY*=;bCPay1ViDFo~^ z+Q+nGAL^W$S+izb%j&G9Z573)ojSI)SjXC_&RDb$YkkpLwH0lv)?$6lx6l9IM?wUr z?OL6?R{ry!efHV=oPGB9o&D$SlYG@FK3<`ClCD%&GwU1G%{iT~&A8=;Tb^E~Te6O2 z|HGw3M@HVtx@A&xB+KrY7u(-IkQhw#_chX?uFjw@77T?j6bnYe{-GmBef7TD zp02*j2KUw0b{~xQc5UrTboU?Z9q`9>WA&1_=+)JUW}R=b&+!N9j2*`pbF83er;()N zA2Qug$Uo!>jwA&~Ji*bV;AqlFFsz@PTBa|mZkQ!DU_2HKNBp7~@HaFh)trE%msKvv z!k9i;Q<@ue#1f>kFn!n589LCGooxrvH@ywvi7M#mJEzXdhb-mIcEb9psb$%i*hu=O zmcl|v;1W;cvR2-7b#A3Xvn;nxnk#Z2D6=Dt)ZNn`A4J&fXey9)gFY~^On2n@*wG)) zOAPnM2fGd?;yvwgL~_92u~76Q<{3Tf*-+>2h!1o%_xJQ4{J@IIfP^A;YDu9;&|Olt zFBXb8BUk2sYyw;Q-NGt7D~opGd88Q?ZI# z5Y-}^kREQ84cFl9YmE7QDDg1rd_URdTZm zlB4=W-oowU90H<+2qR8sJ)O~qa1OGQLYse zW)l{IU=z0hokD;iY#fD<<^>Zv9A~>vOb3~#&Zf*rb zCIrC<0)Jix?*O18RJe763V{Kr z2ux5RFhLbTDyWVl7~PcRxx?MqU;+#I*@2C^ft5LOH#)+!F(+yQo4y+zkZ9^|bS!f> zLY8uAhk`CfG1J2+L>@-%P!t$-vh1({>97YagB+8n zxpEPBSeJ?^LugVH>ygwH3r5q$yjw?&GV2Hpb?fGqYTeViDo>O>&oLBV54D!5P(bHz zsRLjO+G?Z|-!h*=dQV$zaR`Y#dX;uCs+(HoO%Ci9z6?V9zHpU-@Km^5ns>r2FtjFe zUD22u-c$i2Q==VO`jN&@!~P{pd|-zo=J_v6mO}FQlGVzJXy4MA3S1k%s7SxGG`B?j zge{Pt>`H#-MD)g{!kl==016W5Uc0n{qx$xx?K1z}r7H^L-ZIK~boC5$Y2Hw*yDqA4 zk6Lmo?~C_z%Z1?uLNrALM-$8a6g_39Nb&;5YAD$-Xp`_nUTYA)m;PN-V9Hs$E2n-2Qe=P(Q4+_{GBAc{4D3uTnepYP+gjG>(-j3dd*g%go!+8qV$ozqCu>Ug^Gy61 z)FAo|4!~Zk8UlJ++gycSd`pdK+G>jBmU9=J)V6TNH??dNh5N#lh3LBDZcQkqrV0Hc z6=nJ(TXRuYMo}L6hb@D$WL+2Vz-Ww0D`)(>ul9J5NMgHEsw9OL~VI$TbX`g z-EJ_f(D%7BIv8~SS0E+fxhl=^bJ|=@ssA2~o6Nxm_n!zMd>6=x;0{UtBO!>B$Pk*0 z#(GjIEt=ld6dIdcLC2hE@@mQ#vtBabYKrKGTT4~QlDkQvH?3`+^l&+urfq(4$P`AY z6hU&2y`3!mP@7fg<*X>m4=4%g{PpFyed^a&OdpritM!rfcA1A>cbdzpwlKFP)DFIX zuDyCBxS^2i@STf;_YN83{vqj_i^3)N3~nDZ6GJ&E@~+-E*U2PrV+Q;V7Ih<=^e+<0 zS0R4XM!J2)Z2hkr?-_pwMf%E3YwO1_vIAPpWMt#YrDXlwCf~G7blVnEK1r-G#})vb zI}e?JTeaJN8n;e}!KKvg!{Y6nwUQHY%Xd4;uMoJk64sDPND-QZ6k(EMMQ9RIgk#vw zvE@*tR@x}!I@u*xZ&h_MOiiXIG>w(B`PH!v!Dc~27#6LeShsDfDM5d%TiY=tYgAB8 zO?O5eLkMfiAlW>rX@z4^sbjGo$D-aHMV5A00^}v69ZFscMgW+YuU7mUZ7j#y<{v;N zS!GZ-7H&pyEIf%cyw}O(Sov&_D<76K=^Ux$L_`uMtvVH|2BwQg=*6Wg-9 z?fD#{>E!;H=x_1H#5drT3*24-|5$oH{)89dU4Sj|_OP`}|ynh}uH)0mt z<0msknxH$U65W)Noo($}x-N&Vrx{{SU%TUz!#|`S(U0jT^f>*L;u&t9pr66jlhAvL zp2qVT7=M;d(a-Vz3%p;B_Bph_r03}cdXavG{;%mJI!!NoqpzU-4gHpWhmlw5HF}+X zPj7f*e?WVN-lRVc(_8d5y<^PF4&J5r5PD|C2|A6)RHpWljnOQgz}Y;JCvgr><_VNb zd6Z8DbO9G(w3te03QuLRlgoLqa6M)t74VY?xsl6$UdW5s52Ih0OgJc_ z#i;XP6Gv?ie*uSaGu6`qT1boNR{A1+iM~v?(d~4M?w~vAINe1JG(umcuhCNaI^9jn z=pOn8HPg4~Uivnjpo^)6?x%IsN^SHYeUIAd`?QHR(-zuF+vo>$k{+eUXy>R?>>!J6 z4sy57+Fdy8aEQYk;V3uoh1|$XcqtzuNy3XbnS>J&>QZ;@e0I{LQ?PVQ3U0z2z(V$H z!k(bVknjJTX=(bXY)1ak^?LcvIe(?l2#(AqhN+2{@#kncD_X(H3~vSpjLq;>>}L0B zUV~GXywA++i#=H?qsK|;7B8V6MwBbO*yy~SRgq-YuH|(ZS^M`;0fCsHrgPQ?vL$D| z^vX!t;9n`07I#oO&04vQ*YgH$=Z(CHH}e+W%G-E5U&1^1Qr^kCcsGBDW4wps+`*l^ zm%F$d!E4>Js!cfi^>I1-=24vexXanEx}1Hf%h~rD&K{;0UDB2YarO&a6U%&%w&@kH z%m-<&bxB+1gR^BmIQtHlv!ywcM<83G%Xl9r_;UOS`CP$0+{=C3&-?iR$S1)r{T#&j z08dpkXoMd|Lg_$!&+sjLD}Rx{#9!vy_;x?;@?>GJbME?Qv_FcR^$lv4t;_vfA{4oDF{|`UHKj4%6C_lzO z*)5F6UW3#Xsj?@N@i2ex6_87x`DXmtW%3{4&2XX2BAV6GrwMcj?3YTmBut%CGV3 z{Cj?b|G;PXP5vXl#c%UF=)a5JduU0$iEBlvEHy!8t2cO}ngofAKe-o$ASQ z(dMaqRiLJ+>8el_sbW>4W+*qj-$cszy=V-7&*cnrF`Cgl381=W~(`=y^YS@ zxoV!OQS();s#Eo9fm)~*DZg5*0?Nu#w$k6-SGC#=@t=ahztEP>55X0xS*=v7)M~Xx zU94KvTD4BKsy4M=r6KrsF%{yD|Njb^4XRzGL9wMF8BNHJ28?F9$|PGA%ZQKOF$@bNI*zyQ0s+0 zrc-NYkTc_~8E0%ef3!|5XiaCecG_AUomQ%2t+iHbi?sDo#Yf-uJ->av@4k{iajni> zE8jV1?{oG!XYb!{?~}u)`K?F!&RWF#dk${5Z@z>P5RdItsK#BluzJ$qT;*w zUR~LU@4re{MLV*FIoGW~2-XEJ6SZQH3s1fv!tJLLjtheV?g`4Uk1 z#}8fOZSnfx2yeSLVTVJ_&E8gTA`-wE%_9G}F&K^d$5WC+DaoOfM4}IKh>!kObz9oM zYhC}s5pW({Fy%YRzvq}Z(Nk0I$rBjqTh_J|IVg*TfXZe1*5)!54Qp#rb<-4Z#zIrD z84u`Z>RS~Sdy6ZJ;^LnKWIe^+yf{4KBC|kW-?E?tf;1|vfQ{|C73RLyQeKK-Ck>AR zY*rv7=lXVwPj|J>@K``}m$x+;h(Kz?vrA=4IE_uq3doig^etY4SD%;=D#51XaHr!& z##uj&zSZl)uU*`XsEL&bHp7+@#bRt>LD3>x*~i-E*E&XJksI$EeYx&#n9*wvkeTAx z%swVIvYKJvG3&p&Idv`pflRl-%{qnV_J-yv$43XphDLYpN(_%)vCF^-!8+4$iiPDH zeN#dfbcvpuPogGhK}#e3Q-;_9ur7SbG}%73Z_D~IiDv81CsD8TS6>SNq82b znn`$;EeWp#!pzZaL2|c879io3*dZ5MwjGBd7g`snpbccTB<)}jQWsiw5IA(xo*fb- zCPbf(8B9osY&+yY%jsmGh4s_uCqqk2rl2(&83H>Q48Yp4w%Yl|cm_7PYC%@f3TNNU z9OUsy$IOD3Om?6pJqKFoIcXm)(tZub;-$&pLfj@^Z@Xcpvg10ip-Go?=IfL3?)k%` z{>f1D;+L@FVSRdIrN@rP_0p}VCK%t@v7pExRfI>jHW}rKj;0EXC2F$JxE!U<4#c&! zp%MEOm}$$l)hmcD8LUQai|c{TH7Gl`b{-8o3w(Qq_U;auZ_qa~G`8!&@X+4=p#wuB z2mL1Fq9Vx@;V5`EvHZdvo_QkhCSsO^J*Cv2?W=D&4`Z?nB-Ni;_Gu33_HHi-u)%!y zb$3B>ynEF`+a$qIDCS2_m&?h|#Z<%=EbBXZ>Ng1KBepeVN;Hn@X4c>{yxZ#=+Huf_ znRc`HB0LKM0m}|Irzgn71eWL{J^c!#eXM7>vTa?tyq=>vvfOV)!jk7lhDUwo%I(gT zca87&wfkhDV0-A`SVzam&^We1x*Zv4(2p;Vf#9=yJMlfUa)Dmjo3BTE7b!cSpBz}P z5BKEdC1Q4L;)ULPZmCTFkQj=1exS(9F=Z(3Pa zWcU?DYWUL1mWnWlBe#*CL;|mkSRjbqR~1R5645|NcdUAOaS+ATgza2+xbCumzIOH8 z+SJNi(*Rm57)7ue^vTt8R++>HKcqaAfX|%LjRQk1)6wyZfD%P<)vQ_+}k zOqPOTg-$Vu3ByDKg3XJ@Ci4p!)!MLG^vkx@mBjGG6nC4#8@KexwhI+5(&b&GAK5lD z8JGA-bwkaJBQMHS7sqia$ENQ~#4R^+DV=251oHaTIZLd7@WMa>IshdR54D-Gn|tH7 z$nd&xi|}S-#<-Ih?F_}Zn8JNM8$Sfih~e0CL7 z?uL>bq#MV_3g~w)Z(U@R=?j`<+9tlpo_F!!e7sL=Ju+CUB4OCA*01zmj=U9dbJ(BD zl@WxoN(BOLs*Ge(We`FMWH6wQclgQ!fysf)B+5cD@XRJl@842c843p+kEET2Bohwn zWdpTyr=|KP5d7YON+b)1*ZKPG&2_Un*~fWe;?W7td4dsPLyB|-c%%e`c4sYaGG77~4Vr+-FkRb% z5K3*6_C&{$@@Q~M#PIJMxMyadtd&~$hbDa_8>xF_TbDvLcGx#7X&x&s`%HC~$>xG6 zlR-)9ZfLMJn;r6;h>0(4{41GDK|3t0F<}#>a1alg91>zDkp{y%(>#<13Z6YuuV6WQ zD|k9&o4CQ8a~l!3Por>d$_SYYWtb>05QmB-HF5~qG)*yVB$BXwY_PS_98vxi#VZHJ zRo=`~C+hye`N|Fo8IuTPC#~DGZgpayXZ>A8M03gcG11?k$HYg`KSlpav_C_8ik_j<^mFn+=`~mPYqY!01Wr^br_c z$ctFFBsLfS3*AEhN-fk%ZPczG-d_3sI31@GbO&|Om+3C*rmxU{QZId#zD9S`*Qt-z z&^Kuad}K`uDebN>&hSbRQj}&N~KA{l@*dNiDf-KsT+h`Tidp{q;O)7Ja_;slNi@#x}iji-c-nY;@!T0dp@N_?4ffXndSr_{@^rE@4 zg6Pg1ja+2fd({2eizMYD+2^^J@8kdG`}qO>AN~%1mmfq?{2rq5F#j(!};V&53 z_s!WKxUl5*l!gEz)M=gd6kan|G@l9f{ZeAaNDUo^8} z=}~zqUrCH}!Fhu3-~v^siqs5sftsmisbV!-m8eoRN6l4bYMv@r6{=EIscKcD=Brv& z=icv}ggYO`O$*fbezWQCRIe5&uWC>W)grZ6eU-oF#&0e-b0Q}y@6pMHS>*qVa^@Z| zrcpJi3}=?8vvbC$n$`13aHB=FDu+sKXxo)v31gPJGGR #include "gizmo.h" +#include + const uint8_t GIZMO_PACKAGE[] = { // GIZMO 0x53, 0x52, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x54, 0x41, 0x45, 0x46, @@ -29,13 +30,13 @@ const uint8_t GIZMO_PACKAGE[] = { 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x02, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x06, 0x00, 0x20, 0x42, 0x49, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x07, 0x00, 0x20, 0x42, 0x49, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x4e, 0x4f, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, 0x55, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x45, -0x4c, 0x42, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x44, 0x4d, 0x52, 0x54, 0x5f, 0x54, 0x41, 0x4d, 0x01, +0x4c, 0x42, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x44, 0x4d, 0x52, 0x54, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x52, 0x57, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x49, 0x52, 0x57, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x45, 0x54, 0x44, @@ -43,8 +44,8 @@ const uint8_t GIZMO_PACKAGE[] = { 0x00, 0x00, 0x53, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4d, 0x55, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4f, 0x52, 0x50, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x44, 0x49, 0x55, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0xfe, 0x16, 0xc9, 0x46, 0x7d, 0x50, 0x8b, -0x83, 0x44, 0x41, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, 0x5f, 0x54, +0x00, 0x44, 0x49, 0x55, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x63, 0xf3, 0x17, 0xa6, 0x9c, 0xa6, 0xde, +0x40, 0x44, 0x41, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x49, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x41, 0x51, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, @@ -52,7 +53,7 @@ const uint8_t GIZMO_PACKAGE[] = { 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x19, 0x3e, 0x52, 0x48, 0x54, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0xcd, 0xcc, 0x4c, 0x3e, 0x4f, 0x44, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x54, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x44, 0x53, 0x43, 0x5f, 0x54, 0x41, -0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x74, 0x53, 0x00, 0x00, 0x49, 0x02, +0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x94, 0x5a, 0x00, 0x00, 0x79, 0x02, 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x30, 0x30, 0x20, 0x65, 0x73, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x7b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, @@ -150,1204 +151,1299 @@ const uint8_t GIZMO_PACKAGE[] = { 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x20, 0x2b, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x00, 0x7d, 0x00, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x31, 0x36, 0x20, -0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, -0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, -0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, -0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, -0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x5f, 0x33, 0x31, 0x36, -0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x36, -0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, -0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, -0x2a, 0x20, 0x5f, 0x33, 0x31, 0x36, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x36, 0x2e, -0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, -0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, -0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, -0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, -0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x34, -0x36, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, -0x20, 0x5f, 0x32, 0x31, 0x37, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x31, -0x37, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x37, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, -0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x3b, 0x00, 0x70, 0x72, 0x65, -0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, -0x69, 0x6e, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, -0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, -0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x65, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x3b, 0x00, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x3b, -0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x3b, 0x00, 0x76, -0x65, 0x63, 0x33, 0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, -0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x36, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x3b, 0x00, 0x6c, -0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x68, 0x69, 0x67, -0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x3b, 0x00, 0x7d, -0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, -0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, -0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x66, 0x72, -0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, -0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, -0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, -0x62, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, -0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x29, 0x2e, 0x62, -0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, -0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x29, 0x2e, -0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x37, 0x36, -0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, -0x35, 0x37, 0x38, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x68, -0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, -0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x65, 0x5b, -0x34, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, 0x68, 0x69, -0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, -0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, -0x20, 0x6c, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x68, 0x69, -0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, -0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x71, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, -0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x3b, 0x00, 0x68, 0x69, 0x67, -0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, -0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x3b, 0x00, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x7a, 0x3b, 0x00, 0x75, 0x76, 0x65, -0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, -0x64, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x66, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, -0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, -0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6b, 0x7a, 0x3b, 0x00, 0x68, -0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, -0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, -0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x71, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x7a, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x68, -0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, -0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, -0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6a, -0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6b, 0x7a, 0x7a, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x7a, 0x7a, -0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, -0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x7a, 0x7a, 0x5b, 0x34, -0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x7a, -0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x75, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, -0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x69, 0x6e, -0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, -0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, -0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x68, 0x69, -0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, -0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, -0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x7a, 0x7a, 0x29, -0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, -0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, 0x35, 0x3b, 0x00, -0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, -0x31, 0x32, 0x35, 0x29, 0x00, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x28, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x79, 0x20, 0x2d, -0x20, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x3b, 0x00, 0x5f, 0x36, 0x30, -0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, -0x2e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x37, -0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, -0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, -0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x37, 0x3b, 0x00, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, -0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, -0x36, 0x30, 0x36, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x64, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2a, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, -0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x3b, -0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, -0x20, 0x5f, 0x32, 0x37, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, -0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, -0x36, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, -0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, -0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, -0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, -0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, -0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x37, -0x34, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, -0x5f, 0x36, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x36, -0x30, 0x36, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x65, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x30, -0x38, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x66, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, -0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, -0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, 0x31, 0x20, -0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, -0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, -0x37, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, -0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, -0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x35, 0x37, -0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, -0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, -0x31, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x3b, 0x00, 0x76, -0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x33, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, -0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, -0x30, 0x38, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x2e, 0x78, -0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x2e, 0x79, 0x3b, 0x00, -0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x66, 0x72, -0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, -0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, -0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, -0x62, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x36, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, -0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x38, 0x29, 0x2e, 0x62, -0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x36, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, -0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x38, 0x29, 0x2e, -0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x61, 0x72, 0x61, -0x6d, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, -0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, -0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, -0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x33, 0x20, 0x3d, -0x20, 0x66, 0x6f, 0x67, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x29, -0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x33, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, -0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, -0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, -0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, -0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, -0x65, 0x6c, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, -0x74, 0x49, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, -0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, -0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x35, 0x3b, -0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, -0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, -0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, -0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, -0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x42, 0x69, -0x74, 0x73, 0x54, 0x6f, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, -0x64, 0x29, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x76, -0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x76, -0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, -0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, -0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x63, -0x6c, 0x69, 0x70, 0x5f, 0x63, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3a, 0x20, -0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, -0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, -0x38, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, -0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x20, 0x32, 0x00, 0x63, 0x6f, -0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, -0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, -0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x3b, -0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, -0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, -0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, -0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, -0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, -0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, -0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x61, 0x5b, 0x5f, 0x37, 0x35, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, -0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x5f, 0x38, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, -0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, -0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x34, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, -0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x20, 0x3d, -0x20, 0x5f, 0x39, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, -0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x2e, 0x78, -0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, -0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, -0x39, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, -0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, -0x30, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, -0x20, 0x5f, 0x31, 0x30, 0x32, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, -0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, -0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, -0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x32, 0x2e, -0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x30, -0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x34, -0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x78, 0x20, 0x2a, -0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x2e, -0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, -0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, -0x20, 0x5f, 0x31, 0x31, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, -0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x30, 0x32, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x31, 0x30, -0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, -0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x31, 0x30, 0x32, -0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x2a, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, -0x20, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, -0x28, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x77, 0x20, 0x2a, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, -0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x3b, -0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, -0x35, 0x3b, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x31, 0x30, 0x00, 0x23, 0x65, 0x78, 0x74, -0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x69, 0x6e, -0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x3a, -0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, -0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x38, 0x29, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, -0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x00, 0x6c, 0x61, -0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x6f, -0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, -0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, -0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, -0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x34, 0x20, 0x5f, 0x33, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, -0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, -0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x29, 0x3b, 0x00, 0x5f, 0x33, 0x31, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, -0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x31, 0x37, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, -0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x20, -0x3d, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x31, -0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, -0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, -0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, -0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, -0x34, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, -0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, -0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, -0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, -0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, 0x35, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, -0x34, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, -0x5f, 0x36, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, -0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, -0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, -0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, -0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, -0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, -0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, -0x38, 0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, -0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, -0x78, 0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, -0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, -0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, -0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, -0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, -0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, -0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, -0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x20, +0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x33, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, +0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, +0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, 0x2e, +0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x36, +0x3b, 0x00, 0x5f, 0x34, 0x31, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x5f, +0x34, 0x31, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x33, +0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, +0x36, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, +0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x29, 0x3b, 0x00, 0x5f, 0x33, 0x36, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, +0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x36, 0x37, +0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x33, 0x20, 0x5f, 0x32, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, -0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, -0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, -0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, -0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, -0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x69, -0x6e, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, -0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, -0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x38, -0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, -0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, -0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, -0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x61, 0x5b, 0x5f, 0x31, 0x39, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, -0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x5f, 0x33, 0x38, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, -0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, -0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x38, 0x39, 0x29, 0x2e, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, -0x32, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, -0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, -0x20, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, -0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x79, -0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, -0x5f, 0x32, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, -0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, -0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x32, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, -0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x3b, 0x00, 0x69, 0x6e, 0x74, -0x20, 0x5f, 0x32, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, -0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, -0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x32, -0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, -0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x5f, 0x32, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x33, 0x32, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x33, 0x20, 0x2a, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x32, 0x39, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, 0x20, -0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, -0x33, 0x32, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, -0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x33, -0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x5f, -0x32, 0x32, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, -0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, -0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x77, -0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, -0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, -0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x33, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x32, -0x39, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x77, 0x29, 0x29, 0x3b, -0x00, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x7a, 0x20, 0x2a, 0x20, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, +0x34, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x34, 0x3b, 0x00, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x3b, +0x00, 0x5f, 0x32, 0x34, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x34, 0x36, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x20, 0x28, 0x5f, 0x32, 0x34, 0x36, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, -0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x3b, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, -0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x00, 0x23, 0x69, -0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69, 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, -0x00, 0x00, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, -0x74, 0x61, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, -0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, -0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, -0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, -0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, -0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, -0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, -0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, -0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, -0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, -0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, -0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, -0x20, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x64, -0x61, 0x74, 0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, -0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, -0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, -0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, -0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, -0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, -0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, -0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, -0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x4e, 0x6f, 0x69, 0x73, -0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x54, 0x69, -0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, -0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, -0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, -0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x72, 0x65, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x64, 0x4f, 0x66, 0x66, 0x73, -0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, -0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, -0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x4f, 0x76, -0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x46, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x76, 0x31, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, -0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x53, 0x61, 0x6d, 0x70, 0x6c, -0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x64, 0x45, 0x64, 0x67, 0x65, 0x44, 0x69, 0x73, -0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x42, -0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x20, 0x7a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, -0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x66, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x43, 0x6f, -0x75, 0x6e, 0x74, 0x58, 0x59, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, 0x6c, -0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x69, 0x62, 0x6c, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x65, 0x4c, 0x65, 0x76, 0x65, -0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x69, 0x62, 0x6c, 0x53, 0x48, 0x5b, -0x39, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x33, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, -0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x20, 0x73, 0x75, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x68, 0x61, -0x64, 0x6f, 0x77, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, -0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, -0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x44, 0x69, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, -0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, -0x74, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x52, 0x61, 0x74, 0x69, -0x6f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, -0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, -0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x45, -0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, -0x73, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x42, 0x6c, 0x65, 0x65, 0x64, 0x52, 0x65, 0x64, -0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, -0x64, 0x6f, 0x77, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x44, 0x65, -0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, -0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, -0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, -0x20, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, -0x66, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, -0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, -0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, -0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, -0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, -0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, -0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, -0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, -0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x52, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x55, 0x76, -0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x53, 0x74, 0x72, 0x69, 0x64, -0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, -0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x37, 0x30, 0x39, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, -0x65, 0x64, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, -0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, -0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x73, 0x74, -0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x34, 0x29, -0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, -0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, -0x63, 0x6e, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, -0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, -0x63, 0x6e, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, -0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, 0x29, -0x5d, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, -0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, -0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, -0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, -0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, -0x5d, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, -0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5d, 0x5d, -0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, -0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x49, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, -0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, -0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, -0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, -0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, -0x39, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, -0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x39, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, -0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, -0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, -0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x39, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, -0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x39, 0x39, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, -0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, -0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, -0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, -0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x63, -0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, -0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, -0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, -0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, -0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, -0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, -0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, -0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, -0x72, 0x31, 0x20, 0x7b, 0x00, 0x64, 0x65, 0x70, 0x74, 0x68, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, -0x70, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, -0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x53, 0x6d, 0x70, 0x6c, -0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, -0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, -0x46, 0x47, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, -0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, -0x5b, 0x5b, 0x69, 0x64, 0x28, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, -0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, -0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x34, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, -0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, -0x75, 0x6c, 0x61, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x35, 0x29, 0x5d, 0x5d, 0x3b, -0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, -0x36, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, -0x73, 0x73, 0x61, 0x6f, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x37, 0x29, 0x5d, 0x5d, 0x3b, -0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x38, -0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, -0x73, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x39, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, -0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, -0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x30, 0x29, -0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, -0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x31, -0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, -0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, -0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x33, 0x29, 0x5d, 0x5d, 0x3b, -0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, -0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, -0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, -0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, -0x66, 0x65, 0x72, 0x31, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, -0x65, 0x74, 0x31, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, -0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, -0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, -0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, -0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, -0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, -0x38, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x6d, 0x61, 0x74, 0x65, -0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x2c, 0x20, 0x5f, -0x38, 0x31, 0x33, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x34, -0x34, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, -0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, -0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, -0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, -0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x00, 0x20, 0x20, 0x20, -0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, -0x35, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, 0x66, -0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x68, -0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x32, 0x32, 0x20, 0x3d, 0x20, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, -0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x39, 0x37, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x36, 0x32, 0x32, 0x29, -0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, -0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, -0x6c, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x31, 0x5d, 0x29, -0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, -0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x36, 0x32, 0x32, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x20, 0x3d, -0x20, 0x6d, 0x69, 0x6e, 0x28, 0x5f, 0x38, 0x31, 0x33, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, -0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, -0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x20, -0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, -0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, -0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x20, 0x3e, 0x20, -0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, -0x66, 0x32, 0x20, 0x5f, 0x38, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, -0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x38, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, -0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, -0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, -0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, -0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, -0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, -0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, -0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, -0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, -0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, -0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, -0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x38, 0x32, 0x30, 0x2e, 0x79, 0x2c, 0x20, 0x5f, -0x38, 0x32, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x6d, -0x61, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, -0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, -0x4e, 0x65, 0x61, 0x72, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, -0x38, 0x31, 0x33, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x38, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x3d, 0x20, -0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x29, -0x20, 0x2a, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, -0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, -0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, -0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3e, 0x20, 0x30, 0x2e, -0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, -0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, -0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x68, 0x61, -0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, -0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x29, -0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, -0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, -0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, -0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, -0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, -0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, -0x5f, 0x38, 0x31, 0x33, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, -0x39, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, -0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, -0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, -0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, -0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, -0x5f, 0x38, 0x33, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x33, 0x20, 0x2d, 0x20, 0x5f, -0x36, 0x35, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 0x37, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, -0x35, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x2e, 0x79, -0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x37, 0x39, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, -0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, -0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, -0x38, 0x30, 0x34, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, -0x31, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, -0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, -0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, -0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, -0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, -0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, -0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x5f, 0x74, -0x79, 0x70, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, 0x62, 0x6a, -0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, -0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, -0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, -0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, -0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, -0x28, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, -0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, -0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, -0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x5b, 0x5b, 0x66, -0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x38, 0x29, 0x5d, -0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, -0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, -0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, -0x6e, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, -0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x29, 0x20, -0x3f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, -0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x3a, 0x20, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x20, 0x5b, 0x5b, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, 0x5d, 0x20, 0x5b, -0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, -0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, -0x6c, 0x69, 0x70, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, -0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x5b, 0x5b, 0x75, -0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, -0x74, 0x20, 0x5f, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, -0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, -0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, -0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, -0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x35, 0x5d, 0x2e, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, -0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, -0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, -0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, -0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x38, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, -0x5f, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, -0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, -0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x5f, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, -0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, -0x2f, 0x20, 0x5f, 0x39, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x36, -0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x39, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, -0x38, 0x39, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x39, 0x34, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, -0x20, 0x5f, 0x39, 0x32, 0x2c, 0x20, 0x5f, 0x39, 0x36, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, -0x5f, 0x39, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x39, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x5f, 0x31, 0x30, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, -0x20, 0x5f, 0x39, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, -0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, -0x6d, 0x61, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x2c, 0x20, 0x5f, 0x39, 0x36, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, -0x5f, 0x39, 0x39, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, -0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, -0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x28, 0x5f, 0x39, 0x31, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x39, -0x39, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, -0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, -0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, -0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, -0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, -0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, -0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, -0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, -0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, -0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x39, 0x36, -0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x34, 0x20, 0x5f, 0x33, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, -0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x39, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, -0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, -0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, +0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, +0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x00, 0x73, +0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x65, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, +0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, +0x43, 0x6f, 0x61, 0x74, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x6e, +0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x32, 0x38, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, +0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, +0x34, 0x20, 0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x7d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, +0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2c, 0x20, 0x5f, 0x33, +0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x39, +0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2c, 0x20, 0x5f, +0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, +0x39, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, +0x35, 0x37, 0x32, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x33, 0x20, 0x5f, 0x35, 0x37, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x62, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, +0x20, 0x65, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, +0x69, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, +0x65, 0x63, 0x34, 0x20, 0x6c, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x71, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x77, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x7a, 0x3b, 0x00, +0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x66, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x69, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6b, 0x7a, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, +0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, +0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, +0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, +0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, 0x7a, 0x7a, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x7a, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, +0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6b, 0x7a, +0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x6d, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x7a, +0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x72, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, 0x5b, 0x34, 0x30, 0x5d, +0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x73, 0x61, +0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, +0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, +0x6f, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, +0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, +0x38, 0x36, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, +0x7a, 0x7a, 0x29, 0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, +0x77, 0x2e, 0x79, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, +0x31, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x20, 0x3e, 0x20, 0x30, +0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x65, +0x78, 0x70, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, +0x79, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x3b, 0x00, +0x5f, 0x36, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2a, 0x20, 0x6d, +0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x37, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, +0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x2c, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x33, 0x20, 0x5f, 0x36, 0x30, 0x32, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x38, +0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x7a, +0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, +0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x37, +0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, +0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, +0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, +0x3b, 0x00, 0x5f, 0x36, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, +0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, +0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, +0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, +0x5f, 0x32, 0x37, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, +0x7a, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x3d, +0x20, 0x5f, 0x36, 0x30, 0x32, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x36, 0x30, 0x34, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, +0x5f, 0x36, 0x30, 0x31, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, +0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, +0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, +0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x35, 0x37, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, +0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, +0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, +0x33, 0x35, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, +0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, +0x5f, 0x33, 0x34, 0x31, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, +0x2e, 0x77, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x35, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, +0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, 0x35, +0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x5f, 0x36, 0x30, 0x34, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x32, 0x29, 0x3b, 0x00, 0x63, 0x6f, +0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, +0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, +0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x32, 0x2c, 0x20, 0x5f, 0x35, +0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x34, +0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x32, 0x2c, 0x20, 0x5f, +0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, +0x34, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, +0x61, 0x72, 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, -0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, -0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, -0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, -0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, -0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, -0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x38, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, -0x5f, 0x38, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, -0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, -0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, -0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x20, 0x2a, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x33, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, -0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, -0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, -0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, -0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, -0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, -0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, -0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, -0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, -0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, -0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x31, 0x37, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x28, 0x5f, 0x38, 0x31, 0x37, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x63, 0x6c, 0x61, -0x6d, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, -0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, -0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, -0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, -0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, -0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, -0x2a, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, -0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, -0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, -0x77, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, -0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, -0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, -0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x2a, -0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x2a, -0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, -0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, -0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, -0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x35, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, -0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x32, -0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, -0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, -0x6e, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x35, +0x33, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, +0x5f, 0x31, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, +0x33, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, +0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, +0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, +0x36, 0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, +0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, +0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, +0x74, 0x42, 0x69, 0x74, 0x73, 0x54, 0x6f, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, +0x3d, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, +0x2f, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, +0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, +0x30, 0x29, 0x3b, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x58, +0x54, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x63, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x20, 0x3a, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, +0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, +0x49, 0x44, 0x5f, 0x38, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, +0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x20, 0x32, +0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, +0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, +0x5f, 0x38, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, -0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, -0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, -0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, -0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x39, -0x30, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, -0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x36, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, -0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x20, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x2e, 0x78, 0x79, 0x7a, +0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x36, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x39, 0x29, +0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x3b, 0x00, 0x5f, 0x39, 0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, +0x38, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x39, 0x30, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x38, 0x2e, 0x79, 0x3b, +0x00, 0x5f, 0x39, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x31, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, +0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, +0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x36, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x30, 0x29, 0x3b, 0x00, +0x5f, 0x31, 0x30, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x31, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, +0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x5f, +0x31, 0x30, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x78, +0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x30, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x20, 0x3d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x30, 0x36, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x30, 0x20, 0x3d, +0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, +0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, +0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, +0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x20, 0x3d, +0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x31, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, +0x31, 0x32, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, +0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x29, 0x3b, 0x00, 0x5f, 0x31, +0x31, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, +0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x32, 0x32, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x77, 0x29, 0x3b, +0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, +0x31, 0x32, 0x36, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, +0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, +0x31, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x31, 0x32, +0x32, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x32, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x38, 0x2e, +0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, +0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x31, 0x38, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x37, 0x36, 0x3b, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x31, 0x30, 0x00, 0x23, +0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73, 0x68, 0x61, +0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, +0x67, 0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, +0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x38, 0x29, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, +0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, +0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, +0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x37, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x29, 0x29, +0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, +0x34, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x33, 0x35, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, +0x35, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x2e, +0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x29, 0x3b, 0x00, +0x5f, 0x33, 0x36, 0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x34, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, +0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x36, 0x38, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x5f, +0x34, 0x30, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, +0x2a, 0x20, 0x5f, 0x34, 0x30, 0x35, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x6c, +0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, +0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, +0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x65, 0x63, +0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, +0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x36, 0x30, 0x31, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, +0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, +0x31, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, +0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, +0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, +0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x31, 0x2e, +0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x5f, 0x31, +0x38, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, +0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x68, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, +0x3b, 0x00, 0x5f, 0x36, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, +0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, +0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2a, 0x20, 0x6d, +0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, +0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, +0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, +0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, +0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, +0x5f, 0x32, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, +0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x20, 0x3d, +0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, +0x20, 0x5f, 0x34, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, +0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x32, 0x32, 0x37, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x29, 0x29, 0x2e, +0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, +0x39, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x3b, 0x00, 0x5f, 0x34, 0x39, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x34, 0x32, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x34, 0x39, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, +0x38, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x34, 0x39, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x38, 0x2e, 0x7a, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, +0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x32, 0x32, 0x37, 0x5d, 0x2e, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, +0x20, 0x5f, 0x34, 0x39, 0x34, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x34, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, +0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x30, 0x29, 0x2e, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x32, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x2e, +0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x32, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, +0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, +0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x3b, 0x00, 0x69, 0x6e, +0x74, 0x20, 0x5f, 0x32, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, +0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x36, +0x31, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, +0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x36, 0x31, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x20, 0x2a, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x35, 0x38, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x78, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, +0x32, 0x36, 0x31, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2e, +0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x36, +0x32, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x37, 0x33, 0x29, 0x20, 0x2a, 0x20, +0x5f, 0x32, 0x35, 0x33, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x37, 0x33, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2e, +0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, +0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, +0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x36, 0x32, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, +0x35, 0x38, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x77, 0x29, 0x29, +0x3b, 0x00, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x7a, 0x20, 0x2a, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x37, 0x3b, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, +0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x00, 0x23, +0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69, 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, +0x3e, 0x00, 0x00, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, +0x65, 0x74, 0x61, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, +0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, +0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, +0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, +0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, +0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, +0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, +0x63, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, +0x20, 0x20, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, +0x64, 0x61, 0x74, 0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, +0x41, 0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, +0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, +0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x78, 0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, +0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x34, 0x5d, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, +0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x4e, 0x6f, 0x69, +0x73, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x54, +0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x6f, +0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, +0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, +0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x72, 0x65, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x64, 0x4f, 0x66, 0x66, +0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, 0x72, 0x69, +0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, +0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x4f, +0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x46, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x76, 0x31, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x6e, +0x65, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x53, 0x61, 0x6d, 0x70, +0x6c, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x64, 0x45, 0x64, 0x67, 0x65, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, +0x42, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x7a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, +0x6b, 0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x66, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x43, +0x6f, 0x75, 0x6e, 0x74, 0x58, 0x59, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, +0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x69, 0x62, 0x6c, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x65, 0x4c, 0x65, 0x76, +0x65, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x69, 0x62, 0x6c, 0x53, 0x48, +0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x33, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x73, 0x75, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x68, +0x61, 0x64, 0x6f, 0x77, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, +0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x44, +0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, +0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, +0x6e, 0x74, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x52, 0x61, 0x74, +0x69, 0x6f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, +0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, +0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x76, 0x73, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x42, 0x6c, 0x65, 0x65, 0x64, 0x52, 0x65, +0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x68, +0x61, 0x64, 0x6f, 0x77, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x44, +0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, +0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, +0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, +0x74, 0x20, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, +0x66, 0x66, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, +0x4f, 0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, +0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, +0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, +0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, +0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, +0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4e, 0x65, +0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, +0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x52, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, +0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x55, +0x76, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x53, 0x74, 0x72, 0x69, +0x64, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, +0x6d, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x37, 0x30, 0x39, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, +0x76, 0x65, 0x64, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, +0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x73, +0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x34, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, +0x6f, 0x63, 0x6e, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, +0x6f, 0x63, 0x6e, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, +0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, +0x6e, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, +0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, +0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, +0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, +0x5d, 0x5d, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5d, +0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, +0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x49, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, +0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, +0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, +0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x33, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, +0x39, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x33, 0x39, 0x32, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x33, 0x39, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, +0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, +0x39, 0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x34, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, +0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, -0x36, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, -0x33, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x34, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, +0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, -0x37, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x35, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, -0x33, 0x37, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, -0x31, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, -0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, -0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, -0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, -0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, -0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, -0x32, 0x31, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x31, 0x20, 0x3d, 0x20, -0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, -0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, -0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x34, -0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, -0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, -0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x20, 0x3d, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x32, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x36, 0x2e, 0x77, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, -0x5f, 0x32, 0x31, 0x36, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, -0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2c, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, -0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x34, 0x38, 0x29, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, -0x31, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, -0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x20, 0x3d, 0x20, -0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, -0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, -0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x32, 0x39, 0x2c, 0x20, 0x5f, 0x32, -0x33, 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x38, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x32, -0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, -0x28, 0x5f, 0x34, 0x32, 0x39, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x32, 0x31, 0x20, 0x2b, 0x20, -0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x38, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x32, -0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, -0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x30, -0x3b, 0x00, 0x4c, 0x53, 0x4c, 0x47, 0x5f, 0x54, 0x41, 0x4d, 0xb2, 0x08, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x90, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, -0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xca, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xde, 0x01, 0x00, 0x00, 0x01, 0x30, 0x01, -0x26, 0x03, 0x00, 0x00, 0x01, 0x44, 0x01, 0x68, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x90, -0x00, 0x80, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x00, 0x02, 0x00, 0x01, 0xb4, 0x05, 0x00, 0x00, 0x02, -0x10, 0x00, 0xa8, 0x04, 0x00, 0x00, 0x02, 0x10, 0x01, 0xec, 0x05, 0x00, 0x00, 0x02, 0x20, 0x01, 0xfe, 0x05, 0x00, 0x00, -0x02, 0x30, 0x01, 0x34, 0x07, 0x00, 0x00, 0x02, 0x44, 0x01, 0x74, 0x07, 0x00, 0x00, 0x02, 0x80, 0x00, 0x8a, 0x07, 0x00, -0x00, 0x02, 0x90, 0x00, 0x8a, 0x07, 0x00, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, -0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, -0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, -0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, -0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, -0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, -0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, -0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, -0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, -0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, -0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, -0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, -0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x70, 0x00, -0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x69, 0x00, 0x16, 0x02, 0x00, 0x00, 0x19, 0x00, -0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, -0x7e, 0x00, 0x7f, 0x00, 0x04, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x02, 0x00, 0x84, 0x00, 0x85, 0x00, -0x86, 0x00, 0x87, 0x00, 0x66, 0x00, 0x02, 0x00, 0x88, 0x00, 0x69, 0x00, 0x51, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, -0x00, 0x00, 0x77, 0x00, 0x78, 0x00, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0x9b, 0x0c, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, -0x7f, 0x00, 0x04, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x17, 0x00, 0x02, 0x00, 0x84, 0x00, 0x8c, 0x00, 0x8d, 0x00, -0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, -0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, -0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, -0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, -0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, -0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, -0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, -0x61, 0x00, 0x83, 0x00, 0x02, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0x87, 0x00, 0xd6, 0x00, -0x02, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0x02, 0x00, 0xd9, 0x00, 0x69, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0x02, 0x00, -0xdd, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xde, 0x00, 0x69, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x00, -0xe3, 0x00, 0x02, 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xe8, 0x00, -0x69, 0x00, 0xe9, 0x00, 0xea, 0x00, 0xeb, 0x00, 0x02, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, 0x00, 0xf0, 0x00, -0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xf1, 0x00, 0x69, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, 0x00, 0xf6, 0x00, -0xd9, 0x00, 0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0x69, 0x00, -0xec, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x78, 0x00, 0x05, 0x00, 0x02, 0x00, 0xfc, 0x00, -0xfd, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, -0x10, 0x00, 0x03, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x04, 0x01, 0x05, 0x01, 0x66, 0x00, 0x02, 0x00, -0x06, 0x01, 0x07, 0x01, 0x69, 0x00, 0x91, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x78, 0x00, -0x87, 0x00, 0x66, 0x00, 0x02, 0x00, 0x08, 0x01, 0x69, 0x00, 0x48, 0x0c, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, -0x09, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, -0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0a, 0x01, -0x0b, 0x01, 0x0f, 0x00, 0x0c, 0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, -0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, -0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, -0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, -0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, -0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, -0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, -0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, -0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x63, 0x00, 0x62, 0x00, 0x64, 0x00, -0x65, 0x00, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, -0x69, 0x00, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, -0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, 0x01, 0x1f, 0x01, -0x20, 0x01, 0x21, 0x01, 0x69, 0x00, 0xca, 0x08, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x22, 0x01, 0x23, 0x01, 0x01, 0x00, -0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, -0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, -0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, -0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, -0x25, 0x00, 0x26, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa1, 0x00, -0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, -0x39, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0x3d, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0x40, 0x00, 0xb4, 0x00, 0xb5, 0x00, -0x43, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0x48, 0x00, 0x49, 0x00, 0xbd, 0x00, 0x4b, 0x00, 0x4c, 0x00, -0x4d, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0x50, 0x00, 0xc4, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, -0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0x5b, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, -0x61, 0x00, 0x62, 0x00, 0x24, 0x01, 0x25, 0x01, 0x26, 0x01, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, -0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x27, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x70, 0x00, -0x71, 0x00, 0x72, 0x00, 0x2b, 0x01, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x69, 0x00, 0x11, 0x02, 0x00, 0x00, 0x18, 0x00, -0x00, 0x00, 0x22, 0x01, 0x23, 0x01, 0x79, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, -0x7f, 0x00, 0x04, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x02, 0x00, 0x18, 0x00, 0x85, 0x00, 0x86, 0x00, -0x87, 0x00, 0x66, 0x00, 0x02, 0x00, 0x88, 0x00, 0x69, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x22, 0x01, -0x23, 0x01, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0xbf, 0x0a, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x22, 0x01, 0x23, 0x01, -0x79, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x04, 0x00, 0x89, 0x00, -0x8a, 0x00, 0x8b, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, -0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x9a, 0x00, -0x9b, 0x00, 0x9c, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, -0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0x39, 0x00, 0xad, 0x00, 0xae, 0x00, -0xaf, 0x00, 0x3d, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0x40, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x43, 0x00, 0xb7, 0x00, 0xb8, 0x00, -0xb9, 0x00, 0xba, 0x00, 0x48, 0x00, 0x49, 0x00, 0xbd, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc1, 0x00, 0xc2, 0x00, -0x50, 0x00, 0xc4, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, -0xcd, 0x00, 0x5b, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0x61, 0x00, 0x83, 0x00, 0x02, 0x00, -0x18, 0x00, 0x85, 0x00, 0x86, 0x00, 0x2c, 0x01, 0x2d, 0x01, 0x87, 0x00, 0x2e, 0x01, 0x02, 0x00, 0x2f, 0x01, 0xd8, 0x00, -0x02, 0x00, 0xd9, 0x00, 0x69, 0x00, 0x30, 0x01, 0x31, 0x01, 0xdc, 0x00, 0x02, 0x00, 0xdd, 0x00, 0x69, 0x00, 0x6a, 0x00, -0x02, 0x00, 0xde, 0x00, 0x69, 0x00, 0x32, 0x01, 0xe2, 0x00, 0xe3, 0x00, 0x02, 0x00, 0x33, 0x01, 0x34, 0x01, 0x69, 0x00, -0x6a, 0x00, 0x02, 0x00, 0xe8, 0x00, 0x69, 0x00, 0xe9, 0x00, 0xea, 0x00, 0xeb, 0x00, 0x02, 0x00, 0x35, 0x01, 0x69, 0x00, -0x6a, 0x00, 0x02, 0x00, 0xf1, 0x00, 0x69, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0xd9, 0x00, -0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0x36, 0x01, 0xfa, 0x00, 0xfb, 0x00, 0x69, 0x00, 0xcc, 0x02, -0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x22, 0x01, 0x23, 0x01, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, -0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x03, 0x01, -0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x37, 0x01, 0x38, 0x01, 0x66, 0x00, 0x02, 0x00, 0x06, 0x01, 0x07, 0x01, -0x69, 0x00, 0x92, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x22, 0x01, 0x23, 0x01, 0x87, 0x00, 0x66, 0x00, 0x02, 0x00, -0x08, 0x01, 0x69, 0x00, 0x66, 0x0b, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x22, 0x01, 0x23, 0x01, 0x01, 0x00, 0x02, 0x00, -0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, -0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0a, 0x01, 0x0b, 0x01, 0x0f, 0x00, 0x0c, 0x01, -0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, -0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, -0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x2a, 0x00, 0x2b, 0x00, -0x2c, 0x00, 0x2d, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, -0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0x39, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0x3d, 0x00, 0xb1, 0x00, 0xb2, 0x00, -0x40, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x43, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0x48, 0x00, 0x49, 0x00, -0xbd, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0x50, 0x00, 0xc4, 0x00, 0x52, 0x00, 0x53, 0x00, -0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0x5b, 0x00, 0xcf, 0x00, 0xd0, 0x00, -0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0x61, 0x00, 0x24, 0x01, 0x62, 0x00, 0x25, 0x01, 0x26, 0x01, 0x66, 0x00, 0x02, 0x00, -0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x39, 0x01, 0x3a, 0x01, -0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x01, 0x44, 0x01, -0x45, 0x01, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4d, 0x01, 0x69, 0x00, -0x4c, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x41, 0x4d, 0xc4, 0x08, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x96, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, 0x00, 0x00, -0x00, 0x01, 0x10, 0x01, 0xcc, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xe6, 0x01, 0x00, 0x00, 0x01, 0x30, 0x01, 0x4e, 0x03, -0x00, 0x00, 0x01, 0x44, 0x01, 0xb2, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0xdc, 0x03, 0x00, 0x00, 0x01, 0x90, 0x00, 0xdc, -0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x16, 0x05, 0x00, 0x00, 0x02, 0x00, 0x01, 0x96, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, -0x16, 0x05, 0x00, 0x00, 0x02, 0x10, 0x01, 0xcc, 0x01, 0x00, 0x00, 0x02, 0x20, 0x01, 0x26, 0x06, 0x00, 0x00, 0x02, 0x30, -0x01, 0x4e, 0x03, 0x00, 0x00, 0x02, 0x44, 0x01, 0xb2, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x8a, 0x07, 0x00, 0x00, 0x02, -0x90, 0x00, 0x8a, 0x07, 0x00, 0x00, 0xea, 0x0d, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, -0x51, 0x01, 0x50, 0x01, 0x05, 0x00, 0x02, 0x00, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, -0x58, 0x01, 0x04, 0x00, 0x50, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x59, 0x01, 0x50, 0x01, 0x5a, 0x01, 0x02, 0x00, -0x5b, 0x01, 0x04, 0x00, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, -0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, -0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, -0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, -0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, -0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, -0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, -0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, 0x50, 0x01, -0xa6, 0x01, 0x02, 0x00, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, -0xac, 0x01, 0x04, 0x00, 0x50, 0x01, 0xad, 0x01, 0x02, 0x00, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, -0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0x92, 0x01, -0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0xba, 0x01, 0x02, 0x00, -0xbb, 0x01, 0xbc, 0x01, 0x04, 0x00, 0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, 0xbd, 0x01, 0x04, 0x00, 0x50, 0x01, 0xbe, 0x01, -0x02, 0x00, 0xae, 0x01, 0xbf, 0x01, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0xc0, 0x01, 0x02, 0x00, 0x69, 0x00, 0x50, 0x01, 0x6a, 0x16, -0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, -0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, -0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, -0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, -0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, -0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, -0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, -0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, -0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, 0x50, 0x01, 0xba, 0x01, 0x02, 0x00, 0xbb, 0x01, 0xbc, 0x01, 0x04, 0x00, -0x50, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, -0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0x04, 0x00, 0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, -0xbd, 0x01, 0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xa7, 0x01, 0x04, 0x00, 0x50, 0x01, 0xd0, 0x01, 0x02, 0x00, -0xae, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, 0x01, -0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xd9, 0x01, 0xe1, 0x01, 0xdc, 0x01, -0xe2, 0x01, 0xd9, 0x01, 0xe3, 0x01, 0xdc, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xd9, 0x01, 0xe8, 0x01, -0xe9, 0x01, 0xdc, 0x01, 0xe2, 0x01, 0xd9, 0x01, 0xea, 0x01, 0xdc, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xd9, 0x01, -0xee, 0x01, 0xdc, 0x01, 0xe2, 0x01, 0xd9, 0x01, 0xef, 0x01, 0xdc, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, -0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0xbc, 0x03, -0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0x05, 0x00, 0x02, 0x00, -0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x04, 0x00, 0x50, 0x01, 0x0d, 0x00, -0x0e, 0x00, 0x0f, 0x00, 0x59, 0x01, 0x50, 0x01, 0x5a, 0x01, 0x02, 0x00, 0x5b, 0x01, 0x04, 0x00, 0x50, 0x01, 0xfa, 0x01, -0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, 0xfb, 0x01, 0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xa8, 0x01, 0x04, 0x00, -0x50, 0x01, 0xfc, 0x01, 0x02, 0x00, 0xae, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0xec, 0x00, -0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, -0xbd, 0x01, 0x04, 0x00, 0x50, 0x01, 0xff, 0x01, 0x02, 0x00, 0xae, 0x01, 0x00, 0x02, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, -0x1a, 0x12, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0x05, 0x00, -0x02, 0x00, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x04, 0x00, 0x50, 0x01, -0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x59, 0x01, 0x50, 0x01, 0x5a, 0x01, 0x02, 0x00, 0x5b, 0x01, 0x04, 0x00, 0x50, 0x01, -0x01, 0x02, 0x02, 0x02, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, -0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, -0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, -0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, -0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, -0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, -0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, -0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, 0x50, 0x01, -0xa6, 0x01, 0x02, 0x00, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x04, 0x00, -0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xac, 0x01, 0x04, 0x00, 0x50, 0x01, 0xad, 0x01, 0x02, 0x00, 0xae, 0x01, 0xaf, 0x01, -0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, -0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, -0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0xea, 0x0d, 0x00, 0x00, 0x84, 0x00, -0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, 0x05, 0x00, 0x02, 0x00, 0x52, 0x01, 0x53, 0x01, -0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x04, 0x00, 0x50, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, -0x59, 0x01, 0x50, 0x01, 0x5a, 0x01, 0x02, 0x00, 0x5b, 0x01, 0x04, 0x00, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, 0x5d, 0x01, -0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, -0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, -0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, +0x33, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, +0x33, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, +0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x38, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, +0x20, 0x6f, 0x75, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, +0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, +0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, +0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, +0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, +0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, +0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x6f, 0x69, +0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x70, 0x76, +0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x31, +0x20, 0x7b, 0x00, 0x64, 0x65, 0x70, 0x74, 0x68, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x20, +0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, +0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, +0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, +0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, +0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, +0x69, 0x64, 0x28, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, +0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, +0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x34, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, +0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, +0x61, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x35, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, +0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x36, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, +0x61, 0x6f, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, +0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x38, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, +0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x39, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, +0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x30, 0x29, 0x5d, 0x5d, +0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, +0x63, 0x74, 0x75, 0x72, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x31, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x32, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, +0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, +0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, +0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, +0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, +0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, +0x72, 0x31, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, +0x31, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, +0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, +0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, +0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, +0x34, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, +0x20, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x00, 0x20, 0x20, +0x20, 0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, +0x30, 0x31, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x3e, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, +0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x20, 0x3d, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x2e, 0x79, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x31, 0x38, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, +0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x31, 0x37, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x36, 0x31, 0x38, +0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, +0x79, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, +0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x5f, 0x36, 0x31, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x31, 0x5d, +0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x36, 0x31, 0x38, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x38, 0x31, 0x30, 0x20, +0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x5f, 0x38, 0x31, +0x30, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, 0x20, +0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, +0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, +0x63, 0x69, 0x74, 0x79, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x33, 0x20, 0x5f, 0x38, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, +0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x33, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x38, 0x31, 0x34, 0x20, +0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, 0x74, 0x79, +0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x3d, 0x20, +0x5f, 0x38, 0x32, 0x34, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, +0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, +0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, +0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, +0x2c, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, +0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, +0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, +0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, +0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, +0x69, 0x78, 0x28, 0x5f, 0x38, 0x31, 0x34, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x38, 0x31, 0x34, 0x2e, 0x78, 0x2c, 0x20, 0x63, +0x6c, 0x61, 0x6d, 0x70, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x2c, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, +0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, +0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x29, 0x2c, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x38, 0x31, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, +0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, +0x39, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x2a, 0x20, 0x28, +0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, +0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x34, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, +0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x30, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, +0x74, 0x79, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, +0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, +0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, +0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, +0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, +0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, +0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x30, 0x20, 0x2d, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, +0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, +0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, +0x20, 0x5f, 0x37, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, +0x20, 0x5f, 0x38, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, +0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x38, 0x33, 0x33, 0x2e, 0x78, 0x79, 0x7a, +0x20, 0x2a, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x33, 0x33, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x38, +0x33, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, +0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, +0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x28, 0x5f, 0x38, 0x30, 0x35, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x5f, 0x31, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, +0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, +0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, +0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, +0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x61, +0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, +0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, +0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x69, 0x6e, 0x2e, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, +0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, +0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, +0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, +0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, +0x5b, 0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, +0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, +0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, +0x4e, 0x54, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, +0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, +0x70, 0x29, 0x20, 0x3f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x3a, 0x20, 0x32, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x20, 0x5b, 0x5b, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, +0x5d, 0x20, 0x5b, 0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, +0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, +0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, +0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x36, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, +0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x33, 0x20, 0x5f, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, +0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x36, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x39, 0x29, 0x29, 0x2e, 0x78, +0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x38, 0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, +0x30, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, +0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, +0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x36, 0x5d, 0x2e, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, +0x5f, 0x38, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, +0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x34, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x30, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x2e, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x2e, 0x79, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x2e, 0x7a, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x20, 0x3d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, +0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, +0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, +0x2a, 0x20, 0x5f, 0x39, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, +0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, +0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x31, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x28, 0x5f, 0x31, 0x30, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, +0x31, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x30, 0x35, 0x2e, 0x78, +0x2c, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, +0x30, 0x38, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, +0x31, 0x31, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, +0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, +0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, +0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x39, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x2c, 0x20, 0x31, 0x2e, +0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x39, 0x2c, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x37, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, +0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, +0x31, 0x31, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, +0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5b, 0x30, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, +0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, +0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x2e, 0x78, 0x79, +0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, +0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x29, 0x29, 0x2e, +0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x2e, 0x79, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x2e, 0x7a, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, +0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, +0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, +0x2a, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x2e, 0x7a, 0x20, +0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x33, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, +0x2a, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x33, 0x35, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x35, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x32, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, +0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, +0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x35, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x69, 0x6e, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x66, +0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, +0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x38, 0x31, +0x31, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, +0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, +0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, +0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, +0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x28, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x2e, 0x78, +0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, +0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, +0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, +0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x31, 0x31, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, +0x38, 0x31, 0x31, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, +0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, +0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, +0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, +0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x30, 0x30, 0x20, +0x3d, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x5f, +0x36, 0x35, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, +0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x30, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, +0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, +0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x66, +0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, +0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, +0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, +0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, +0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x66, 0x61, +0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, +0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x35, +0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x35, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, +0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x2a, 0x20, +0x5f, 0x34, 0x35, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, +0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, +0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, +0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x20, +0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x34, +0x32, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, +0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x32, 0x31, 0x39, 0x5d, +0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, +0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x34, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x37, 0x34, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x37, 0x34, 0x2e, 0x79, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x37, 0x34, 0x2e, +0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x5f, 0x34, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x32, 0x31, 0x39, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, +0x2a, 0x20, 0x5f, 0x34, 0x37, 0x34, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x30, 0x2e, 0x7a, 0x20, +0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x34, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, +0x2a, 0x20, 0x5f, 0x34, 0x32, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x34, 0x32, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, +0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x35, +0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x32, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, +0x2f, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, +0x36, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x35, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x2e, +0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, +0x66, 0x6d, 0x61, 0x28, 0x5f, 0x32, 0x34, 0x35, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x38, 0x2c, 0x20, 0x66, 0x6d, +0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x34, 0x2c, 0x20, +0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x35, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x37, +0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x20, +0x3d, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x38, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x39, +0x34, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x39, 0x34, +0x2c, 0x20, 0x5f, 0x32, 0x36, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x2c, 0x20, +0x5f, 0x32, 0x38, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, +0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, +0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x39, 0x34, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x35, +0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x2c, 0x20, +0x5f, 0x32, 0x38, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x32, 0x31, 0x39, 0x3b, 0x00, 0x4c, 0x53, 0x4c, 0x47, 0x5f, 0x54, 0x41, 0x4d, 0xe6, 0x08, 0x00, 0x00, 0x12, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x9c, 0x01, 0x00, 0x00, +0x01, 0x10, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xd6, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xea, 0x01, 0x00, +0x00, 0x01, 0x30, 0x01, 0x34, 0x03, 0x00, 0x00, 0x01, 0x44, 0x01, 0x76, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x8e, 0x03, +0x00, 0x00, 0x01, 0x90, 0x00, 0x8e, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0xc2, 0x04, 0x00, 0x00, 0x02, 0x00, 0x01, 0xda, +0x05, 0x00, 0x00, 0x02, 0x10, 0x00, 0xc2, 0x04, 0x00, 0x00, 0x02, 0x10, 0x01, 0x12, 0x06, 0x00, 0x00, 0x02, 0x20, 0x01, +0x24, 0x06, 0x00, 0x00, 0x02, 0x30, 0x01, 0x5c, 0x07, 0x00, 0x00, 0x02, 0x44, 0x01, 0x9c, 0x07, 0x00, 0x00, 0x02, 0x80, +0x00, 0xb2, 0x07, 0x00, 0x00, 0x02, 0x90, 0x00, 0xb2, 0x07, 0x00, 0x00, 0x60, 0x0a, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, +0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, +0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, +0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, +0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, +0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, +0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, +0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, +0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, +0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, +0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, +0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, +0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, +0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x69, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, +0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x02, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, +0x04, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x02, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, +0x66, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x69, 0x00, 0x51, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, +0x7e, 0x00, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0xaf, 0x0c, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, +0x7e, 0x00, 0x7f, 0x00, 0x02, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x04, 0x00, +0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x17, 0x00, 0x02, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, +0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, +0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, +0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, +0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, +0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, +0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, +0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x61, 0x00, 0x89, 0x00, +0x02, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0xda, 0x00, 0xdb, 0x00, 0x8d, 0x00, 0xdc, 0x00, 0x02, 0x00, 0xdd, 0x00, +0xde, 0x00, 0x02, 0x00, 0xdf, 0x00, 0x69, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x00, 0x69, 0x00, +0x6a, 0x00, 0x02, 0x00, 0xe4, 0x00, 0x69, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, 0x00, 0x02, 0x00, +0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xee, 0x00, 0x69, 0x00, 0xef, 0x00, +0xf0, 0x00, 0xf1, 0x00, 0x02, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0x69, 0x00, 0x6a, 0x00, +0x02, 0x00, 0xf7, 0x00, 0x69, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xdf, 0x00, +0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x69, 0x00, 0xec, 0x02, +0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x05, 0x00, 0x02, 0x00, 0x03, 0x01, 0x04, 0x01, +0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, +0x0a, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x0b, 0x01, 0x0c, 0x01, 0x66, 0x00, 0x02, 0x00, 0x0d, 0x01, +0x0e, 0x01, 0x69, 0x00, 0x91, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x8d, 0x00, +0x66, 0x00, 0x02, 0x00, 0x0f, 0x01, 0x69, 0x00, 0x10, 0x0d, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, +0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, +0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x01, 0x12, 0x01, +0x0f, 0x00, 0x13, 0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, +0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, +0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, +0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, +0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, +0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, +0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, +0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, +0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x63, 0x00, 0x62, 0x00, 0x64, 0x00, 0x65, 0x00, +0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, +0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, +0x1e, 0x01, 0x1f, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x26, 0x01, 0x27, 0x01, +0x28, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x2e, 0x01, 0x69, 0x00, 0xa0, 0x09, 0x00, 0x00, +0x88, 0x00, 0x00, 0x00, 0x2f, 0x01, 0x30, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, +0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, +0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, +0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, +0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, +0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, +0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0x39, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x3d, 0x00, +0xb7, 0x00, 0xb8, 0x00, 0x40, 0x00, 0xba, 0x00, 0xbb, 0x00, 0x43, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, +0x48, 0x00, 0x49, 0x00, 0xc3, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x50, 0x00, 0xca, 0x00, +0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0x5b, 0x00, +0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x61, 0x00, 0x62, 0x00, 0x31, 0x01, 0x32, 0x01, 0x33, 0x01, +0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, +0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, +0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x3e, 0x01, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x69, 0x00, 0x06, 0x02, 0x00, 0x00, +0x18, 0x00, 0x00, 0x00, 0x2f, 0x01, 0x30, 0x01, 0x7f, 0x00, 0x02, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, +0x84, 0x00, 0x85, 0x00, 0x04, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x02, 0x00, 0x18, 0x00, 0x8b, 0x00, +0x8c, 0x00, 0x8d, 0x00, 0x66, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x69, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, +0x2f, 0x01, 0x30, 0x01, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0xd3, 0x0a, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x2f, 0x01, +0x30, 0x01, 0x7f, 0x00, 0x02, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x04, 0x00, +0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, +0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, +0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, +0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0x39, 0x00, 0xb3, 0x00, +0xb4, 0x00, 0xb5, 0x00, 0x3d, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0x40, 0x00, 0xba, 0x00, 0xbb, 0x00, 0x43, 0x00, 0xbd, 0x00, +0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc3, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc7, 0x00, +0xc8, 0x00, 0x50, 0x00, 0xca, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xd0, 0x00, 0xd1, 0x00, +0xd2, 0x00, 0xd3, 0x00, 0x5b, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x61, 0x00, 0x89, 0x00, +0x02, 0x00, 0x18, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x3f, 0x01, 0x40, 0x01, 0x8d, 0x00, 0x41, 0x01, 0x02, 0x00, 0x42, 0x01, +0xde, 0x00, 0x02, 0x00, 0xdf, 0x00, 0x69, 0x00, 0x43, 0x01, 0x44, 0x01, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x00, 0x69, 0x00, +0x6a, 0x00, 0x02, 0x00, 0xe4, 0x00, 0x69, 0x00, 0x45, 0x01, 0xe8, 0x00, 0xe9, 0x00, 0x02, 0x00, 0x46, 0x01, 0x47, 0x01, +0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xee, 0x00, 0x69, 0x00, 0xef, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x02, 0x00, 0x48, 0x01, +0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xf7, 0x00, 0x69, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfc, 0x00, +0xfd, 0x00, 0xdf, 0x00, 0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x49, 0x01, 0x01, 0x01, 0x02, 0x01, +0x69, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2f, 0x01, 0x30, 0x01, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, +0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x10, 0x00, 0x0a, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x4a, 0x01, 0x4b, 0x01, 0x66, 0x00, 0x02, 0x00, +0x0d, 0x01, 0x0e, 0x01, 0x69, 0x00, 0x92, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x2f, 0x01, 0x30, 0x01, 0x8d, 0x00, +0x66, 0x00, 0x02, 0x00, 0x0f, 0x01, 0x69, 0x00, 0x32, 0x0c, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x2f, 0x01, 0x30, 0x01, +0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, +0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x01, 0x12, 0x01, +0x0f, 0x00, 0x13, 0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, +0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, +0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, +0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, +0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0x39, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x3d, 0x00, +0xb7, 0x00, 0xb8, 0x00, 0x40, 0x00, 0xba, 0x00, 0xbb, 0x00, 0x43, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, +0x48, 0x00, 0x49, 0x00, 0xc3, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x50, 0x00, 0xca, 0x00, +0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0x5b, 0x00, +0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x61, 0x00, 0x31, 0x01, 0x62, 0x00, 0x32, 0x01, 0x33, 0x01, +0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, +0x4c, 0x01, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, +0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, +0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x69, 0x00, 0x4c, 0x54, 0x45, 0x4d, +0x5f, 0x54, 0x41, 0x4d, 0xf4, 0x08, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, +0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xa2, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, +0xd8, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xf2, 0x01, 0x00, 0x00, 0x01, 0x30, 0x01, 0x5a, 0x03, 0x00, 0x00, 0x01, 0x44, +0x01, 0xbe, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x01, 0x90, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x02, +0x00, 0x00, 0x2e, 0x05, 0x00, 0x00, 0x02, 0x00, 0x01, 0xa2, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x2e, 0x05, 0x00, 0x00, +0x02, 0x10, 0x01, 0xd8, 0x01, 0x00, 0x00, 0x02, 0x20, 0x01, 0x4a, 0x06, 0x00, 0x00, 0x02, 0x30, 0x01, 0x5a, 0x03, 0x00, +0x00, 0x02, 0x44, 0x01, 0xbe, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0xae, 0x07, 0x00, 0x00, 0x02, 0x90, 0x00, 0xae, 0x07, +0x00, 0x00, 0xf8, 0x0e, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, +0x05, 0x00, 0x02, 0x00, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x04, 0x00, +0x69, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x72, 0x01, 0x69, 0x01, 0x73, 0x01, 0x02, 0x00, 0x74, 0x01, 0x04, 0x00, +0x69, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, +0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, +0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, +0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, +0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, +0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, +0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, +0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, +0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, 0xc5, 0x01, 0x04, 0x00, +0x69, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, +0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, +0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0x71, 0x01, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, +0x6a, 0x01, 0x69, 0x01, 0xd9, 0x01, 0x02, 0x00, 0xda, 0x01, 0xdb, 0x01, 0x04, 0x00, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, +0xdc, 0x01, 0x04, 0x00, 0x69, 0x01, 0xdd, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xde, 0x01, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, +0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, 0xdf, 0x01, +0x02, 0x00, 0x69, 0x00, 0x69, 0x01, 0x5d, 0x16, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, +0x6a, 0x01, 0x69, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, -0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, 0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, -0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xac, 0x01, 0x04, 0x00, 0x50, 0x01, 0xad, 0x01, 0x02, 0x00, 0xae, 0x01, -0xaf, 0x01, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0xb7, 0x01, 0xb8, 0x01, -0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, 0x12, 0x16, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, -0x51, 0x01, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, -0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, -0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, +0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, +0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, +0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, 0x69, 0x01, 0xd9, 0x01, +0x02, 0x00, 0xda, 0x01, 0xdb, 0x01, 0x04, 0x00, 0x69, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, +0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, +0x04, 0x00, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xdc, 0x01, 0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, 0xc0, 0x01, +0x04, 0x00, 0x69, 0x01, 0xef, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xde, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, +0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, +0xf6, 0x01, 0xfe, 0x01, 0xf9, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x00, 0x02, 0xf9, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, +0x04, 0x02, 0x05, 0x02, 0xf6, 0x01, 0x06, 0x02, 0x07, 0x02, 0xf9, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x08, 0x02, 0xf9, 0x01, +0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0xf6, 0x01, 0x0c, 0x02, 0xf9, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x0d, 0x02, 0xf9, 0x01, +0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, +0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0xbc, 0x03, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, +0x6a, 0x01, 0x69, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, +0x71, 0x01, 0x04, 0x00, 0x69, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x72, 0x01, 0x69, 0x01, 0x73, 0x01, 0x02, 0x00, +0x74, 0x01, 0x04, 0x00, 0x69, 0x01, 0x18, 0x02, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0x19, 0x02, 0x04, 0x00, 0x69, 0x01, +0xc4, 0x01, 0x02, 0x00, 0xc1, 0x01, 0x04, 0x00, 0x69, 0x01, 0x1a, 0x02, 0x02, 0x00, 0xc7, 0x01, 0x1b, 0x02, 0x1c, 0x02, +0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0xec, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, +0x6a, 0x01, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xdc, 0x01, 0x04, 0x00, 0x69, 0x01, 0x1d, 0x02, 0x02, 0x00, 0xc7, 0x01, +0x1e, 0x02, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0x22, 0x13, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, +0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, +0x70, 0x01, 0x71, 0x01, 0x04, 0x00, 0x69, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x72, 0x01, 0x69, 0x01, 0x73, 0x01, +0x02, 0x00, 0x74, 0x01, 0x04, 0x00, 0x69, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, +0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, +0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, +0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, +0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, +0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, +0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, +0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, +0x69, 0x01, 0x1f, 0x02, 0x20, 0x02, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, +0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, 0xc5, 0x01, 0x04, 0x00, 0x69, 0x01, +0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xc8, 0x01, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, +0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, +0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x3d, 0x02, +0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0xf8, 0x0e, 0x00, 0x00, 0x8a, 0x00, +0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6b, 0x01, 0x6c, 0x01, +0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x04, 0x00, 0x69, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x72, 0x01, 0x69, 0x01, 0x73, 0x01, 0x02, 0x00, 0x74, 0x01, 0x04, 0x00, 0x69, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, -0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, 0x50, 0x01, 0xba, 0x01, -0x02, 0x00, 0xbb, 0x01, 0xbc, 0x01, 0x04, 0x00, 0x50, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, -0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, -0x04, 0x00, 0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, 0xbd, 0x01, 0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xa7, 0x01, -0x04, 0x00, 0x50, 0x01, 0xd0, 0x01, 0x02, 0x00, 0xae, 0x01, 0xbf, 0x01, 0xd3, 0x01, 0x25, 0x02, 0x26, 0x02, 0xd5, 0x01, -0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, 0x01, 0x27, 0x02, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, -0xe0, 0x01, 0xd9, 0x01, 0xe1, 0x01, 0xdc, 0x01, 0xe2, 0x01, 0xd9, 0x01, 0xe3, 0x01, 0xdc, 0x01, 0x28, 0x02, 0x29, 0x02, -0xe7, 0x01, 0xd9, 0x01, 0x2a, 0x02, 0x2b, 0x02, 0xdc, 0x01, 0xe2, 0x01, 0xd9, 0x01, 0x2c, 0x02, 0xdc, 0x01, 0x2d, 0x02, -0x2e, 0x02, 0xed, 0x01, 0xd9, 0x01, 0x2f, 0x02, 0xdc, 0x01, 0xe2, 0x01, 0xd9, 0x01, 0xef, 0x01, 0xdc, 0x01, 0x30, 0x02, -0x31, 0x02, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0x32, 0x02, 0xb9, 0x01, 0x69, 0x00, -0x50, 0x01, 0x3b, 0x12, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x50, 0x01, -0x05, 0x00, 0x02, 0x00, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x04, 0x00, -0x50, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x59, 0x01, 0x50, 0x01, 0x5a, 0x01, 0x02, 0x00, 0x5b, 0x01, 0x04, 0x00, -0x50, 0x01, 0x01, 0x02, 0x02, 0x02, 0x50, 0x01, 0x5c, 0x01, 0x02, 0x00, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, -0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, -0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, -0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, -0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, -0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, -0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, -0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x04, 0x00, -0x50, 0x01, 0xa6, 0x01, 0x02, 0x00, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, -0x04, 0x00, 0x50, 0x01, 0xab, 0x01, 0x02, 0x00, 0xac, 0x01, 0x04, 0x00, 0x50, 0x01, 0xad, 0x01, 0x02, 0x00, 0xae, 0x01, -0xaf, 0x01, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, -0x3c, 0x02, 0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, -0x46, 0x02, 0x47, 0x02, 0x48, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0xb9, 0x01, 0x69, 0x00, 0x50, 0x01, - +0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, +0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, +0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, +0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, +0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, 0xc5, 0x01, 0x04, 0x00, 0x69, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, +0xc8, 0x01, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x47, 0x02, 0x48, 0x02, 0x49, 0x02, 0x4a, 0x02, +0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x02, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0xfc, 0x15, +0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, 0x75, 0x01, 0x02, 0x00, +0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, +0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, +0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, +0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, +0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, +0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, +0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, +0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, 0x69, 0x01, 0xd9, 0x01, 0x02, 0x00, 0xda, 0x01, 0xdb, 0x01, 0x04, 0x00, +0x69, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, +0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0x04, 0x00, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, +0xdc, 0x01, 0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, 0xc0, 0x01, 0x04, 0x00, 0x69, 0x01, 0xef, 0x01, 0x02, 0x00, +0xc7, 0x01, 0xde, 0x01, 0xf0, 0x01, 0x4f, 0x02, 0x50, 0x02, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, +0x51, 0x02, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xf6, 0x01, 0xfe, 0x01, 0xf9, 0x01, +0xff, 0x01, 0xf6, 0x01, 0x00, 0x02, 0xf9, 0x01, 0x52, 0x02, 0x53, 0x02, 0x05, 0x02, 0xf6, 0x01, 0x54, 0x02, 0x55, 0x02, +0xf9, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x56, 0x02, 0xf9, 0x01, 0x57, 0x02, 0x58, 0x02, 0x0b, 0x02, 0xf6, 0x01, 0x59, 0x02, +0xf9, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x0d, 0x02, 0xf9, 0x01, 0x5a, 0x02, 0x5b, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, +0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x5c, 0x02, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0x3b, 0x13, 0x00, 0x00, 0x9f, 0x00, +0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6b, 0x01, 0x6c, 0x01, +0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x04, 0x00, 0x69, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x72, 0x01, 0x69, 0x01, 0x73, 0x01, 0x02, 0x00, 0x74, 0x01, 0x04, 0x00, 0x69, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, +0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, +0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, +0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, +0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, +0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, +0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, +0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, +0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, 0x69, 0x01, 0x1f, 0x02, 0x20, 0x02, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xc0, 0x01, +0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, +0xc5, 0x01, 0x04, 0x00, 0x69, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xc8, 0x01, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, +0x60, 0x02, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, 0x68, 0x02, 0x69, 0x02, +0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x70, 0x02, 0x71, 0x02, 0x72, 0x02, 0x73, 0x02, +0x74, 0x02, 0x75, 0x02, 0x76, 0x02, 0x77, 0x02, 0x78, 0x02, 0x40, 0x02, 0x41, 0x02, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, }; int GIZMO_GIZMO_OFFSET = 0; -int GIZMO_GIZMO_SIZE = 26876; +int GIZMO_GIZMO_SIZE = 28800; diff --git a/thermion_dart/native/include/material/image.c b/thermion_dart/native/include/material/image.c index 1acba238..81f2f959 100644 --- a/thermion_dart/native/include/material/image.c +++ b/thermion_dart/native/include/material/image.c @@ -1,5 +1,6 @@ -#include #include "image.h" +#include + const uint8_t IMAGE_PACKAGE[] = { // IMAGE 0x53, 0x52, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x54, 0x41, 0x45, 0x46, diff --git a/thermion_dart/native/src/Gizmo.cpp b/thermion_dart/native/src/Gizmo.cpp index 75386f30..d339deab 100644 --- a/thermion_dart/native/src/Gizmo.cpp +++ b/thermion_dart/native/src/Gizmo.cpp @@ -45,8 +45,9 @@ Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) // First, create the black cube at the center // The axes widgets will be parented to this entity _entities[3] = entityManager.create(); + _materialInstances[3] = _material->createInstance(); - _materialInstances[3]->setParameter("color", math::float3{0.0f, 0.0f, 0.0f}); // Black color + _materialInstances[3]->setParameter("color", math::float4{0.0f, 0.0f, 0.0f, 1.0f}); // Black color // Create center cube vertices float centerCubeSize = 0.05f; @@ -89,7 +90,7 @@ Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) {centerCubeSize, centerCubeSize, centerCubeSize}}) .material(0, _materialInstances[3]) .layerMask(0xFF, 2) - .priority(7) + .priority(6) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, centerCubeVb, centerCubeIb, 0, 36) .culling(false) .build(engine, _entities[3]); @@ -197,21 +198,21 @@ Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) transformManager.setParent(instance, cubeTransformInstance); } - - _scene->addEntities(_entities,4); + createTransparentRectangles(); + _view->setLayerEnabled(0, true); // scene assets _view->setLayerEnabled(1, true); // gizmo _view->setLayerEnabled(2, true); // world grid } Gizmo::~Gizmo() { - _scene->removeEntities(_entities, 4); - for(int i = 0; i < 4; i++) { + _scene->removeEntities(_entities, 7); + for(int i = 0; i < 7; i++) { _engine.destroy(_materialInstances[i]); } _engine.destroy(_material); - for(int i = 0; i < 4; i++) { + for(int i = 0; i < 7; i++) { _engine.destroy(_entities[i]); } @@ -221,6 +222,95 @@ Gizmo::~Gizmo() { } +void Gizmo::createTransparentRectangles() +{ + auto &entityManager = EntityManager::get(); + auto &transformManager = _engine.getTransformManager(); + + float volumeWidth = 0.2f; + float volumeLength = 1.2f; + float volumeDepth = 0.2f; + + float *volumeVertices = new float[8 * 3]{ + -volumeWidth / 2, -volumeDepth / 2, 0, + volumeWidth / 2, -volumeDepth / 2, 0, + volumeWidth / 2, -volumeDepth / 2, volumeLength, + -volumeWidth / 2, -volumeDepth / 2, volumeLength, + -volumeWidth / 2, volumeDepth / 2, 0, + volumeWidth / 2, volumeDepth / 2, 0, + volumeWidth / 2, volumeDepth / 2, volumeLength, + -volumeWidth / 2, volumeDepth / 2, volumeLength + }; + + uint16_t *volumeIndices = new uint16_t[36]{ + 0, 1, 2, 2, 3, 0, // Bottom face + 4, 5, 6, 6, 7, 4, // Top face + 0, 4, 7, 7, 3, 0, // Left face + 1, 5, 6, 6, 2, 1, // Right face + 0, 1, 5, 5, 4, 0, // Front face + 3, 2, 6, 6, 7, 3 // Back face + }; + + auto volumeVb = VertexBuffer::Builder() + .vertexCount(8) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) + .build(_engine); + + volumeVb->setBufferAt(_engine, 0, VertexBuffer::BufferDescriptor( + volumeVertices, 8 * sizeof(filament::math::float3), + [](void *buffer, size_t size, void *) { delete[] static_cast(buffer); } + )); + + auto volumeIb = IndexBuffer::Builder() + .indexCount(36) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(_engine); + + volumeIb->setBuffer(_engine, IndexBuffer::BufferDescriptor( + volumeIndices, 36 * sizeof(uint16_t), + [](void *buffer, size_t size, void *) { delete[] static_cast(buffer); } + )); + + for (int i = 4; i < 7; i++) + { + _entities[i] = entityManager.create(); + _materialInstances[i] = _material->createInstance(); + + _materialInstances[i]->setParameter("color", math::float4{0.0f, 0.0f, 0.0f, 0.0f}); + + math::mat4f transform; + switch (i-4) + { + case Axis::X: + transform = math::mat4f::rotation(math::F_PI_2, math::float3{0, 1, 0}); + break; + case Axis::Y: + transform = math::mat4f::rotation(-math::F_PI_2, math::float3{1, 0, 0}); + break; + case Axis::Z: + break; + } + + RenderableManager::Builder(1) + .boundingBox({{-volumeWidth / 2, -volumeDepth / 2, 0}, {volumeWidth / 2, volumeDepth / 2, volumeLength}}) + .material(0, _materialInstances[i]) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, volumeVb, volumeIb, 0, 36) + .priority(7) + .layerMask(0xFF, 2) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .build(_engine, _entities[i]); + + auto instance = transformManager.getInstance(_entities[i]); + transformManager.setTransform(instance, transform); + + // Parent the picking volume to the center cube + transformManager.setParent(instance, transformManager.getInstance(_entities[3])); + } +} + void Gizmo::highlight(Entity entity) { auto &rm = _engine.getRenderableManager(); auto renderableInstance = rm.getInstance(entity); @@ -270,73 +360,37 @@ void Gizmo::destroy() } -void Gizmo::updateTransform() -{ - return; - // auto & transformManager = _engine.getTransformManager(); - // auto transformInstance = transformManager.getInstance(_entities[3]); - - // if(!transformInstance.isValid()) { - // Log("No valid gizmo transform"); - // return; - // } - - // auto worldTransform = transformManager.getWorldTransform(transformInstance); - // math::float4 worldPosition { 0.0f, 0.0f, 0.0f, 1.0f }; - // worldPosition = worldTransform * worldPosition; - - // // Calculate distance - // float distance = length(worldPosition.xyz - camera.getPosition()); - - // const float desiredScreenSize = 3.0f; // Desired height in pixels - // const float baseSize = 0.1f; // Base size in world units - - // // Get the vertical field of view of the camera (assuming it's in radians) - // float fovY = camera.getFieldOfViewInDegrees(filament::Camera::Fov::VERTICAL); - - // // Calculate the scale needed to maintain the desired screen size - // float newScale = (2.0f * distance * tan(fovY * 0.5f) * desiredScreenSize) / (baseSize * vp.height); - - // if(std::isnan(newScale)) { - // newScale = 1.0f; - // } - - // // Log("Distance %f, newscale %f", distance, newScale); - - // auto localTransform = transformManager.getTransform(transformInstance); - - // // Apply scale to gizmo - // math::float3 translation; - // math::quatf rotation; - // math::float3 scale; - - // decomposeMatrix(localTransform, &translation, &rotation, &scale); - - // scale = math::float3 { newScale, newScale, newScale }; - - // auto scaledTransform = composeMatrix(translation, rotation, scale); - - // transformManager.setTransform(transformInstance, scaledTransform); - - // auto viewSpacePos = camera.getViewMatrix() * worldPosition; - // math::float4 entityScreenPos = camera.getProjectionMatrix() * viewSpacePos; - // entityScreenPos /= entityScreenPos.w; - // float screenX = (entityScreenPos.x * 0.5f + 0.5f) * vp.width; - // float screenY = (entityScreenPos.y * 0.5f + 0.5f) * vp.height; -} - void Gizmo::pick(uint32_t x, uint32_t y, void (*callback)(EntityId entityId, int x, int y)) { auto * gizmo = this; _view->pick(x, y, [=](filament::View::PickingQueryResult const &result) { - if(result.renderable == gizmo->x() || result.renderable == gizmo->y() || result.renderable == gizmo->z()) { - gizmo->highlight(result.renderable); - callback(Entity::smuggle(result.renderable), x, y); - } else { + for(int i = 4; i < 7; i++) { + if(_entities[i] == result.renderable) { + gizmo->highlight(_entities[i - 4]); + callback(Entity::smuggle(_entities[i - 4]), x, y); + return; + } + } gizmo->unhighlight(); - } + callback(0, x, y); }); } +bool Gizmo::isGizmoEntity(Entity e) { + for(int i = 0; i < 7; i++) { + if(e == _entities[i]) { + return true; + } + } + return false; +} + +void Gizmo::setVisibility(bool visible) { + if(visible) { + _scene->addEntities(_entities, 7); + } else { + _scene->removeEntities(_entities, 7); + } +} +} -} \ No newline at end of file From 78dcbc8bb9e666b1896b7f44747ebe5d103d8e70 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:45:49 +0800 Subject: [PATCH 035/232] feat: expose API methods for create_ibl, pick/set gizmo visibility --- thermion_dart/native/include/ThermionDartApi.h | 3 +++ thermion_dart/native/src/ThermionDartApi.cpp | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 6eee3eb3..ee03a5a8 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -69,6 +69,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_bloom(const void *const viewer, float strength); EMSCRIPTEN_KEEPALIVE void load_skybox(const void *const viewer, const char *skyboxPath); EMSCRIPTEN_KEEPALIVE void load_ibl(const void *const viewer, const char *iblPath, float intensity); + EMSCRIPTEN_KEEPALIVE void create_ibl(const void *const viewer, float r, float g, float b, float intensity); EMSCRIPTEN_KEEPALIVE void rotate_ibl(const void *const viewer, float *rotationMatrix); EMSCRIPTEN_KEEPALIVE void remove_skybox(const void *const viewer); EMSCRIPTEN_KEEPALIVE void remove_ibl(const void *const viewer); @@ -254,6 +255,8 @@ extern "C" EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float* minX, float* minY, float* maxX, float* maxY); EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled); + EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)); + EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible); #ifdef __cplusplus } diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index d65648d8..d1befdb8 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -69,7 +69,6 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_bloom(const void *const viewer, float strength) { - Log("Setting bloom to %f", strength); ((FilamentViewer *)viewer)->setBloom(strength); } @@ -78,6 +77,10 @@ extern "C" ((FilamentViewer *)viewer)->loadSkybox(skyboxPath); } + EMSCRIPTEN_KEEPALIVE void create_ibl(const void *const viewer, float r, float g, float b, float intensity) { + ((FilamentViewer*)viewer)->createIbl(r, g, b, intensity); + } + EMSCRIPTEN_KEEPALIVE void load_ibl(const void *const viewer, const char *iblPath, float intensity) { ((FilamentViewer *)viewer)->loadIbl(iblPath, intensity); @@ -870,6 +873,19 @@ extern "C" ((SceneManager*)sceneManager)->setLayerEnabled(layer, enabled); } + EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void* ptr) { + free(ptr); + } + + EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)) { + ((SceneManager*)sceneManager)->gizmo->pick(x, y, callback); + } + + EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible) { + ((SceneManager*)sceneManager)->gizmo->setVisibility(visible); + } + + } From 375e1cc887f24cbfc7872508f98b975bab21c391 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:46:21 +0800 Subject: [PATCH 036/232] fix: add more nan checks for gizmo manipulation --- thermion_dart/native/src/SceneManager.cpp | 265 ++++++++++++---------- 1 file changed, 146 insertions(+), 119 deletions(-) diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index e33096c6..55d2fef0 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -92,14 +92,14 @@ namespace thermion_filament _collisionComponentManager = new CollisionComponentManager(tm); _animationComponentManager = new AnimationComponentManager(tm, _engine->getRenderableManager()); - gizmo = new Gizmo(*_engine); + gizmo = new Gizmo(*_engine, _view, _scene); _gridOverlay = new GridOverlay(*_engine); - + _scene->addEntity(_gridOverlay->sphere()); _scene->addEntity(_gridOverlay->grid()); - _view->setLayerEnabled(0, true); // scene assets - _view->setLayerEnabled(1, true); // gizmo + _view->setLayerEnabled(0, true); // scene assets + _view->setLayerEnabled(1, true); // gizmo _view->setLayerEnabled(2, false); // world grid } @@ -1539,6 +1539,18 @@ namespace thermion_filament const auto &parentInstance = tm.getInstance(parent); const auto &childInstance = tm.getInstance(child); + if(!parentInstance.isValid()) { + Log("Parent instance is not valid"); + return; + } + + if(!childInstance.isValid()) { + Log("Child instance is not valid"); + return; + } + + Log("Parenting child entity %d to new parent entity %d", childEntityId, parentEntityId); + if (preserveScaling) { auto parentTransform = tm.getWorldTransform(parentInstance); @@ -1562,7 +1574,6 @@ namespace thermion_filament tm.setTransform(childInstance, childTransform); } - // auto scale = childInstance. tm.setParent(childInstance, parentInstance); } @@ -1729,7 +1740,6 @@ namespace thermion_filament tm.setTransform(transformInstance, transform); } _transformUpdates.clear(); - gizmo->updateTransform(_view->getCamera(), _view->getViewport()); } void SceneManager::setScale(EntityId entityId, float newScale) @@ -1803,14 +1813,11 @@ namespace thermion_filament tm.setTransform(transformInstance, newTransform); } - - // Log("view matrix %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", - // viewMatrix[0][0], viewMatrix[0][1], viewMatrix[0][2], viewMatrix[0][3], - // viewMatrix[1][0], viewMatrix[1][1], viewMatrix[1][2], viewMatrix[1][3], - // viewMatrix[2][0], viewMatrix[2][1], viewMatrix[2][2], viewMatrix[2][3], - // viewMatrix[3][0], viewMatrix[3][1], viewMatrix[3][2], viewMatrix[3][3]); - - + // Log("view matrix %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", + // viewMatrix[0][0], viewMatrix[0][1], viewMatrix[0][2], viewMatrix[0][3], + // viewMatrix[1][0], viewMatrix[1][1], viewMatrix[1][2], viewMatrix[1][3], + // viewMatrix[2][0], viewMatrix[2][1], viewMatrix[2][2], viewMatrix[2][3], + // viewMatrix[3][0], viewMatrix[3][1], viewMatrix[3][2], viewMatrix[3][3]); // math::float4 worldspace = { 250.0f, 0.0f, 0.0f, 1.0f }; // math::float4 viewSpace = viewMatrix * worldspace; @@ -1823,9 +1830,9 @@ namespace thermion_filament // Log("ndc %f %f %f %f", ndc.x, ndc.y, ndc.z, ndc.w); // ndc.x = -1.0; - + // // Multiply by inverse view-projection matrix - // auto inverseProj = inverse(camera.getProjectionMatrix()); + // auto inverseProj = inverse(camera.getProjectionMatrix()); // clipSpace = inverseProj * math::float4 { ndc.x, ndc.y, ndc.z, 1.0f }; // viewSpace = clipSpace / clipSpace.w; // Log("clip space %f %f %f %f", viewSpace.x, viewSpace.y, viewSpace.z, viewSpace.w); @@ -1836,116 +1843,136 @@ namespace thermion_filament // return; - - // Log("viewMatrixRotation %f %f %f %f %f %f %f %f %f", - // viewMatrixRotation[0][0], viewMatrixRotation[0][1], viewMatrixRotation[0][2], - // viewMatrixRotation[1][0], viewMatrixRotation[1][1], viewMatrixRotation[1][2], - // viewMatrixRotation[2][0], viewMatrixRotation[2][1], viewMatrixRotation[2][2]); + // Log("viewMatrixRotation %f %f %f %f %f %f %f %f %f", + // viewMatrixRotation[0][0], viewMatrixRotation[0][1], viewMatrixRotation[0][2], + // viewMatrixRotation[1][0], viewMatrixRotation[1][1], viewMatrixRotation[1][2], + // viewMatrixRotation[2][0], viewMatrixRotation[2][1], viewMatrixRotation[2][2]); - void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z) +void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z) +{ + auto worldAxis = math::float3{x, y, z}; + + // Get the camera + const auto &camera = _view->getCamera(); + const auto &vp = _view->getViewport(); + auto viewMatrix = camera.getViewMatrix(); + + math::float3 cameraPosition = camera.getPosition(); + math::float3 cameraForward = -viewMatrix.upperLeft()[2]; + + // Scale the viewport movement to NDC coordinates view axis + math::float2 viewportMovementNDC(viewportCoordX / (vp.width / 2), viewportCoordY / (vp.height / 2)); + + // calculate the translation axis in view space + math::float3 viewSpaceAxis = viewMatrix.upperLeft() * worldAxis; + + // Apply projection matrix to get clip space axis + math::float4 clipAxis = camera.getProjectionMatrix() * math::float4(viewSpaceAxis, 0.0f); + + // Perform perspective division to get the translation axis in normalized device coordinates (NDC) + math::float2 ndcAxis = (clipAxis.xyz / clipAxis.w).xy; + + const float epsilon = 1e-6f; + bool isAligned = false; + if (std::isnan(ndcAxis.x) || std::isnan(ndcAxis.y) || length(ndcAxis) < epsilon || std::abs(dot(normalize(worldAxis), cameraForward)) > 0.99f) { - - auto worldAxis = math::float3 { x, y, z}; - - // Get the camera - const auto &camera = _view->getCamera(); - const auto &vp = _view->getViewport(); - auto viewMatrix = camera.getViewMatrix(); - - // Scale the viewport movement to NDC coordinates view axis - math::float2 viewportMovementNDC(viewportCoordX / (vp.width / 2), viewportCoordY / (vp.height / 2)); - - // calculate the translation axis in view space - // ignore the translation component of the view matrix we only care about whether or not the camera has rotated - // (if the entity is in the viewport, we don't need to translate it first back to the "true" X, Y or Z axis - we're just moving parallel to those axes ) - math::float3 viewSpaceAxis = viewMatrix.upperLeft() * worldAxis; - - // Apply projection matrix to get clip space axis - math::float4 clipAxis = camera.getProjectionMatrix() * math::float4(viewSpaceAxis, 0.0f); - - // Perform perspective division to get the translation axis in normalized device coordinates (NDC) - math::float2 ndcAxis = (clipAxis.xyz / clipAxis.w).xy; - - // Check if ndcAxis is too small (camera nearly orthogonal to the axis) - const float epsilon = 1e-6f; - if (std::isnan(ndcAxis.x) || std::isnan(ndcAxis.y) || length(ndcAxis) < epsilon) { - // Use an alternative method when the camera is nearly orthogonal to the axis - math::float3 cameraForward = -viewMatrix.upperLeft()[2]; - math::float3 perpendicularAxis = cross(cameraForward, worldAxis); - - if (length(perpendicularAxis) < epsilon) { - // If worldAxis is parallel to cameraForward, use a fixed perpendicular axis - perpendicularAxis = math::float3{0, 1, 0}; - if (std::abs(dot(perpendicularAxis, cameraForward)) > 0.9f) { - perpendicularAxis = math::float3{1, 0, 0}; - } - } - - ndcAxis = (camera.getProjectionMatrix() * math::float4(viewMatrix.upperLeft() * normalize(perpendicularAxis), 0.0f)).xy; - - Log("Corrected NDC axis %f %f", ndcAxis.x, ndcAxis.y); - + isAligned = true; + // Find a suitable perpendicular axis: + math::float3 perpendicularAxis; + if (std::abs(worldAxis.x) < epsilon && std::abs(worldAxis.z) < epsilon) + { + // If worldAxis is (0, y, 0), use (1, 0, 0) + perpendicularAxis = {1.0f, 0.0f, 0.0f}; + } + else + { + // Otherwise, calculate a perpendicular vector + perpendicularAxis = normalize(cross(cameraForward, worldAxis)); } - // project the viewport movement (i.e pointer drag) vector onto the translation axis - // this gives the proportion of the pointer drag vector to translate along the translation axis - float projectedMovement = dot(viewportMovementNDC, normalize(ndcAxis)); - auto translationNDC = projectedMovement * normalize(ndcAxis); + ndcAxis = (camera.getProjectionMatrix() * math::float4(viewMatrix.upperLeft() * perpendicularAxis, 0.0f)).xy; - math::float3 cameraPosition = camera.getPosition(); - math::float3 cameraForward = -viewMatrix.upperLeft()[2]; // Third row of the view matrix is the forward vector - float dotProduct = dot(normalize(worldAxis), cameraForward); - - // Get the camera's field of view and aspect ratio - float fovY = camera.getFieldOfViewInDegrees(filament::Camera::Fov::VERTICAL); - float fovX = camera.getFieldOfViewInDegrees(filament::Camera::Fov::HORIZONTAL); - - // Convert to radians - fovY = (fovY / 180) * M_PI; - fovX = (fovX / 180) * M_PI; - - float aspectRatio = static_cast(vp.width) / vp.height; - - auto &transformManager = _engine->getTransformManager(); - auto transformInstance = transformManager.getInstance(Entity::import(entity)); - const auto &transform = transformManager.getWorldTransform(transformInstance); - - math::float3 translation; - math::quatf rotation; - math::float3 scale; - - decomposeMatrix(transform, &translation, &rotation, &scale); - - const auto entityWorldPosition = transform * math::float4{0.0f, 0.0f, 0.0f, 1.0f}; - - float distanceToCamera = length(entityWorldPosition.xyz - camera.getPosition()); - - // Calculate the height of the view frustum at the given distance - float frustumHeight = 2.0f * distanceToCamera * tan(fovY * 0.5f); - - // Calculate the width of the view frustum at the given distance - float frustumWidth = frustumHeight * aspectRatio; - - // Convert projected viewport movement to world space distance - float worldDistance = length(math::float2 { (translationNDC /2) * math::float2 { frustumWidth, frustumHeight } }); - - float sign = (dotProduct >= 0) ? -1.0f : 1.0f; - if (projectedMovement < 0) { - sign *= -1.0f; + Log("Corrected NDC axis %f %f", ndcAxis.x, ndcAxis.y); + if (std::isnan(ndcAxis.x) || std::isnan(ndcAxis.y)) { + return; } - // Flip the sign for the Z-axis - if (std::abs(z) > 0.001) { - sign *= -1.0f; - } - - worldDistance *= sign; - - auto newWorldTranslation = worldAxis * worldDistance; - - queuePositionUpdate(entity, newWorldTranslation.x, newWorldTranslation.y, newWorldTranslation.z, true); } + // project the viewport movement (i.e pointer drag) vector onto the translation axis + // this gives the proportion of the pointer drag vector to translate along the translation axis + float projectedMovement = dot(viewportMovementNDC, normalize(ndcAxis)); + auto translationNDC = projectedMovement * normalize(ndcAxis); + + float dotProduct = dot(normalize(worldAxis), cameraForward); + + // Ensure minimum translation and correct direction + const float minTranslation = 0.01f; + if (isAligned || std::abs(projectedMovement) < minTranslation) { + // Use the dominant component of the viewport movement + float dominantMovement = std::abs(viewportMovementNDC.x) > std::abs(viewportMovementNDC.y) ? viewportMovementNDC.x : viewportMovementNDC.y; + projectedMovement = (std::abs(dominantMovement) < minTranslation) ? minTranslation : std::abs(dominantMovement); + projectedMovement *= (dominantMovement >= 0) ? 1.0f : -1.0f; + translationNDC = projectedMovement * normalize(ndcAxis); + } + + // Log("projectedMovement %f dotProduct %f", projectedMovement, dotProduct); + + // Get the camera's field of view and aspect ratio + float fovY = camera.getFieldOfViewInDegrees(filament::Camera::Fov::VERTICAL); + float fovX = camera.getFieldOfViewInDegrees(filament::Camera::Fov::HORIZONTAL); + + // Convert to radians + fovY = (fovY / 180) * M_PI; + fovX = (fovX / 180) * M_PI; + + float aspectRatio = static_cast(vp.width) / vp.height; + + auto &transformManager = _engine->getTransformManager(); + auto transformInstance = transformManager.getInstance(Entity::import(entity)); + const auto &transform = transformManager.getWorldTransform(transformInstance); + + math::float3 translation; + math::quatf rotation; + math::float3 scale; + + decomposeMatrix(transform, &translation, &rotation, &scale); + + const auto entityWorldPosition = transform * math::float4{0.0f, 0.0f, 0.0f, 1.0f}; + + float distanceToCamera = length(entityWorldPosition.xyz - camera.getPosition()); + + // Calculate the height of the view frustum at the given distance + float frustumHeight = 2.0f * distanceToCamera * tan(fovY * 0.5f); + + // Calculate the width of the view frustum at the given distance + float frustumWidth = frustumHeight * aspectRatio; + + // Convert projected viewport movement to world space distance + float worldDistance = length(math::float2{(translationNDC / 2) * math::float2{frustumWidth, frustumHeight}}); + + // Determine the sign based on the alignment of world axis and camera forward + float sign = (dotProduct >= 0) ? -1.0f : 1.0f; + + // If aligned, use the sign of the projected movement instead + if (isAligned) { + sign = (projectedMovement >= 0) ? 1.0f : -1.0f; + } else if (projectedMovement < 0) { + sign *= -1.0f; + } + + // Flip the sign for the Z-axis + if (std::abs(z) > 0.001) + { + sign *= -1.0f; + } + + worldDistance *= sign; + + auto newWorldTranslation = worldAxis * worldDistance; + + queuePositionUpdate(entity, newWorldTranslation.x, newWorldTranslation.y, newWorldTranslation.z, true); +} void SceneManager::queuePositionUpdate(EntityId entity, float x, float y, float z, bool relative) { @@ -2351,10 +2378,10 @@ namespace thermion_filament return Aabb2{minX, minY, maxX, maxY}; } - void SceneManager::setLayerEnabled(int layer, bool enabled) { + void SceneManager::setLayerEnabled(int layer, bool enabled) + { Log("Setting layer %d to %d", layer, enabled); _view->setLayerEnabled(layer, enabled); } - } // namespace thermion_filament From 8923d97129ca660e23cdb74694920a4b492f1c9a Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:46:47 +0800 Subject: [PATCH 037/232] chore: init SceneManager pointers to nullptr --- thermion_dart/native/include/SceneManager.hpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index c781994e..dbf55e03 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -180,7 +180,7 @@ namespace thermion_filament /// /// Toggles the visibility of the given layer. /// Layer 0 - regular scene assets - /// Layer 1 - gizmo + /// Layer 1 - unused /// Layer 2 - grid /// void setLayerEnabled(int layer, bool enabled); @@ -192,9 +192,9 @@ namespace thermion_filament private: gltfio::AssetLoader *_assetLoader = nullptr; const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; - Engine *_engine; - Scene *_scene; - View* _view; + Engine *_engine = nullptr; + Scene *_scene = nullptr; + View* _view = nullptr; gltfio::MaterialProvider *_ubershaderProvider = nullptr; gltfio::ResourceLoader *_gltfResourceLoader = nullptr; @@ -221,10 +221,7 @@ namespace thermion_filament const gltfio::FilamentInstance *instance, const char *entityName); - EntityId addGizmo(); - - GridOverlay* _gridOverlay = nullptr; - + GridOverlay* _gridOverlay = nullptr; }; } From 3ecb8920eace7d06c217f716d0d253a3ef208949 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:47:02 +0800 Subject: [PATCH 038/232] feat: createIbl --- thermion_dart/native/include/FilamentViewer.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index 3d932483..23eceab6 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -71,6 +71,7 @@ namespace thermion_filament void loadIbl(const char *const iblUri, float intensity); void removeIbl(); void rotateIbl(const math::mat3f &matrix); + void createIbl(float r, float g, float b, float intensity); void removeEntity(EntityId asset); void clearEntities(); @@ -172,6 +173,7 @@ namespace thermion_filament void* _context = nullptr; Scene *_scene = nullptr; View *_view = nullptr; + Engine *_engine = nullptr; thermion_filament::ThreadPool *_tp = nullptr; Renderer *_renderer = nullptr; From 85116f43a2ef13bbd6dba8cc634866460d5318b9 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:47:56 +0800 Subject: [PATCH 039/232] feat: remove gizmo view references, exclude gizmo entities from picking, add createIbl --- thermion_dart/native/src/FilamentViewer.cpp | 101 +++++++++++++------- 1 file changed, 65 insertions(+), 36 deletions(-) diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 5ede24a9..25a6accf 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -149,20 +149,20 @@ namespace thermion_filament _renderer = _engine->createRenderer(); + Renderer::ClearOptions clearOptions; + clearOptions.clear = false; + _renderer->setClearOptions(clearOptions); + _frameInterval = 1000.0f / 60.0f; setFrameInterval(_frameInterval); _scene = _engine->createScene(); - Log("Created scene"); - utils::Entity camera = EntityManager::get().create(); _mainCamera = _engine->createCamera(camera); - Log("Created camera"); - _view = _engine->createView(); setToneMapping(ToneMapping::ACES); @@ -464,8 +464,9 @@ namespace thermion_filament Texture::Type::FLOAT, nullptr, freeCallback, image); _imageTexture->setImage(*_engine, 0, std::move(pbd)); - // we don't need to free the ResourceBuffer in the texture callback because LinearImage takes a copy - // (check if this is correct ? ) + + // don't need to free the ResourceBuffer in the texture callback + // LinearImage takes a copy _resourceLoaderWrapper->free(rb); } @@ -734,8 +735,8 @@ namespace thermion_filament delete _sceneManager; _engine->destroyCameraComponent(_mainCamera->getEntity()); _mainCamera = nullptr; + _view->setScene(nullptr); _engine->destroy(_view); - _engine->destroy(_scene); _engine->destroy(_renderer); Engine::destroy(&_engine); @@ -786,6 +787,7 @@ namespace thermion_filament .build(*_engine); _view->setRenderTarget(_rt); + Log("Created render target for texture id %ld (%u x %u)", (long)texture, width, height); } @@ -1053,6 +1055,54 @@ namespace thermion_filament _indirectLight->setRotation(matrix); } + void FilamentViewer::createIbl(float r, float g, float b, float intensity) + { + if (_indirectLight) + { + removeIbl(); + } + + _iblTexture = Texture::Builder() + .width(1) + .height(1) + .levels(0x01) + .format(Texture::InternalFormat::RGB16F) + .sampler(Texture::Sampler::SAMPLER_CUBEMAP) + + .build(*_engine); + // Create a copy of the cubemap data + float32_t *pixelData = new float32_t[18] { + r, g, b, + r, g, b, + r, g, b, + r, g, b, + r, g, b, + r, g, b, + }; + + Texture::PixelBufferDescriptor::Callback freeCallback = [](void *buf, size_t, void *data) + { + delete[] reinterpret_cast(data); + }; + + auto pbd = Texture::PixelBufferDescriptor( + pixelData, + 18 * sizeof(float32_t), + Texture::Format::RGB, + Texture::Type::FLOAT, + freeCallback, + pixelData); + + _iblTexture->setImage(*_engine, 0, std::move(pbd)); + + _indirectLight = IndirectLight::Builder() + .reflections(_iblTexture) + .intensity(intensity) + .build(*_engine); + + _scene->setIndirectLight(_indirectLight); + } + void FilamentViewer::loadIbl(const char *const iblPath, float intensity) { removeIbl(); @@ -1329,11 +1379,6 @@ namespace thermion_filament cam.setLensProjection(_cameraFocalLength, aspect, _near, _far); - // cam.setScaling({1.0 / aspect, 1.0}); - - // Camera &gizmoCam = _gizmoView->getCamera(); - // gizmoCam.setScaling({1.0 / aspect, 1.0}); - Log("Set viewport to width: %d height: %d aspect %f scaleFactor : %f", width, height, aspect, contentScaleFactor); } @@ -1477,7 +1522,6 @@ namespace thermion_filament auto fv = cam.getForwardVector(); math::double3 target = home + fv; Viewport const &vp = _view->getViewport(); - // Log("Creating manipulator for viewport size %dx%d at home %f %f %f, fv %f %f %f, up %f %f %f target %f %f %f (norm %f) with _zoomSpeed %f", vp.width, vp.height, home[0], home[1], home[2], fv[0], fv[1], fv[2], up[0], up[1], up[2], target[0], target[1], target[2], norm(home), _zoomSpeed); _manipulator = Manipulator::Builder() .viewport(vp.width, vp.height) @@ -1511,15 +1555,6 @@ namespace thermion_filament { _createManipulator(); } - // if (pan) - // { - // Log("Beginning pan at %f %f", x, y); - // } - // else - // { - // Log("Beginning rotate at %f %f", x, y); - // } - _manipulator->grabBegin(x, y, pan); } @@ -1589,28 +1624,22 @@ namespace thermion_filament void FilamentViewer::pick(uint32_t x, uint32_t y, void (*callback)(EntityId entityId, int x, int y)) { - _view->pick(x, y, [=](filament::View::PickingQueryResult const &result) - { - - Log("Picked entity %d at screen space (%f,%f,(%f))", result.renderable, result.fragCoords.x, result.fragCoords.y, result.fragCoords.z); - auto* gizmo = _sceneManager->gizmo; + _view->pick(x, y, [=](filament::View::PickingQueryResult const &result) { + + if(_sceneManager->gizmo->isGizmoEntity(result.renderable)) { + Log("Gizmo entity, ignoring"); + return; + } std::unordered_set nonPickableEntities = { _imageEntity, - gizmo->center(), _sceneManager->_gridOverlay->sphere(), _sceneManager->_gridOverlay->grid(), }; - if(result.renderable == gizmo->x() || result.renderable == gizmo->y() || result.renderable == gizmo->z()) { - gizmo->highlight(result.renderable); - } else { - gizmo->unhighlight(); - } if (nonPickableEntities.find(result.renderable) == nonPickableEntities.end()) { callback(Entity::smuggle(result.renderable), x, y); - } else { - Log("Ignored"); - } }); + } + }); } EntityId FilamentViewer::createGeometry(float *vertices, uint32_t numVertices, uint16_t *indices, uint32_t numIndices, RenderableManager::PrimitiveType primitiveType, const char *materialPath) From 4a0f4e3ac8c8173d76ad4a6edacb48b94e323cd3 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:48:27 +0800 Subject: [PATCH 040/232] feat: add setGizmoVisibility/pickGizmo methods to ThermionViewer --- .../lib/thermion_dart/thermion_viewer.dart | 28 ++++++++- .../thermion_dart/thermion_viewer_ffi.dart | 58 ++++++++++++++++--- 2 files changed, 76 insertions(+), 10 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index d268ba16..5ef344df 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -72,6 +72,11 @@ abstract class ThermionViewer { /// Stream get pickResult; + /// + /// The result(s) of calling [pickGizmo] (see below). + /// + Stream get gizmoPickResult; + /// /// Whether the controller is currently rendering at [framerate]. /// @@ -137,11 +142,17 @@ abstract class ThermionViewer { Future removeSkybox(); /// - /// Loads an image-based light from the specified path at the given intensity. - /// Only one IBL can be active at any given time; if an IBL has already been loaded, it will be replaced. + /// Creates an indirect light by loading the reflections/irradiance from the KTX file. + /// Only one indirect light can be active at any given time; if an indirect light has already been loaded, it will be replaced. /// Future loadIbl(String lightingPath, {double intensity = 30000}); + /// + /// Creates a indirect light with the given color. + /// Only one indirect light can be active at any given time; if an indirect light has already been loaded, it will be replaced. + /// + Future createIbl(double r, double g, double b, double intensity); + /// /// Rotates the IBL & skybox. /// @@ -648,6 +659,14 @@ abstract class ThermionViewer { /// void pick(int x, int y); + /// + /// Used to test whether a Gizmo is at the given viewport coordinates. + /// Called by `FilamentGestureDetector` on a mouse/finger down event. You probably don't want to call this yourself. + /// This is asynchronous and will require 2-3 frames to complete - subscribe to the [gizmoPickResult] stream to receive the results of this method. + /// [x] and [y] must be in local logical coordinates (i.e. where 0,0 is at top-left of the ThermionWidget). + /// + void pickGizmo(int x, int y); + /// /// Retrieves the name assigned to the given ThermionEntity (usually corresponds to the glTF mesh name). /// @@ -773,4 +792,9 @@ abstract class ThermionViewer { /// Use this method to toggle visibility of the respective layer. /// Future setLayerEnabled(int layer, bool enabled); + + /// + /// Show/hide the translation gizmo. + /// + Future setGizmoVisibility(bool visible); } diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index 12a0b9a3..8d7fad1b 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -43,6 +43,12 @@ class ThermionViewerFFI extends ThermionViewer { final _pickResultController = StreamController.broadcast(); + @override + Stream get gizmoPickResult => + _gizmoPickResultController.stream; + final _gizmoPickResultController = + StreamController.broadcast(); + final Pointer resourceLoader; var _driver = nullptr.cast(); @@ -67,14 +73,15 @@ class ThermionViewerFFI extends ThermionViewer { this._renderCallback = renderCallback ?? nullptr; this._driver = driver ?? nullptr; this._sharedContext = sharedContext ?? nullptr; - try { - _onPickResultCallable = NativeCallable< - Void Function( - EntityId entityId, Int x, Int y)>.listener(_onPickResult); - } catch (err) { - _logger.severe( - "Failed to set pick result callback. This is expected if running on web/wasm"); - } + + _onPickResultCallable = + NativeCallable.listener( + _onPickResult); + + _onGizmoPickResultCallable = + NativeCallable.listener( + _onGizmoPickResult); + _initialize(); } @@ -277,6 +284,14 @@ class ThermionViewerFFI extends ThermionViewer { allocator.free(pathPtr); } + /// + /// + /// + @override + Future createIbl(double r, double g, double b, double intensity) async { + create_ibl(_viewer!, r, g, b, intensity); + } + /// /// /// @@ -1379,8 +1394,18 @@ class ThermionViewerFFI extends ThermionViewer { _scene!.registerSelected(entityId); } + void _onGizmoPickResult(ThermionEntity entityId, int x, int y) { + _gizmoPickResultController.add(( + entity: entityId, + x: (x / pixelRatio).toDouble(), + y: (viewportDimensions.$2 - y) / pixelRatio + )); + } + late NativeCallable _onPickResultCallable; + late NativeCallable + _onGizmoPickResultCallable; /// /// @@ -1395,6 +1420,16 @@ class ThermionViewerFFI extends ThermionViewer { filament_pick(_viewer!, x, y, _onPickResultCallable.nativeFunction); } + /// + /// + /// + @override + void pickGizmo(int x, int y) async { + x = (x * pixelRatio).ceil(); + y = (viewportDimensions.$2 - (y * pixelRatio)).ceil(); + pick_gizmo(_sceneManager!, x, y, _onGizmoPickResultCallable.nativeFunction); + } + /// /// /// @@ -1768,4 +1803,11 @@ class ThermionViewerFFI extends ThermionViewer { Future setLayerEnabled(int layer, bool enabled) async { set_layer_enabled(_sceneManager!, layer, enabled); } + + /// + /// + /// + Future setGizmoVisibility(bool visible) async { + set_gizmo_visibility(_sceneManager!, visible); + } } From 8b17916cd96c644d97a7dae18d54d74783b67d15 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:49:04 +0800 Subject: [PATCH 041/232] chore: Dart Gizmo class cleanup --- .../entities/abstract_gizmo.dart | 10 +- .../lib/thermion_dart/entities/gizmo.dart | 92 ++++++++++--------- 2 files changed, 56 insertions(+), 46 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart b/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart index 790fcc57..b5a722e7 100644 --- a/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart +++ b/thermion_dart/lib/thermion_dart/entities/abstract_gizmo.dart @@ -2,15 +2,17 @@ import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:vector_math/vector_math_64.dart'; abstract class AbstractGizmo { - bool get isActive; + + bool get isVisible; + bool get isHovered; - void translate(double transX, double transY); + Future translate(double transX, double transY); void reset(); - void attach(ThermionEntity entity); + Future attach(ThermionEntity entity); - void detach(); + Future detach(); Stream get boundingBox; diff --git a/thermion_dart/lib/thermion_dart/entities/gizmo.dart b/thermion_dart/lib/thermion_dart/entities/gizmo.dart index fac67297..f474d2df 100644 --- a/thermion_dart/lib/thermion_dart/entities/gizmo.dart +++ b/thermion_dart/lib/thermion_dart/entities/gizmo.dart @@ -4,7 +4,6 @@ import 'package:vector_math/vector_math_64.dart'; import '../thermion_viewer.dart'; class Gizmo extends AbstractGizmo { - final ThermionEntity x; final ThermionEntity y; final ThermionEntity z; @@ -14,48 +13,56 @@ class Gizmo extends AbstractGizmo { ThermionEntity? _activeAxis; ThermionEntity? _activeEntity; - bool get isActive => _activeAxis != null; + + bool _visible = false; + bool get isVisible => _visible; + + bool _isHovered = false; + bool get isHovered => _isHovered; final Set ignore; Stream get boundingBox => _boundingBoxController.stream; final _boundingBoxController = StreamController.broadcast(); - Gizmo(this.x, this.y, this.z, this.center, this._viewer, {this.ignore = const {}}) { + _viewer.gizmoPickResult.listen(_onGizmoPickResult); _viewer.pickResult.listen(_onPickResult); - - } - - Future _reveal() async { - await _viewer.reveal(x, null); - await _viewer.reveal(y, null); - await _viewer.reveal(z, null); - await _viewer.reveal(center, null); } final _stopwatch = Stopwatch(); - var _translation = Vector3.zero(); + double _transX = 0.0; + double _transY = 0.0; - void translate(double transX, double transY) async { + Future translate(double transX, double transY) async { if (!_stopwatch.isRunning) { _stopwatch.start(); } - _translation = Vector3(_activeAxis == x ? 1.0 : 0.0, + _transX += transX; + _transY += transY; + + if (_stopwatch.elapsedMilliseconds < 16) { + return; + } + + final axis = Vector3(_activeAxis == x ? 1.0 : 0.0, _activeAxis == y ? 1.0 : 0.0, _activeAxis == z ? 1.0 : 0.0); await _viewer.queueRelativePositionUpdateWorldAxis( _activeEntity!, - transX * _viewer.pixelRatio, - -transY * _viewer.pixelRatio, - _translation.x, - _translation.y, - _translation.z); + _transX * _viewer.pixelRatio, + -_transY * + _viewer + .pixelRatio, // flip the sign because "up" in NDC Y axis is positive, but negative in Flutter + axis.x, + axis.y, + axis.z); + _transX = 0; + _transY = 0; _stopwatch.reset(); - _translation = Vector3.zero(); } void reset() { @@ -63,42 +70,43 @@ class Gizmo extends AbstractGizmo { } void _onPickResult(FilamentPickResult result) async { - // print( - // "Pick result ${result}, x is ${x}, y is $y, z is $z, ignore is $ignore"); - // if (ignore.contains(result)) { - // print("Ignore/detach"); - // detach(); - // return; - // } + await attach(result.entity); + } + + void _onGizmoPickResult(FilamentPickResult result) async { if (result.entity == x || result.entity == y || result.entity == z) { _activeAxis = result.entity; - print("Set active axis to $_activeAxis"); + _isHovered = true; + } else if (result.entity == 0) { + _activeAxis = null; + _isHovered = false; } else { - attach(result.entity); - print("Attaching to ${result.entity}"); + throw Exception("Unexpected gizmo pick result"); } } - void attach(ThermionEntity entity) async { + Future attach(ThermionEntity entity) async { _activeAxis = null; + if (entity == _activeEntity) { + return; + } + if (entity == center) { + _activeEntity = null; + return; + } + _visible = true; _activeEntity = entity; - await _reveal(); - - await _viewer.setParent(center, entity); - + await _viewer.setGizmoVisibility(true); + await _viewer.setParent(center, entity, preserveScaling: true); _boundingBoxController.sink.add(await _viewer.getBoundingBox(x)); } - void detach() async { - await _viewer.setParent(center, 0); - await _viewer.hide(x, null); - await _viewer.hide(y, null); - await _viewer.hide(z, null); - await _viewer.hide(center, null); + Future detach() async { + await _viewer.setGizmoVisibility(false); } @override void checkHover(double x, double y) { - _viewer.pick(x.toInt(), y.toInt()); + _viewer.pickGizmo(x.toInt(), y.toInt()); } } From d52b23d6b511a26273bf066ea76db6ca50383f6f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:49:28 +0800 Subject: [PATCH 042/232] fix: (flutter) desktop gesture detector changes for new Gizmo methods --- .../gestures/thermion_gesture_detector_desktop.dart | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart index 45c7232a..4ab1e711 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart @@ -114,12 +114,7 @@ class _ThermionGestureDetectorDesktopState Widget build(BuildContext context) { return Listener( onPointerHover: (event) async { - // print( - // "local position ${event.localPosition} globalPosition ${event.position}");r _gizmo?.checkHover(event.localPosition.dx, event.localPosition.dy); - if (_gizmo == null || _gizmo!.isActive == true) { - return; - } }, onPointerSignal: (PointerSignalEvent pointerSignal) async { if (pointerSignal is PointerScrollEvent) { @@ -134,9 +129,6 @@ class _ThermionGestureDetectorDesktopState throw Exception("TODO - is this a pinch zoom on laptop trackpad?"); }, onPointerDown: (d) async { - if (_gizmo?.isActive == true) { - return; - } if (d.buttons != kTertiaryButton && widget.enablePicking) { widget.controller .pick(d.localPosition.dx.toInt(), d.localPosition.dy.toInt()); @@ -145,7 +137,7 @@ class _ThermionGestureDetectorDesktopState }, // holding/moving the left mouse button is interpreted as a pan, middle mouse button as a rotate onPointerMove: (PointerMoveEvent d) async { - if (_gizmo?.isActive == true) { + if (_gizmo?.isHovered == true) { _gizmo!.translate(d.delta.dx, d.delta.dy); return; } @@ -173,8 +165,7 @@ class _ThermionGestureDetectorDesktopState // 2) if _pointerMoving is false, this is interpreted as a pick // same applies to middle mouse button, but this is ignored as a pick onPointerUp: (PointerUpEvent d) async { - if (_gizmo?.isActive == true) { - _gizmo!.reset(); + if (_gizmo?.isHovered == true) { return; } From 7ac7ae43ab3486e37a1545f219dc16a18045940d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:50:07 +0800 Subject: [PATCH 043/232] fix: (wasm) use correct coords for pick, free memory correctly, keep pixelratio copy --- .../web/interop/thermion_viewer_wasm.dart | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart index de9cf77f..2308f1b9 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart @@ -93,7 +93,8 @@ class ThermionViewerWasm implements ThermionViewer { int _width = 0; int _height = 0; - Future initialize(int width, int height, {String? uberArchivePath}) async { + Future initialize(double width, double height, double pixelRatio, + {String? uberArchivePath}) async { if (!_initialized) { await _initializeModule(); _initialized = true; @@ -101,6 +102,7 @@ class ThermionViewerWasm implements ThermionViewer { _setAssetPathPrefix(assetPathPrefix!); } } + this.pixelRatio = pixelRatio; final context = _module!.ccall("thermion_dart_web_create_gl_context", "int", [].toJS, [].toJS, null); @@ -116,8 +118,8 @@ class ThermionViewerWasm implements ThermionViewer { ["void*".toJS, "void*".toJS, "void*".toJS, "string".toJS].toJS, [context!, loader, null, uberArchivePath?.toJS].toJS, null) as JSNumber; - await createSwapChain(width, height); - updateViewportAndCameraProjection(width, height, 1.0); + await createSwapChain(width.ceil(), height.ceil()); + updateViewportAndCameraProjection(width.ceil(), height.ceil(), 1.0); _sceneManager = _module!.ccall("get_scene_manager", "void*", ["void*".toJS].toJS, [_viewer!].toJS, null) as JSNumber; @@ -174,14 +176,15 @@ class ThermionViewerWasm implements ThermionViewer { if (width == 0 || height == 0) { throw Exception("Width/height must be greater than zero"); } - _width = width; - _height = height; - viewportDimensions = (width.toDouble(), height.toDouble()); + _width = (width * pixelRatio).ceil(); + _height = (height * pixelRatio).ceil(); + viewportDimensions = (_width.toDouble(), _height.toDouble()); + print("Update viewport camera projection : $_width $height"); _module!.ccall( "update_viewport_and_camera_projection", "void", ["void*".toJS, "uint32_t".toJS, "uint32_t".toJS, "float".toJS].toJS, - [_viewer!, width.toJS, height.toJS, scaleFactor.toJS].toJS, + [_viewer!, _width.toJS, _height.toJS, scaleFactor.toJS].toJS, null); } @@ -1290,11 +1293,12 @@ class ThermionViewerWasm implements ThermionViewer { @override Future getCameraModelMatrix() async { - final ptr = _module!._malloc(16 * 8) as JSNumber; - _module!.ccall("get_camera_model_matrix", "void", - ["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null); + final ptr = _module!.ccall("get_camera_model_matrix", "void*", + ["void*".toJS].toJS, [_viewer!].toJS, null) as JSNumber; final matrix = _matrixFromPtr(ptr); - _module!._free(ptr); + _module!.ccall( + "thermion_flutter_free", "void", ["void*".toJS].toJS, [ptr].toJS, null); + return matrix; } @@ -1448,7 +1452,7 @@ class ThermionViewerWasm implements ThermionViewer { @override void pick(int x, int y) async { x = (x * pixelRatio).ceil(); - y = (y * pixelRatio).ceil(); + y = (viewportDimensions.$2 - (y * pixelRatio)).ceil(); _module!.ccall( "filament_pick", "void", From 704b7f67346b85dbcf1da94ddd4db529ba056b04 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:51:09 +0800 Subject: [PATCH 044/232] fix: (flutter/web) use window.devicePixelRatio for viewport --- .../lib/thermion/widgets/thermion_widget.dart | 5 +++-- .../lib/thermion_flutter_web.dart | 18 +++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart index 3f874b42..ed77023b 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart @@ -43,8 +43,10 @@ class _ThermionWidgetState extends State { } }); var dpr = MediaQuery.of(context).devicePixelRatio; + var size = ((context.findRenderObject()) as RenderBox).size; - _texture = await ThermionFlutterPlugin.createTexture(size.width, size.height, 0, 0, dpr); + _texture = await ThermionFlutterPlugin.createTexture( + size.width, size.height, 0, 0, dpr); if (mounted) { setState(() {}); @@ -140,4 +142,3 @@ class TransparencyPainter extends CustomPainter { @override bool shouldRepaint(covariant CustomPainter oldDelegate) => false; } - diff --git a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart index ad9eaee1..6bb4ba1b 100644 --- a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart +++ b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart @@ -16,17 +16,14 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { Future createTexture(double width, double height, double offsetLeft, double offsetRight, double pixelRatio) async { await _viewer!.destroySwapChain(); - var physicalWidth = (width * pixelRatio).ceil(); - var physicalHeight = (width * pixelRatio).ceil(); - await _viewer!.createSwapChain(physicalWidth, physicalHeight); + await _viewer!.createSwapChain(width.ceil(), height.ceil()); final canvas = document.getElementById("canvas") as HTMLCanvasElement; - canvas.width = physicalWidth; - canvas.height = physicalHeight; + canvas.width = (width * pixelRatio).ceil(); + canvas.height = (height * pixelRatio).ceil(); - print("canvas dimensions ${width}x${height}"); - - _viewer!.updateViewportAndCameraProjection(physicalWidth, physicalHeight, 1.0); + _viewer! + .updateViewportAndCameraProjection(width.ceil(), height.ceil(), 1.0); return ThermionFlutterTexture(null, null, 0, 0, null); } @@ -52,7 +49,10 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { canvas.id = "canvas"; document.body!.appendChild(canvas); canvas.style.display = 'none'; - await _viewer!.initialize(1, 1, uberArchivePath: uberArchivePath); + final pixelRatio = window.devicePixelRatio; + + await _viewer! + .initialize(1, 1, pixelRatio, uberArchivePath: uberArchivePath); return _viewer!; } } From 2331f2c31abd2855a12ea58285eb9ff3718b325f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 27 Aug 2024 21:51:29 +0800 Subject: [PATCH 045/232] chore: update Makefile to add missing headers to resgen files --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile b/Makefile index 7098feb3..498f7c23 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,11 @@ materials: FORCE $(FILAMENT_PATH)/resgen -c -p image -x thermion_dart/native/include/material/ materials/image.filamat $(FILAMENT_PATH)/matc -a opengl -a metal -o materials/gizmo.filamat materials/gizmo.mat $(FILAMENT_PATH)/resgen -c -p gizmo -x thermion_dart/native/include/material/ materials/gizmo.filamat + echo '#include "gizmo.h"' | cat - thermion_dart/native/include/material/gizmo.c > thermion_dart/native/include/material/gizmo.c.new + echo '#include "image.h"' | cat - thermion_dart/native/include/material/image.c > thermion_dart/native/include/material/image.c.new + mv thermion_dart/native/include/material/image.c.new thermion_dart/native/include/material/image.c + mv thermion_dart/native/include/material/gizmo.c.new thermion_dart/native/include/material/gizmo.c + #rm materials/*.filamat FORCE: ; From f0f97e310c9658cf5cd504db81e90e7f5f983540 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:41:24 +0800 Subject: [PATCH 046/232] chore: add nested PickCallbackHandler to Gizmo --- thermion_dart/native/include/Gizmo.hpp | 24 ++++++++++++++++++++++++ thermion_dart/native/src/Gizmo.cpp | 15 +++------------ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/thermion_dart/native/include/Gizmo.hpp b/thermion_dart/native/include/Gizmo.hpp index 4e1af5ca..fd27d03d 100644 --- a/thermion_dart/native/include/Gizmo.hpp +++ b/thermion_dart/native/include/Gizmo.hpp @@ -31,6 +31,30 @@ class Gizmo { enum Axis { X, Y, Z}; + class PickCallbackHandler { + public: + PickCallbackHandler(Gizmo* gizmo, void (*callback)(EntityId entityId, int x, int y)) : _gizmo(gizmo), _callback(callback) {}; + void handle(filament::View::PickingQueryResult const &result) { + auto x = static_cast(result.fragCoords.x); + auto y= static_cast(result.fragCoords.y); + for(int i = 4; i < 7; i++) { + if(_gizmo->_entities[i] == result.renderable) { + _gizmo->highlight(_gizmo->_entities[i - 4]); + _callback(Entity::smuggle(_gizmo->_entities[i - 4]), x, y); + return; + } + } + _gizmo->unhighlight(); + _callback(0, x, y); + delete(this); + } + + private: + Gizmo* _gizmo; + void (*_callback)(EntityId entityId, int x, int y); + + }; + public: Gizmo(Engine& engine, View *view, Scene *scene); ~Gizmo(); diff --git a/thermion_dart/native/src/Gizmo.cpp b/thermion_dart/native/src/Gizmo.cpp index d339deab..260659e3 100644 --- a/thermion_dart/native/src/Gizmo.cpp +++ b/thermion_dart/native/src/Gizmo.cpp @@ -359,20 +359,11 @@ void Gizmo::destroy() _engine.destroy(_material); } - void Gizmo::pick(uint32_t x, uint32_t y, void (*callback)(EntityId entityId, int x, int y)) { - auto * gizmo = this; - _view->pick(x, y, [=](filament::View::PickingQueryResult const &result) { - for(int i = 4; i < 7; i++) { - if(_entities[i] == result.renderable) { - gizmo->highlight(_entities[i - 4]); - callback(Entity::smuggle(_entities[i - 4]), x, y); - return; - } - } - gizmo->unhighlight(); - callback(0, x, y); + auto handler = new Gizmo::PickCallbackHandler(this, callback); + _view->pick(x, y, [=](filament::View::PickingQueryResult const &result) { + handler->handle(result); }); } From 6f2331582c1bc4b26e096f421cef3d54a3309c4d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:41:55 +0800 Subject: [PATCH 047/232] chore: use float instead of float32_t in FilamentViewer --- thermion_dart/native/src/FilamentViewer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 25a6accf..15c35c30 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -1071,7 +1071,7 @@ namespace thermion_filament .build(*_engine); // Create a copy of the cubemap data - float32_t *pixelData = new float32_t[18] { + float *pixelData = new float[18] { r, g, b, r, g, b, r, g, b, @@ -1082,12 +1082,12 @@ namespace thermion_filament Texture::PixelBufferDescriptor::Callback freeCallback = [](void *buf, size_t, void *data) { - delete[] reinterpret_cast(data); + delete[] reinterpret_cast(data); }; auto pbd = Texture::PixelBufferDescriptor( pixelData, - 18 * sizeof(float32_t), + 18 * sizeof(float), Texture::Format::RGB, Texture::Type::FLOAT, freeCallback, From 683105c4f7c0d8e6896547c98d50cab128f263ca Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:42:17 +0800 Subject: [PATCH 048/232] fix: emscripten export visibility for add_light --- thermion_dart/native/src/ThermionDartApi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index d1befdb8..ce79c961 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -110,7 +110,7 @@ extern "C" ((FilamentViewer *)viewer)->removeIbl(); } - EntityId add_light( + EMSCRIPTEN_KEEPALIVE EntityId add_light( const void *const viewer, uint8_t type, float colour, From abe6e1fcb81ae311967114ad3e5a428d46de1e7c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:43:04 +0800 Subject: [PATCH 049/232] feat: add ThermionFlutterOptions classes, rename interface parameter for offsetTop and ensure pixelRatio is passed to resizeTexture --- .../thermion_flutter_platform_interface.dart | 19 ++++++++++++++----- .../lib/thermion_flutter_web_options.dart | 8 ++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web_options.dart diff --git a/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart b/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart index 7a3b45d9..7bf6dfb2 100644 --- a/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart +++ b/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart @@ -4,6 +4,12 @@ import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'thermion_flutter_texture.dart'; +abstract class ThermionFlutterOptions { + final String? uberarchivePath; + + ThermionFlutterOptions({this.uberarchivePath}); +} + abstract class ThermionFlutterPlatform extends PlatformInterface { ThermionFlutterPlatform() : super(token: _token); @@ -17,14 +23,17 @@ abstract class ThermionFlutterPlatform extends PlatformInterface { _instance = instance; } - Future createViewer({String? uberArchivePath}); + Future createViewerWithOptions( + covariant ThermionFlutterOptions options); - Future createTexture( - double width, double height, double offsetLeft, double offsetRight, double pixelRatio); + @deprecated + Future createViewer({String? uberarchivePath}); + + Future createTexture(double width, double height, + double offsetLeft, double offsetTop, double pixelRatio); Future destroyTexture(ThermionFlutterTexture texture); Future resizeTexture(ThermionFlutterTexture texture, - int width, int height, int offsetLeft, int offsetRight); - + int width, int height, int offsetTop, int offsetRight, double pixelRatio); } diff --git a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web_options.dart b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web_options.dart new file mode 100644 index 00000000..e453233d --- /dev/null +++ b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web_options.dart @@ -0,0 +1,8 @@ +import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; + +class ThermionFlutterWebOptions extends ThermionFlutterOptions { + bool createCanvas; + bool importCanvasAsWidget; + + ThermionFlutterWebOptions({this.importCanvasAsWidget = false, this.createCanvas = true, String? uberarchivePath}) : super(uberarchivePath:uberarchivePath); +} From 6d0c06a853492ff66b1f459ef05d900b28d2ef82 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:43:19 +0800 Subject: [PATCH 050/232] doc: pixelRatio --- thermion_dart/lib/thermion_dart/thermion_viewer.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index 5ef344df..e3fb36de 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -63,6 +63,9 @@ abstract class ThermionViewer { /// late (double, double) viewportDimensions; + /// + /// The current ratio of logical to physical pixels. + /// late double pixelRatio; /// From 4e29055a20d1ddb30d97ef6f5387c5094d8c52b7 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:43:35 +0800 Subject: [PATCH 051/232] chore: stub new methods --- .../thermion_dart/thermion_viewer_stub.dart | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart index fc6e0b02..e6119d1e 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart @@ -782,4 +782,25 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement setLayerEnabled throw UnimplementedError(); } + + @override + Future createIbl(double r, double g, double b, double intensity) { + // TODO: implement createIbl + throw UnimplementedError(); + } + + @override + // TODO: implement gizmoPickResult + Stream get gizmoPickResult => throw UnimplementedError(); + + @override + void pickGizmo(int x, int y) { + // TODO: implement pickGizmo + } + + @override + Future setGizmoVisibility(bool visible) { + // TODO: implement setGizmoVisibility + throw UnimplementedError(); + } } From f07fe6084a06bb3b0c2196b6cf83149ee9812629 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:43:58 +0800 Subject: [PATCH 052/232] chore: (flutter) export platform interface from thermion_flutter package --- thermion_flutter/thermion_flutter/lib/thermion_flutter.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart b/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart index d48d5747..8c5164ed 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart @@ -3,5 +3,5 @@ library thermion_flutter; export 'thermion/thermion_flutter_plugin.dart'; export 'thermion/widgets/thermion_widget.dart'; export 'thermion/widgets/camera/gestures/thermion_gesture_detector.dart'; - +export 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; export 'package:thermion_dart/thermion_dart.dart'; From d4350d7d99769681e13415a2d98bbe957659d172 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:44:18 +0800 Subject: [PATCH 053/232] test: update viewport gizmo test --- thermion_dart/test/viewport_gizmo.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/thermion_dart/test/viewport_gizmo.dart b/thermion_dart/test/viewport_gizmo.dart index e0bb9740..be91ce72 100644 --- a/thermion_dart/test/viewport_gizmo.dart +++ b/thermion_dart/test/viewport_gizmo.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'dart:math'; import 'package:thermion_dart/thermion_dart/swift/swift_bindings.g.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.dart'; @@ -6,6 +7,7 @@ import 'package:thermion_dart/thermion_dart/utils/dart_resources.dart'; import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; import 'package:test/test.dart'; import 'package:animation_tools_dart/animation_tools_dart.dart'; +import 'package:vector_math/vector_math_64.dart'; /// Test files are run in a variety of ways, find this package root in all. /// @@ -66,16 +68,14 @@ void main() async { await viewer.createRenderTarget(500, 500, object.metalTextureAddress); await viewer.updateViewportAndCameraProjection(500, 500); - print(await viewer.getCameraFov(true)); - print(await viewer.getCameraFov(false)); - group('viewport', () { test('viewport', () async { var entity = await viewer .createGeometry([0.0], [0], primitiveType: PrimitiveType.POINTS); await viewer.setCameraPosition(0.0, 0.0, 4.0); + await viewer.setCameraRotation(Quaternion.axisAngle(Vector3(0,0,1), pi/2)); await viewer.queueRelativePositionUpdateWorldAxis( - entity, -250.0, 250.0, 1, 0, 0); + entity, 250.0, 250.0, 1, 0, 0); }); }); } From aa246ab63adf3517a9934dfc8399ab2e7fcb84af Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:45:49 +0800 Subject: [PATCH 054/232] feat: (flutter) (web) use options to determine whether to create canvas, and set fixed position + offset --- .../lib/thermion_flutter_web.dart | 38 ++++++++++++++++--- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart index 6bb4ba1b..fef48ccc 100644 --- a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart +++ b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart @@ -3,6 +3,7 @@ import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; import 'package:thermion_flutter_platform_interface/thermion_flutter_texture.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; +import 'package:thermion_flutter_web/thermion_flutter_web_options.dart'; import 'package:web/web.dart'; class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { @@ -14,7 +15,7 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { @override Future createTexture(double width, double height, - double offsetLeft, double offsetRight, double pixelRatio) async { + double offsetLeft, double offsetTop, double pixelRatio) async { await _viewer!.destroySwapChain(); await _viewer!.createSwapChain(width.ceil(), height.ceil()); @@ -22,6 +23,13 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { canvas.width = (width * pixelRatio).ceil(); canvas.height = (height * pixelRatio).ceil(); + (canvas as HTMLElement).style.position = "fixed"; + (canvas as HTMLElement).style.zIndex = "-1"; + (canvas as HTMLElement).style.left = + (offsetLeft * pixelRatio).ceil().toString(); + (canvas as HTMLElement).style.top = + (offsetTop * pixelRatio).ceil().toString(); + _viewer! .updateViewportAndCameraProjection(width.ceil(), height.ceil(), 1.0); @@ -35,24 +43,42 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { @override Future resizeTexture(ThermionFlutterTexture texture, - int width, int height, int offsetLeft, int offsetRight) async { + int width, int height, int offsetLeft, int offsetTop, double pixelRatio) async { final canvas = document.getElementById("canvas") as HTMLCanvasElement; canvas.width = width; canvas.height = height; + (canvas as HTMLElement).style.position = "fixed"; + (canvas as HTMLElement).style.zIndex = "-1"; + (canvas as HTMLElement).style.left = + (offsetLeft * pixelRatio).ceil().toString(); + (canvas as HTMLElement).style.top = + (offsetTop * pixelRatio).ceil().toString(); _viewer!.updateViewportAndCameraProjection(width, height, 1.0); return ThermionFlutterTexture(null, null, 0, 0, null); } - Future createViewer({String? uberArchivePath}) async { + Future createViewerWithOptions( + ThermionFlutterWebOptions options) async { _viewer = ThermionViewerWasm(assetPathPrefix: "/assets/"); - final canvas = document.createElement("canvas") as HTMLCanvasElement; + + final canvas = options.createCanvas + ? document.createElement("canvas") as HTMLCanvasElement? + : document.getElementById("canvas") as HTMLCanvasElement?; + if (canvas == null) { + throw Exception("Could not locate or create canvas"); + } canvas.id = "canvas"; document.body!.appendChild(canvas); canvas.style.display = 'none'; final pixelRatio = window.devicePixelRatio; - + await _viewer! - .initialize(1, 1, pixelRatio, uberArchivePath: uberArchivePath); + .initialize(1, 1, pixelRatio, uberArchivePath: options.uberarchivePath); return _viewer!; } + + @override + Future createViewer({String? uberarchivePath}) { + throw Exception("Use createViewerWithOptions instead"); + } } From ae1e14ddb7d900e76e03a72cccd20cac2d86103e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:47:41 +0800 Subject: [PATCH 055/232] feat: add createViewerWithOptions to ThermionFlutterPlugin and mark createViewer as deprecated --- .../lib/thermion/thermion_flutter_plugin.dart | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart b/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart index 8892ebb3..0fc87314 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart @@ -65,8 +65,29 @@ class ThermionFlutterPlugin { throw Exception("Existing call to createViewer has not completed."); } _initializing = true; + + _viewer = await ThermionFlutterPlatform.instance - .createViewer(uberArchivePath: uberArchivePath); + .createViewer(uberarchivePath: uberArchivePath); + _appLifecycleListener = AppLifecycleListener( + onStateChange: _handleStateChange, + ); + _viewer!.onDispose(() async { + _viewer = null; + _appLifecycleListener?.dispose(); + _appLifecycleListener = null; + }); + _initializing = false; + return _viewer!; + } + + static Future createViewerWithOptions(ThermionFlutterOptions options) async { + if (_initializing) { + throw Exception("Existing call to createViewer has not completed."); + } + _initializing = true; + _viewer = await ThermionFlutterPlatform.instance + .createViewerWithOptions(options); _appLifecycleListener = AppLifecycleListener( onStateChange: _handleStateChange, ); @@ -80,9 +101,9 @@ class ThermionFlutterPlugin { } static Future createTexture( - double width, double height, double offsetLeft, double offsetRight, double pixelRatio) async { + double width, double height, double offsetLeft, double offsetTop, double pixelRatio) async { return ThermionFlutterPlatform.instance - .createTexture(width, height, offsetLeft, offsetRight, pixelRatio); + .createTexture(width, height, offsetLeft, offsetTop, pixelRatio); } static Future destroyTexture(ThermionFlutterTexture texture) async { @@ -95,8 +116,8 @@ class ThermionFlutterPlugin { int width, int height, int offsetLeft, - int offsetRight) async { + int offsetTop, double pixelRatio) async { return ThermionFlutterPlatform.instance - .resizeTexture(texture, width, height, offsetLeft, offsetRight); + .resizeTexture(texture, width, height, offsetLeft, offsetTop, pixelRatio); } } From 0ac0a92024075fe82844f19e256656c12e97fb42 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:47:54 +0800 Subject: [PATCH 056/232] feat: add createViewerWithOptions to ThermionFlutterPlugin and mark createViewer as deprecated --- .../thermion_flutter/lib/thermion/thermion_flutter_plugin.dart | 1 + .../lib/thermion_flutter_platform_interface.dart | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart b/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart index 0fc87314..1c536de2 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart @@ -60,6 +60,7 @@ class ThermionFlutterPlugin { } } + @Deprecated("Use createViewerWithOptions") static Future createViewer({String? uberArchivePath}) async { if (_initializing) { throw Exception("Existing call to createViewer has not completed."); diff --git a/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart b/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart index 7bf6dfb2..deb81de2 100644 --- a/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart +++ b/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart @@ -4,7 +4,7 @@ import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'thermion_flutter_texture.dart'; -abstract class ThermionFlutterOptions { +class ThermionFlutterOptions { final String? uberarchivePath; ThermionFlutterOptions({this.uberarchivePath}); From 04ecb4d56f9a184662c36f20c67b0d11190f5179 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:49:02 +0800 Subject: [PATCH 057/232] fix: (flutter) pass ThermionFlutterOptions to ThermionWidget, use dpr for resizeTexture, delete unnecessary TransparencyPainter class --- .../lib/thermion/widgets/thermion_widget.dart | 34 +++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart index ed77023b..c903e7a4 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart @@ -3,14 +3,18 @@ import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:thermion_flutter/thermion/widgets/thermion_widget_web.dart'; +import 'package:thermion_flutter/thermion/widgets/transparent_filament_widget.dart'; +import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; import 'dart:async'; import 'package:thermion_flutter_platform_interface/thermion_flutter_texture.dart'; import 'package:thermion_flutter/thermion_flutter.dart'; +import 'package:thermion_flutter_web/thermion_flutter_web_options.dart'; import 'resize_observer.dart'; class ThermionWidget extends StatefulWidget { final ThermionViewer viewer; + final ThermionFlutterOptions? options; /// /// The content to render before the texture widget is available. @@ -18,7 +22,8 @@ class ThermionWidget extends StatefulWidget { /// final Widget? initial; - const ThermionWidget({Key? key, this.initial, required this.viewer}) + const ThermionWidget( + {Key? key, this.initial, required this.viewer, this.options}) : super(key: key); @override @@ -43,7 +48,7 @@ class _ThermionWidgetState extends State { } }); var dpr = MediaQuery.of(context).devicePixelRatio; - + var size = ((context.findRenderObject()) as RenderBox).size; _texture = await ThermionFlutterPlugin.createTexture( size.width, size.height, 0, 0, dpr); @@ -60,7 +65,7 @@ class _ThermionWidgetState extends State { Future _resizeTexture(Size newSize) async { _resizeTimer?.cancel(); - _resizeTimer = Timer(Duration(milliseconds: 500), () async { + _resizeTimer = Timer(const Duration(milliseconds: 500), () async { if (_resizing || !mounted) { return; } @@ -74,8 +79,8 @@ class _ThermionWidgetState extends State { var dpr = MediaQuery.of(context).devicePixelRatio; - _texture = await ThermionFlutterPlugin.resizeTexture(oldTexture!, - (dpr * newSize.width).ceil(), (dpr * newSize.height).ceil(), 0, 0); + _texture = await ThermionFlutterPlugin.resizeTexture( + oldTexture!, newSize.width.ceil(), newSize.height.ceil(), 0, 0, dpr); setState(() {}); _resizing = false; }); @@ -88,7 +93,9 @@ class _ThermionWidgetState extends State { return widget.initial ?? Container(color: Colors.red); } return ResizeObserver( - onResized: _resizeTexture, child: ThermionWidgetWeb()); + onResized: _resizeTexture, + child: ThermionWidgetWeb( + options: widget.options! as ThermionFlutterWebOptions)); } if (_texture?.usesBackingWindow == true) { @@ -127,18 +134,3 @@ class _ThermionWidgetState extends State { ])); } } - -class TransparencyPainter extends CustomPainter { - @override - void paint(Canvas canvas, Size size) { - canvas.drawRect( - Rect.fromLTWH(0, 0, size.width, size.height), - Paint() - ..blendMode = BlendMode.clear - ..color = const Color(0x00000000), - ); - } - - @override - bool shouldRepaint(covariant CustomPainter oldDelegate) => false; -} From 4edc8aa85b4ae49fd4a6b8b50182c669a921201c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:51:22 +0800 Subject: [PATCH 058/232] feat: (flutter) move DPR calculation to resizeTexture and add createViewerWithOptions method to ThermionFlutterFFI --- .../lib/thermion_flutter_ffi.dart | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart b/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart index dce8d700..83f742e4 100644 --- a/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart +++ b/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart @@ -26,7 +26,12 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { final _textures = {}; - Future createViewer({String? uberArchivePath}) async { + Future createViewerWithOptions( + ThermionFlutterOptions options) async { + return createViewer(uberarchivePath: options.uberarchivePath); + } + + Future createViewer({String? uberarchivePath}) async { var resourceLoader = Pointer.fromAddress( await _channel.invokeMethod("getResourceLoaderWrapper")); @@ -58,7 +63,7 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { renderCallbackOwner: renderCallbackOwner, driver: driverPtr, sharedContext: sharedContextPtr, - uberArchivePath: uberArchivePath); + uberArchivePath: uberarchivePath); await _viewer!.initialized; return _viewer!; } @@ -115,7 +120,8 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { if (_textures.length > 1) { throw Exception("Multiple textures not yet supported"); } else if (_textures.length == 1) { - if (_textures.first.height == physicalHeight && _textures.first.width == physicalWidth) { + if (_textures.first.height == physicalHeight && + _textures.first.width == physicalWidth) { return _textures.first; } else { await _viewer!.setRendering(false); @@ -127,8 +133,8 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { _creatingTexture = true; - var result = await _channel - .invokeMethod("createTexture", [physicalWidth, physicalHeight, offsetLeft, offsetLeft]); + var result = await _channel.invokeMethod("createTexture", + [physicalWidth, physicalHeight, offsetLeft, offsetLeft]); if (result == null || (result[0] == -1)) { throw Exception("Failed to create texture"); @@ -140,12 +146,14 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { _logger.info( "Created texture with flutter texture id ${flutterTextureId}, hardwareTextureId $hardwareTextureId and surfaceAddress $surfaceAddress"); - _viewer?.viewportDimensions = (physicalWidth.toDouble(), physicalHeight.toDouble()); + _viewer?.viewportDimensions = + (physicalWidth.toDouble(), physicalHeight.toDouble()); - final texture = ThermionFlutterTexture( - flutterTextureId, hardwareTextureId, physicalWidth, physicalHeight, surfaceAddress); + final texture = ThermionFlutterTexture(flutterTextureId, hardwareTextureId, + physicalWidth, physicalHeight, surfaceAddress); - await _viewer?.createSwapChain(physicalWidth.toDouble(), physicalHeight.toDouble(), + await _viewer?.createSwapChain( + physicalWidth.toDouble(), physicalHeight.toDouble(), surface: texture.surfaceAddress == null ? nullptr : Pointer.fromAddress(texture.surfaceAddress!)); @@ -153,7 +161,9 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { if (texture.hardwareTextureId != null) { // ignore: unused_local_variable var renderTarget = await _viewer?.createRenderTarget( - physicalWidth.toDouble(), physicalHeight.toDouble(), texture.hardwareTextureId!); + physicalWidth.toDouble(), + physicalHeight.toDouble(), + texture.hardwareTextureId!); } await _viewer?.updateViewportAndCameraProjection( @@ -186,12 +196,20 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { /// Called by [ThermionWidget] to resize a texture. Don't call this yourself. /// @override - Future resizeTexture(ThermionFlutterTexture texture, - int width, int height, int offsetLeft, int offsetRight) async { + Future resizeTexture( + ThermionFlutterTexture texture, + int width, + int height, + int offsetLeft, + int offsetTop, + double pixelRatio) async { if (_resizing) { throw Exception("Resize underway"); } + width = (width * pixelRatio).ceil(); + height = (height * pixelRatio).ceil(); + if ((width - _viewer!.viewportDimensions.$1).abs() < 0.001 || (height - _viewer!.viewportDimensions.$2).abs() < 0.001) { return texture; From 03ffe8511344e3387859cd9022551a85eeacb44f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:51:36 +0800 Subject: [PATCH 059/232] chore: stub ThermionWidget methods --- .../lib/thermion/widgets/thermion_widget_web_stub.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart index 528afe83..db61a5b5 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart @@ -1,7 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:thermion_flutter_ffi/thermion_flutter_ffi.dart'; +import 'package:thermion_flutter_web/thermion_flutter_web_options.dart'; class ThermionWidgetWeb extends StatefulWidget { + final ThermionFlutterWebOptions options; + + const ThermionWidgetWeb({super.key, required this.options}); + @override State createState() => throw Exception(); } From f57a323cda4a3d734a1d56db15f5a293af6c03b8 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:52:19 +0800 Subject: [PATCH 060/232] feat: (flutter) (web) if importCanvasAsWidget is false, render transparency --- .../widgets/thermion_widget_web_impl.dart | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart index 905d63a6..752f5116 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart @@ -1,19 +1,32 @@ import 'dart:js_util'; -import 'dart:js_interop'; -import 'dart:js_interop_unsafe'; import 'dart:ui' as ui; import 'dart:ui_web' as ui_web; -import 'package:flutter/material.dart'; +import 'package:thermion_flutter_web/thermion_flutter_web_options.dart'; import 'package:web/web.dart'; import 'package:flutter/widgets.dart'; -import 'dart:html' as html; -class ThermionWidgetWeb extends StatefulWidget { +class ThermionWidgetWeb extends StatelessWidget { + final ThermionFlutterWebOptions options; + + const ThermionWidgetWeb({super.key, required this.options}); + @override - State createState() => ThermionWidgetWebState(); + Widget build(BuildContext context) { + if (options.importCanvasAsWidget) { + return _ImageCopyingWidget(); + } + return Container(color: const Color(0x00000000)); + } } -class ThermionWidgetWebState extends State { +class _ImageCopyingWidget extends StatefulWidget { + @override + State createState() { + return _ImageCopyingWidgetState(); + } +} + +class _ImageCopyingWidgetState extends State<_ImageCopyingWidget> { ui.Image? _img; @override @@ -41,9 +54,6 @@ class ThermionWidgetWebState extends State { @override Widget build(BuildContext context) { - if (_img == null) { - return Container(color: Colors.transparent); - } return RawImage(image: _img!); } } From b29663923d627b9b4ba51bbfe7c0c5a307a5d5a6 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:52:40 +0800 Subject: [PATCH 061/232] chore: (wasm) add missing interop methods --- .../web/interop/thermion_viewer_wasm.dart | 115 ++++++++++++++---- 1 file changed, 92 insertions(+), 23 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart index 2308f1b9..6ca4316a 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart @@ -124,9 +124,12 @@ class ThermionViewerWasm implements ThermionViewer { ["void*".toJS].toJS, [_viewer!].toJS, null) as JSNumber; _pickCallbackPtr = _module!.addFunction(_onPickCallback.toJS, "viii"); + _pickGizmoCallbackPtr = + _module!.addFunction(_onPickGizmoCallback.toJS, "viii"); // _module!.removeFunction(_pickCallbackPtr); + // _module!.removeFunction(_pickGizmoCallbackPtr); - var gizmoOut = _module!._malloc(4 * 4) as JSNumber; + var gizmoOut = _module!._malloc(4 * 4); _module!.ccall("get_gizmo", "void", ["void*".toJS, "void*".toJS].toJS, [_sceneManager!, gizmoOut].toJS, null); @@ -167,6 +170,9 @@ class ThermionViewerWasm implements ThermionViewer { } Future destroySwapChain() async { + if (_viewer == null) { + return; + } _module!.ccall("destroy_swap_chain", "void", ["void*".toJS].toJS, [_viewer!].toJS, null); } @@ -193,6 +199,9 @@ class ThermionViewerWasm implements ThermionViewer { return _initialized; } + /// + /// + /// final _pickResultController = StreamController.broadcast(); @@ -201,6 +210,12 @@ class ThermionViewerWasm implements ThermionViewer { return _pickResultController.stream; } + @override + Stream get gizmoPickResult => + _gizmoPickResultController.stream; + final _gizmoPickResultController = + StreamController.broadcast(); + @override bool get rendering => _rendering; @@ -270,7 +285,7 @@ class ThermionViewerWasm implements ThermionViewer { [_sceneManager!, entity.toJS, skinIndex.toJS].toJS, null) as JSNumber; var boneCount = boneCountJS.toDartInt; - var buf = _module!._malloc(boneCount * 16 * 4) as JSNumber; + var buf = _module!._malloc(boneCount * 16 * 4); _module!.ccall( "get_rest_local_transforms", "void", @@ -482,7 +497,7 @@ class ThermionViewerWasm implements ThermionViewer { [_sceneManager!, entity.toJS, skinIndex.toJS].toJS, null) as JSNumber; var boneCount = boneCountJS.toDartInt; - var buf = _module!._malloc(boneCount * 4) as JSNumber; + var buf = _module!._malloc(boneCount * 4); var empty = " ".toJS; var ptrs = []; @@ -518,7 +533,7 @@ class ThermionViewerWasm implements ThermionViewer { null) as JSNumber; var entityCount = entityCountJS.toDartInt; var entities = []; - var buf = _module!._malloc(entityCount * 4) as JSNumber; + var buf = _module!._malloc(entityCount * 4); _module!.ccall( "get_entities", @@ -596,7 +611,7 @@ class ThermionViewerWasm implements ThermionViewer { var morphTargetCount = morphTargetCountJS.toDartInt; var names = []; for (int i = 0; i < morphTargetCount; i++) { - var buf = _module!._malloc(256) as JSNumber; + var buf = _module!._malloc(256); _module!.ccall( "get_morph_target_name", "void", @@ -645,7 +660,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future getWorldTransform(ThermionEntity entity) async { - final matrixPtr = _module!._malloc(16 * 4) as JSNumber; + final matrixPtr = _module!._malloc(16 * 4); _module!.ccall( "get_world_transform", "void", @@ -815,7 +830,7 @@ class ThermionViewerWasm implements ThermionViewer { Future capture() async { bool wasRendering = rendering; await setRendering(false); - final pixelBuffer = _module!._malloc(_width * _height * 4) as JSNumber; + final pixelBuffer = _module!._malloc(_width * _height * 4); final completer = Completer(); final callback = () { completer.complete(); @@ -976,7 +991,7 @@ class ThermionViewerWasm implements ThermionViewer { assert(frameData.length == animation.numFrames * intersection.length); // Allocate memory in WASM for the morph data - var dataPtr = _module!._malloc(frameData.length * 4) as JSNumber; + var dataPtr = _module!._malloc(frameData.length * 4); // Create a Float32List to copy the morph data to var dataList = td.Float32List.fromList(frameData); @@ -986,7 +1001,7 @@ class ThermionViewerWasm implements ThermionViewer { dataList.buffer.asUint8List(dataList.offsetInBytes).toJS, dataPtr); // Allocate memory in WASM for the morph indices - var idxPtr = _module!._malloc(indices.length * 4) as JSNumber; + var idxPtr = _module!._malloc(indices.length * 4); // Create an Int32List to copy the morph indices to var idxList = td.Int32List.fromList(indices); @@ -1219,7 +1234,7 @@ class ThermionViewerWasm implements ThermionViewer { final animationCount = await getAnimationCount(entity); final names = []; for (int i = 0; i < animationCount; i++) { - final namePtr = _module!._malloc(256) as JSNumber; + final namePtr = _module!._malloc(256); _module!.ccall( "get_animation_name", "void", @@ -1248,7 +1263,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future getCameraCullingProjectionMatrix() async { - final ptr = _module!._malloc(16 * 8) as JSNumber; + final ptr = _module!._malloc(16 * 8); _module!.ccall("get_camera_culling_projection_matrix", "void", ["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null); final matrix = Matrix4.zero(); @@ -1263,7 +1278,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future getCameraFrustum() async { - final ptr = _module!._malloc(24 * 8) as JSNumber; + final ptr = _module!._malloc(24 * 8); _module!.ccall("get_camera_frustum", "void", ["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null); final planes = List.generate(6, (i) { @@ -1304,7 +1319,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future getCameraPosition() async { - final ptr = _module!._malloc(3 * 8) as JSNumber; + final ptr = _module!._malloc(3 * 8); _module!.ccall("get_camera_position", "void", ["void*".toJS, "void*".toJS].toJS, [_viewer!, ptr].toJS, null); final pos = Vector3( @@ -1320,7 +1335,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future getCameraProjectionMatrix() async { - final ptr = _module!._malloc(16 * 8) as JSNumber; + final ptr = _module!._malloc(16 * 8); _module!.ccall("get_camera_projection_matrix", "void", ["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null); final matrix = _matrixFromPtr(ptr); @@ -1337,7 +1352,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future getCameraViewMatrix() async { - final ptr = _module!._malloc(16 * 8) as JSNumber; + final ptr = _module!._malloc(16 * 8); _module!.ccall("get_camera_view_matrix", "void", ["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null); final matrix = Matrix4.zero(); @@ -1364,7 +1379,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future> getInstances(ThermionEntity entity) async { final instanceCount = await getInstanceCount(entity); - final buf = _module!._malloc(instanceCount * 4) as JSNumber; + final buf = _module!._malloc(instanceCount * 4); _module!.ccall( "get_instances", "void", @@ -1384,7 +1399,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future getInverseBindMatrix(ThermionEntity parent, int boneIndex, {int skinIndex = 0}) async { - final ptr = _module!._malloc(16 * 4) as JSNumber; + final ptr = _module!._malloc(16 * 4); _module!.ccall( "get_inverse_bind_matrix", "void", @@ -1398,7 +1413,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future getLocalTransform(ThermionEntity entity) async { - final ptr = _module!._malloc(16 * 4) as JSNumber; + final ptr = _module!._malloc(16 * 4); _module!.ccall( "get_local_transform", "void", @@ -1624,7 +1639,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future rotateIbl(Matrix3 rotation) async { - final ptr = _module!._malloc(9 * 4) as JSNumber; + final ptr = _module!._malloc(9 * 4); for (int i = 0; i < 9; i++) { _module!.setValue( (ptr.toDartInt + (i * 4)).toJS, rotation.storage[i].toJS, "float"); @@ -1707,7 +1722,7 @@ class ThermionViewerWasm implements ThermionViewer { Future setBoneTransform( ThermionEntity entity, int boneIndex, Matrix4 transform, {int skinIndex = 0}) async { - final ptr = _module!._malloc(16 * 4) as JSNumber; + final ptr = _module!._malloc(16 * 4); for (int i = 0; i < 16; i++) { _module!.setValue( (ptr.toDartInt + (i * 4)).toJS, transform.storage[i].toJS, "float"); @@ -1817,7 +1832,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future setCameraModelMatrix(List matrix) async { assert(matrix.length == 16, "Matrix must have 16 elements"); - final ptr = _module!._malloc(16 * 8) as JSNumber; + final ptr = _module!._malloc(16 * 8); for (int i = 0; i < 16; i++) { _module! .setValue((ptr.toDartInt + (i * 8)).toJS, matrix[i].toJS, "double"); @@ -1963,7 +1978,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future setTransform(ThermionEntity entity, Matrix4 transform) async { - final ptr = _module!._malloc(16 * 4) as JSNumber; + final ptr = _module!._malloc(16 * 4); for (int i = 0; i < 16; i++) { _module!.setValue( (ptr.toDartInt + (i * 4)).toJS, transform.storage[i].toJS, "float"); @@ -2064,7 +2079,7 @@ class ThermionViewerWasm implements ThermionViewer { // Helper method to allocate a string in the WASM memory JSNumber _allocateString(String str) { final bytes = utf8.encode(str); - final ptr = _module!._malloc(bytes.length + 1) as JSNumber; + final ptr = _module!._malloc(bytes.length + 1); for (var i = 0; i < bytes.length; i++) { _module!.setValue((ptr.toDartInt + i).toJS, bytes[i].toJS, "i8"); } @@ -2187,4 +2202,58 @@ class ThermionViewerWasm implements ThermionViewer { ].toJS, null); } + + @override + Future createIbl(double r, double g, double b, double intensity) async { + _module!.ccall( + "create_ibl", + "void", + [ + "void*".toJS, + "double".toJS, + "double".toJS, + "double".toJS, + "double".toJS, + ].toJS, + [_sceneManager!, r.toJS, g.toJS, b.toJS, intensity.toJS].toJS, + null); + } + + late JSNumber _pickGizmoCallbackPtr; + + void _onPickGizmoCallback(ThermionEntity entity, int x, int y) { + _gizmoPickResultController + .add((entity: entity, x: x.toDouble(), y: y.toDouble())); + } + + @override + void pickGizmo(int x, int y) { + x = (x * pixelRatio).ceil(); + y = (viewportDimensions.$2 - (y * pixelRatio)).ceil(); + + _module!.ccall( + "pick_gizmo", + "void", + [ + "void*".toJS, + "int".toJS, + "int".toJS, + "void*".toJS, + ].toJS, + [_sceneManager!, x.toJS, y.toJS, _pickGizmoCallbackPtr].toJS, + null); + } + + @override + Future setGizmoVisibility(bool visible) async { + _module!.ccall( + "set_gizmo_visibility", + "void", + [ + "void*".toJS, + "bool".toJS, + ].toJS, + [_sceneManager!, visible.toJS].toJS, + null); + } } From 51e06c2eb95c33ba95ee25179d1666c0c4764103 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:52:53 +0800 Subject: [PATCH 062/232] chore: (js) stub missing methods --- .../web/interop/thermion_viewer_js.dart | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart index 02b454f7..b44fde87 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart @@ -881,4 +881,34 @@ class ThermionViewerJS implements ThermionViewer { // TODO: implement queueRelativePositionUpdateWorldAxis throw UnimplementedError(); } + + @override + double pixelRatio; + + @override + Future createIbl(double r, double g, double b, double intensity) { + // TODO: implement createIbl + throw UnimplementedError(); + } + + @override + // TODO: implement gizmoPickResult + Stream get gizmoPickResult => throw UnimplementedError(); + + @override + void pickGizmo(int x, int y) { + // TODO: implement pickGizmo + } + + @override + Future setGizmoVisibility(bool visible) { + // TODO: implement setGizmoVisibility + throw UnimplementedError(); + } + + @override + Future setLayerEnabled(int layer, bool enabled) { + // TODO: implement setLayerEnabled + throw UnimplementedError(); + } } From 0bd87288d13ddb9e73f4c0a0693142f7babdc96e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 17:53:24 +0800 Subject: [PATCH 063/232] chore: update binding --- .../compatibility/native/thermion_dart.g.dart | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart index 89a692a9..6870b0d7 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart @@ -106,6 +106,17 @@ external void load_ibl( double intensity, ); +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() +external void create_ibl( + ffi.Pointer viewer, + double r, + double g, + double b, + double intensity, +); + @ffi.Native, ffi.Pointer)>() external void rotate_ibl( ffi.Pointer viewer, @@ -1054,6 +1065,30 @@ external void set_layer_enabled( bool enabled, ); +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(EntityId entityId, ffi.Int x, ffi.Int y)>>)>() +external void pick_gizmo( + ffi.Pointer sceneManager, + int x, + int y, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(EntityId entityId, ffi.Int x, ffi.Int y)>> + callback, +); + +@ffi.Native, ffi.Bool)>() +external void set_gizmo_visibility( + ffi.Pointer sceneManager, + bool visible, +); + @ffi.Native< ffi.Void Function( ffi.Pointer, @@ -1577,20 +1612,6 @@ final class Aabb2 extends ffi.Struct { external double maxY; } -final class int32_t_4 extends ffi.Struct { - @ffi.Int32() - external int i0; - - @ffi.Int32() - external int i1; - - @ffi.Int32() - external int i2; - - @ffi.Int32() - external int i3; -} - /// This header replicates most of the methods in ThermionDartApi.h. /// It represents the interface for: /// - invoking those methods that must be called on the main Filament engine thread From 80d5b1d23f5ce3033425dba1db12a1bc517ef7af Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 22:18:54 +0800 Subject: [PATCH 064/232] feat: expose setLightDirection and setLightPosition --- .../compatibility/native/thermion_dart.g.dart | 22 ++++++++ .../web/interop/thermion_viewer_wasm.dart | 24 +++++++++ .../lib/thermion_dart/thermion_viewer.dart | 12 ++++- .../thermion_dart/thermion_viewer_ffi.dart | 18 +++++++ .../native/include/FilamentViewer.hpp | 2 + .../native/include/ThermionDartApi.h | 2 + thermion_dart/native/src/FilamentViewer.cpp | 53 ++++++++++++------- thermion_dart/native/src/ThermionDartApi.cpp | 8 +++ 8 files changed, 122 insertions(+), 19 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart index 6870b0d7..b27410e5 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart @@ -183,6 +183,28 @@ external void clear_lights( ffi.Pointer viewer, ); +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>() +external void set_light_position( + ffi.Pointer viewer, + int light, + double x, + double y, + double z, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>() +external void set_light_direction( + ffi.Pointer viewer, + int light, + double x, + double y, + double z, +); + @ffi.Native< EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Int)>() external int load_glb( diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart index 6ca4316a..9c758c45 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart @@ -2256,4 +2256,28 @@ class ThermionViewerWasm implements ThermionViewer { [_sceneManager!, visible.toJS].toJS, null); } + + @override + Future setLightDirection(ThermionEntity lightEntity, Vector3 direction) async { + direction.normalize(); + _module!.ccall( + "set_light_direction", + "void", + ["void*".toJS, "double".toJS, "double".toJS, "double".toJS].toJS, + [_viewer!, direction.x.toJS, direction.y.toJS, direction.z.toJS] + .toJS, + null); + } + + @override + Future setLightPosition( + ThermionEntity lightEntity, double x, double y, double z) async { + _module!.ccall( + "set_light_position", + "void", + ["void*".toJS, "double".toJS, "double".toJS, "double".toJS].toJS, + [_viewer!, x.toJS,y.toJS,z.toJS] + .toJS, + null); + } } diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index e3fb36de..7ace4468 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -570,10 +570,20 @@ abstract class ThermionViewer { Future transformToUnitCube(ThermionEntity entity); /// - /// Directly sets the world space position for [entity] to the given coordinates, skipping all collision detection. + /// Directly sets the world space position for [entity] to the given coordinates. /// Future setPosition(ThermionEntity entity, double x, double y, double z); + /// + /// Set the world space position for [lightEntity] to the given coordinates. + /// + Future setLightPosition(ThermionEntity lightEntity, double x, double y, double z); + + /// + /// Sets the world space direction for [lightEntity] to the given vector. + /// + Future setLightDirection(ThermionEntity lightEntity, Vector3 direction); + /// /// Directly sets the scale for [entity], skipping all collision detection. /// diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index 8d7fad1b..c195ee43 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -1287,6 +1287,24 @@ class ThermionViewerFFI extends ThermionViewer { set_position(_sceneManager!, entity, x, y, z); } + /// + /// + /// + @override + Future setLightPosition( + ThermionEntity lightEntity, double x, double y, double z) async { + set_light_position(_viewer!, lightEntity, x, y, z); + } + + /// + /// + /// + @override + Future setLightDirection(ThermionEntity lightEntity, Vector3 direction) async { + direction.normalize(); + set_light_direction(_viewer!, lightEntity, direction.x, direction.y, direction.z); + } + /// /// /// diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index 23eceab6..ead61fbb 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -147,6 +147,8 @@ namespace thermion_filament float sunHaloSize, float sunHaloFallof, bool shadows); + void setLightPosition(EntityId entityId, float x, float y, float z); + void setLightDirection(EntityId entityId, float x, float y, float z); void removeLight(EntityId entityId); void clearLights(); void setPostProcessing(bool enabled); diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index ee03a5a8..5dde05d6 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -93,6 +93,8 @@ extern "C" bool shadows); EMSCRIPTEN_KEEPALIVE void remove_light(const void *const viewer, EntityId entityId); EMSCRIPTEN_KEEPALIVE void clear_lights(const void *const viewer); + EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, EntityId light, float x, float y, float z); + EMSCRIPTEN_KEEPALIVE void set_light_direction(const void *const viewer, EntityId light, float x, float y, float z); EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances); EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length); EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath); diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 15c35c30..98b0ea8f 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -288,7 +288,6 @@ namespace thermion_filament fro.interval = 1; // frameInterval; fro.history = 5; _renderer->setFrameRateOptions(fro); - Log("Set frame interval to %f", frameInterval); } EntityId FilamentViewer::addLight( @@ -310,9 +309,6 @@ namespace thermion_filament bool shadows) { auto light = EntityManager::get().create(); - auto &transformManager = _engine->getTransformManager(); - transformManager.create(light); - auto parent = transformManager.getInstance(light); auto result = LightManager::Builder(t) .color(Color::cct(colour)) @@ -336,16 +332,43 @@ namespace thermion_filament _lights.push_back(light); } - auto entityId = Entity::smuggle(light); - auto transformInstance = transformManager.getInstance(light); - transformManager.setTransform(transformInstance, math::mat4::translation(math::float3{posX, posY, posZ})); - // Log("Added light under entity ID %d of type %d with colour %f intensity %f at (%f, %f, %f) with direction (%f, %f, %f) with shadows %d", entityId, t, colour, intensity, posX, posY, posZ, dirX, dirY, dirZ, shadows); - return entityId; + return Entity::smuggle(light); + } + + void FilamentViewer::setLightPosition(EntityId entityId, float x, float y, float z) { + auto light = Entity::import(entityId); + + if(light.isNull()) { + Log("Light not found for entity %d", entityId); + return; + } + + auto& lm = _engine->getLightManager(); + + auto instance = lm.getInstance(light); + + lm.setPosition(instance, filament::math::float3 { x, y, z }); + + } + + void FilamentViewer::setLightDirection(EntityId entityId, float x, float y, float z) { + auto light = Entity::import(entityId); + + if(light.isNull()) { + Log("Light not found for entity %d", entityId); + return; + } + + auto& lm = _engine->getLightManager(); + + auto instance = lm.getInstance(light); + + lm.setDirection(instance, filament::math::float3 { x, y, z }); + } void FilamentViewer::removeLight(EntityId entityId) { - Log("Removing light with entity ID %d", entityId); auto entity = utils::Entity::import(entityId); if (entity.isNull()) { @@ -361,7 +384,6 @@ namespace thermion_filament void FilamentViewer::clearLights() { - Log("Removing all lights"); _scene->removeEntities(_lights.data(), _lights.size()); EntityManager::get().destroy(_lights.size(), _lights.data()); _lights.clear(); @@ -1364,7 +1386,6 @@ namespace thermion_filament { if (!_view || !_mainCamera) { - Log("Skipping camera update, no view or camrea"); return; } @@ -1379,8 +1400,6 @@ namespace thermion_filament cam.setLensProjection(_cameraFocalLength, aspect, _near, _far); - Log("Set viewport to width: %d height: %d aspect %f scaleFactor : %f", width, height, aspect, - contentScaleFactor); } void FilamentViewer::setViewFrustumCulling(bool enabled) @@ -1398,7 +1417,7 @@ namespace thermion_filament { Camera &cam = _view->getCamera(); const auto &vp = _view->getViewport(); - auto aspect = vp.width / vp.height; + const float aspect = static_cast(vp.width) / static_cast(vp.height); cam.setProjection(fovInDegrees, aspect, _near, _far, horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); } @@ -1672,7 +1691,7 @@ namespace thermion_filament if (materialPath) { auto matData = _resourceLoaderWrapper->load(materialPath); - auto mat = Material::Builder().package(matData.data, matData.size).build(*_engine); + mat = Material::Builder().package(matData.data, matData.size).build(*_engine); _resourceLoaderWrapper->free(matData); } @@ -1706,8 +1725,6 @@ namespace thermion_filament _scene->addEntity(renderable); - Log("Created geometry with primitive type %d (result %d)", primitiveType, result); - return Entity::smuggle(renderable); } diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index ce79c961..1ccf1df7 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -148,6 +148,14 @@ extern "C" shadows); } + EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, int32_t entityId, float x, float y, float z) { + ((FilamentViewer*)viewer)->setLightPosition(entityId, x, y, z); + } + + EMSCRIPTEN_KEEPALIVE void set_light_direction(const void *const viewer, int32_t entityId, float x, float y, float z) { + ((FilamentViewer*)viewer)->setLightDirection(entityId, x, y, z); + } + EMSCRIPTEN_KEEPALIVE void remove_light(const void *const viewer, int32_t entityId) { ((FilamentViewer *)viewer)->removeLight(entityId); From 0798d5c071d9236c8e1d75464b6087f2beedc057 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 22:19:27 +0800 Subject: [PATCH 065/232] feat: add grid material --- Makefile | 4 + thermion_dart/hook/build.dart | 2 +- thermion_dart/native/include/material/grid.S | 12 + .../native/include/material/grid.apple.S | 12 + .../native/include/material/grid.bin | Bin 0 -> 30210 bytes thermion_dart/native/include/material/grid.c | 1521 +++++++++++++++++ thermion_dart/native/include/material/grid.h | 13 + 7 files changed, 1563 insertions(+), 1 deletion(-) create mode 100644 thermion_dart/native/include/material/grid.S create mode 100644 thermion_dart/native/include/material/grid.apple.S create mode 100644 thermion_dart/native/include/material/grid.bin create mode 100644 thermion_dart/native/include/material/grid.c create mode 100644 thermion_dart/native/include/material/grid.h diff --git a/Makefile b/Makefile index 498f7c23..5fb8f801 100644 --- a/Makefile +++ b/Makefile @@ -26,10 +26,14 @@ materials: FORCE $(FILAMENT_PATH)/resgen -c -p image -x thermion_dart/native/include/material/ materials/image.filamat $(FILAMENT_PATH)/matc -a opengl -a metal -o materials/gizmo.filamat materials/gizmo.mat $(FILAMENT_PATH)/resgen -c -p gizmo -x thermion_dart/native/include/material/ materials/gizmo.filamat + ${FILAMENT_PATH}/matc -a opengl -a metal -o materials/grid.filamat materials/grid.mat + $(FILAMENT_PATH)/resgen -c -p grid -x thermion_dart/native/include/material/ materials/grid.filamat echo '#include "gizmo.h"' | cat - thermion_dart/native/include/material/gizmo.c > thermion_dart/native/include/material/gizmo.c.new echo '#include "image.h"' | cat - thermion_dart/native/include/material/image.c > thermion_dart/native/include/material/image.c.new + echo '#include "grid.h"' | cat - thermion_dart/native/include/material/grid.c > thermion_dart/native/include/material/grid.c.new mv thermion_dart/native/include/material/image.c.new thermion_dart/native/include/material/image.c mv thermion_dart/native/include/material/gizmo.c.new thermion_dart/native/include/material/gizmo.c + mv thermion_dart/native/include/material/grid.c.new thermion_dart/native/include/material/grid.c #rm materials/*.filamat diff --git a/thermion_dart/hook/build.dart b/thermion_dart/hook/build.dart index 830ac0d4..f7b4943a 100644 --- a/thermion_dart/hook/build.dart +++ b/thermion_dart/hook/build.dart @@ -60,6 +60,7 @@ void main(List args) async { sources.addAll([ "${config.packageRoot.toFilePath()}/native/include/material/gizmo.c", "${config.packageRoot.toFilePath()}/native/include/material/image.c", + "${config.packageRoot.toFilePath()}/native/include/material/grid.c", ]); var libs = [ @@ -76,7 +77,6 @@ void main(List args) async { "image", "imageio", "tinyexr", - "gltfio_core", "filaflat", "dracodec", "ibl", diff --git a/thermion_dart/native/include/material/grid.S b/thermion_dart/native/include/material/grid.S new file mode 100644 index 00000000..3cb7bc24 --- /dev/null +++ b/thermion_dart/native/include/material/grid.S @@ -0,0 +1,12 @@ + .global GRID_GRID_OFFSET; + .global GRID_GRID_SIZE; + + .global GRID_PACKAGE + .section .rodata +GRID_PACKAGE: + .incbin "grid.bin" +GRID_GRID_OFFSET: + .int 0 +GRID_GRID_SIZE: + .int 30210 + diff --git a/thermion_dart/native/include/material/grid.apple.S b/thermion_dart/native/include/material/grid.apple.S new file mode 100644 index 00000000..491a62d8 --- /dev/null +++ b/thermion_dart/native/include/material/grid.apple.S @@ -0,0 +1,12 @@ + .global _GRID_GRID_OFFSET; + .global _GRID_GRID_SIZE; + + .global _GRID_PACKAGE + .section __TEXT,__const +_GRID_PACKAGE: + .incbin "grid.bin" +_GRID_GRID_OFFSET: + .int 0 +_GRID_GRID_SIZE: + .int 30210 + diff --git a/thermion_dart/native/include/material/grid.bin b/thermion_dart/native/include/material/grid.bin new file mode 100644 index 0000000000000000000000000000000000000000..1c5dd192ce8c389c453ad5cc274bf1e119f4d23b GIT binary patch literal 30210 zcmeHQ33y~jajt$o);5Qi+va>=Fe6(#)*LHoy!K+Pr1c7Fyq zTJ0Lca^GMK35HyRko$(*IOHNHkdT9ro7{nf+#v@EN&c$tey`t~H(IUj5D3xd)qCAt zU0q#WT~%FOPhOaxJYHTLo4JsP3i!7;HhGxK3h!!iX6z^zE<)kvR;^0Y6Eh1I`eIZb zotd4m(6l&xI7Bsw#=}!bk8$Juc)#>;tFjRsYt&Yot&KL(?D8GKN+&F<>Dt?Vvs%tTbEIu=ZkI8+F@rsM!djqBqlQZLZfEYhjNIW-6VaRjbtJ zDxjxLm(0zK$%H-v8ZRVo&mQGnx`!@R>N2V`N#(W>GE>{J?SL8H^AOP6`3rc13+t*r#@u}1YoAbceM(3G(LMocR)We-*Svr*ZesI`G` zCD0Z4ec=Tw&3dyHmM^{lh=e~+LR|upg<3c|JI>2|iLJoXKXmMz-4-0tnQ{w9C#Mft zp;8kw^NY4X(}ySL!@|`32^m);b>YNhD2NIzQDI?nF)YyH!qKS^!NPccEG*2%3Nyz- z)HF9cKgVD^KOT#JCZ>)Ff4MIE_AlJ@nU{Zj&&1dfnX|x5&p3q{m+VEiFh4sL4y49z z(X->N$VkS<<|2giW5=byjqiTfl?UgKEQaNeeRTTZ?1bLOGWz_YGtIe)g=mb$TPGLG z<5LqWw-db;qHxt#&}u{4{KC+XAGE10QtI2KJ|46>!S+;RvkRHKo3?_LqJOH{s#oWX zlpdga4%kj}L2Eu}RD)J!xgJbZIu*!R$G~H!Zp<{RK^>S|we17kRM4oxrlU{|l@OrT z==jbC7;knPodd+RtM$rSdwjjpXax1Pu4;-pnW`S3)q1ni@w@Gy#S|RSB)0;Tw}R@@ z=*a_gRc#eSuKEjeQ}f5mqWNX|{k{&P~Y-(RiN+kv5Cx!J5+GUjGaK$?!v zmluwVP2las?EDMH=4X!`o!E(}{RgOCIo<4bGVM+^R~#DfyIN)Y35DIW)_!FvjRD~I zJ-%KYtAzUw5jPPcJ6J$@E}Q3yd19fZK3FPZ1bJOG&o#5=>+;O|H7gT$*q1vEMBO|$ z3}nMRo4^!QYu$}ah#E`NX0qb0r~+Fe@3$;!h@Hn>yP$Ql~7=r^4v2HkYZ8uTs=3ikIjwR>thJvCjYrpqI2p+cs33NLzy zZ3jlzoJNg6p9z5~(d#n5+C>yxD{hTOQH|h(-qzKqbuD^b7eLmTHS@-7=D}FS-YIV} z*{SzdZS+<(daIgTCCj*Z=8WE61~K#KuHFu<-l}$QRmZIo^j$_jBno2Hbq+)QP;ahO z*b{;hg(9joeCf6kwAVu?iPs4m6begJa1FYc9hx#cq5#{8>!lN{9PC&*VY-sd*7d^t zo3*OHQK>aD15{h}Ge))Tpi}`D8yrMua{jgcTD?4F8m1-&{C$278j)bQg5C}>ShEP_ z!cYmgW{ltJ8stn|uVyPtaS~2uWxk<(1rC^A{~ABW!T}8x8FVnL;Foiw!x)xF&u+8K zr*Sa5%^-lxg4d}4r!4?fSt`I83t)w=oGXo@E+!G#U}@+i=w@m{Ja(}JL22{=anCH{ z%b2%o5?E^4?E$QaZaxKk@j+_Y(*p+xYhYOsV%}^8D>dXb3Z2uEd-&VkYfob-3YR!e~QZ3{WdTT&>{? zcB^g-vV5LpHX*BL&akv%l*;t(GMwd`sI+nc=&rvWa=2Uu+Q4Kkr|_aF)Nr=8G#7JWv$FC%^6&Q-SArzrqy zy!$qG9dDZf2%zr1u~}Y$!%)r(7Jk^4a(q`i?;(hn8175>|sd6NN!j&EIu+c zwq{&nZS$f+G_^_p3yPcl<2WKw-U-?TM;WN>;$a)-!NyT`9J`Ip%F3NbD)rU;c5XPq zdyF8QX4f`84y+AU3ugq5&`vk2nNX4k{Z6aWXv5tMc!L)bDA(YcYW)^RxVDt*Q=gZ5 zEWMV&LGT>w2kNt@u}}HAJ?O90v8yuS8jR*-C5;k=7G=B2%ukz$>^-baAuqa%p{_}a zXTa0tHP<>-RuWsDML#|d*w@sREEJjByOTqh>wbc$(UkG9i)rM%FwAn!qFrrvG7Sk0 z*3JYOQ3y$aTt73Q2e8s?8K<$7@ep<~$-)+#0uuAQ1N-$fGbKKKRG;FN%4{}Ih06hS zNeaLw0gLY)OiMN&R>}@-DJ&O8cy&Z)W#Lb1Q&bpbduJ3Gs(2Metl8G&4TWZd%IfI@ z4WsAd(MSo)sZnmrR9Tp8jhw}Rjg_8;k;50)gzj2-SWcS{pN${MS=-8(Q*AszKr7Eb zh2Dl+nrB_>mzNHPpZzDWed#@eB`j&G7wf zJhy4ZB8Y%Oq|L=DbA%YMzTLfz2Wy}bV2tH=DfxSJC~o6-2WVt%lW)K?B>s2tCK|{hLH&2%*Z(S^})NAlFy7hXwYHk?)>-|=6R~KQ4b6&rUp7YXU z)XzhKC9Yi-7ANN?XUmhfP2w`=*wIBytKS6=OpUCJc;xYr876K*eMx*)eno4~>?#^p z9)avXgb>{55O0K$a|Yl>hjxy?p&cqeb<2tcKsyY8h;O;nyXAvKSkZq@KORYpPM;Pe z+-e1ir%{5pCR`WqKEd_A7(;6*2R_+%HWr&)AXXr9TT?Evlb**J4Zby>+ibOXLuiDJ zmwi$$6a6`8ag`#h-R})4;nONqB8-LHH z2151vx#4x551(1XE97Es2)ClHG8mgbBncGIY2`Xn7rK?Tpv?X`DxeaA2HzCh8%IYu z;yAryT;GIAoF2sixdad)PLuSsXvauzA1kqTI}~!f2Y0vK<1+n_cD@b1=diPN@ExJz zog?EpoXk_%V((4Txnd9V=YNO?tL^dKY_PP0yJTboqn9OhZIp!aiy@U^U-;p){+YpKSb?rxt+769JNF&{|CI+-n|7QU;nxCiYBoOBR!*iMDZ%(3gq0bNI|aXcBh=mxslRCQ%PdCaSFv{-#P9BONE{N5$K7X z9TElzJ(BzooAbCZo~KI!qC@}3a-OXhP#dQtFM2+)0O$5f@;N@^iMl$sTauUHq47)5 zGjvSya(*pyd+3^gAU5NmP&+63CGt+tKczkCpfF0uL%~4eB`~u7K8hYHayJm4+_{@| zQ<5DK)Jjar@l-Sob`IKC;kq5173s1&Zv~*dvPpLZn}D;f8Y}f~HSllP2s)K|8JSM? z+VVlCzFpg>UdO+(>j#OtZT40gNMCKkbqR2Lj$Q}I$B(Rhal7B?Gz2MZ?|eRGKvo33 z`EIr)aW=Kp_DtuHwarD2H*=n}v#NP%8E-al;qMBc->GdNc_1VOA?%IKW~)*^ z+N`zRhN8&DVjQ~2a?z}Jb*ey!1Q*H8wc1Lh&O8IQ&H~M{8Ti_}L2D$pL+2JI}&{JzQzc)EeFPQDjNDs2eEn)V_k< z+p3_q+X)UvvyE_ntZpke1W!6-h2IE*YJ04{xn40Dr*31VxxklS&=0qCEA?9EG*Yl9 zt80Nh^~GTiA#+>jxVmg9`e)`O8C?VO=_sg{`L?{^uevR~S>;wDN_`E<%)>x(g1p4E zZoSPN7y0VbU0myMUR0t!OevXd1k=G*;0hM*$(QR3M{ImHU8HY><-D(x?y+2B9e{Tw3oOZss?Bk!)b+;# zE>rz>oA(N&O}C{iNYP)Zv{x$CU;zu*F`b#mraF#Jz5uU`(&D1ts%29trzB)Kusn?sU$ovTx zlJSpsJJ{-R{`Zh3qLJ*#;=-zOYT1=b#yQo%!a*`x5VSPw}H1gU0;J1?#y7_9TXB8H+qsZ~)G=dPAB zR4>3@R^7=%@7yKnHF#gww0S zshV@40wXUe^ zNb1B^Am|y#3Lwxhwy52eQ@72e!C+3I#Mb2SEbbKWA+MyigL*>&WB@D)1WYM4uHt|}%j|LqaLSr~g1FCu>_ zT|^KDi6ym#JVREN3@D-?Nn%FwWoWc=-Wx;9eKf=N+>1NQqc`8((t$g1cg)62gD*1l zy}23V9s!j6a)#y~&4i*vi};-{9}Ki@Ms!){)M>Q*yO2z0lf_4#1!gy#=+1R~tt;5$ z%aV1cqNi;K3pSNWvk$v4_}k%0N#&$mVnbi-?~*Q*c732igX` zlw67}Cs$Z_$sptk{xOmfagDWGw0%vWst6)S@)$qdz~RRZL-^Xkn7a1n)SId=Ft8)4VS&4(%^^LxjWdl+*dcxc+BtaH%Zfa?`oES=zdzG)o zaq7=)HDF!<;|O)TgRS6VTR~D{4?g?Bu12a|iyovF$id8NfqCk$~o{E9%*MKP9?i|5f@8w>f*E3tBSL(;kfoq66ov)$_~<8Y;AhE2`|`SOj{eY zy14Ypgkl%@6Y{njm#B|aUhO9va-hmMNcn_=bl43y?b@w+(6(n-a`e84wx?8(D|~&! zjnR#!VdV#HR>~RIU9>5~p4;|_Zb8Q#tPX={Ra+`>GM1>?R5LRyNr^&DhJW`rGr;6% zNsIl#n3+;xXERgE8H3Eza2R9EOsODd23Q<3eW<1#9F4M;9C?jK|2pE4RG z4GlR8k#Q*%*|>lX{N|Ol#>K4%u|38G^JC)zoC&LA8e+qlzvtOaAtjkPe@hV zKg8o;gGYbqA=`UShRNQ^r|L-|JH^4@_)$4ZDr07eFoEE_@sX=d;%fd8%8;fo!~$S8 zA(QC{maI1eBvZ>lc|3R#`526v#{*I=$uS-|$Qf|C6;$vY6TkA0B`GiIfuO}6F=CCq zcU~YT7H474XC&{es6kxfj7!GFKRh`}Wgmf4j2VWh?7CV1#!|EM!G6lVp2ag!Bjm3P z>SXp*s2F9CP7u~}xf@2HkQqGyKeF#o`IC|s50ayaFr}8xqVutr@J`H0Ey zDLyZ#+|OdcDeuS=;w(>rH22QT6kNwu+MVmKhYyQnd&o#KJ)JEa2hePKGo~dtdgeA0 zhSc2M$*|ZrrC}>c$S!BaolG)kQRIVJT3^0M>1<>pYN~mm2Zfx(t z_YSWXO)2LXw^RvD#%t506l6&L9uviP(~LZMj8C~{kSQAxObBoaG;YOt z9+K>@=NoQ+{t7`WgXmiXv(TwqR ze^E}qn%Vt~oLT45{p_1Tm2!AZKBcf~l@+bzNTLF($Vrlb;S2;TiZTGIbtXPqqb9D@ zaXSoP<96In8YE7~4W|=5bY?3W9Dz3`n>$9(j(NVvKeb+~2Uur(o^Pm&O`5Hwj<_%? zK!m|s4mER{H6UzUR3P2dAe>1at^nG3MR~Ql=ZWB-n>TLtyHI*CnKv$>*q+pJ=6nJb zuR#k%QDW{UMo6%u{NYdoYysUk0l7%l6@s2mI&t!zzSb@4L4oeCxm|12!7VLV{wL zIe+q`zhoU7S*K)&@({YnMG5!Q2YX(mbYMOhhrs%9&%h$S!|Vm}+9sm;JLJTN13^^` z^Y%{*=a+~3=fOXi`2BFG2AJ6X;d{UttDVNA5i$6P76a2ktqJU=4X zW7%C_oO`(u`H+R>i0SOVu|eVPb~Xbhw)T16%Zw5^I;S zI(4_Q1{Z=(;4)+L(F7!o2^}f)Nkm z^3b~!3?14ttFHYi<|_Z_N@yL4&l->fV|EmbFkZ;mB&enddys-rl0V#V-hy$?fT}AP z7{dxiESwrvC+5E!!3fvJGIYP3X<`Bt*SBHZk{QQ8_Lzd6k@O2X8?rJ{sqk+#Jd}`C zO60)_RwW4FV3iwiVsiQH#_^*(`vOvU*y2Yr>12Q>42D6k7yvmw?i4-xKOSHbHsElb z$H)EfVw~bO7bS?H|DuFAJr94pNunDj8^Xkyj337m!apoGkdK{Lv{%~VF{rpp?uMT@ zs1T1n>5+I`CzxO;vEh!C@0`-2LOPleA3O~%`b!Z}*!baz8>MX0SbzsfjuN=i+U-2m zK@3wORFtwJCd>ovWWzjq)ZQo$gSb&1SrYc?b(kmAZ!zTvAz=lm2i9Sg5x$UOpa*v_ zEfiVuQctG25rlce3nu3e6hodK%+VA>*$@@e+uwy{z+D|q8L-EN<&$#ie*ms9X7QmKyxHR~|Rv^<_*3=Xk8H_}0R9^FJ^bcn`jf+p!O z-AqSlik?p|plO<+qclr%bPLVX0xi-pI!-6(R=SN|NK14(oun60nO;m4TBa4MQb4Pq zZw>#}sYZ9;c_*HA+MotCX_M}v7PYB^x>a!L9^pclw&)Zfx9K#Up}XlNsK1b23Lc%6 z*}j}!L9e7&(W|jcucg<~>*)>jMtT#ynchNgrF-dZbRWH)-a%hQUrq0%`{`ZuZu%Pf zTKYQrdin->4}BxOm%fSKN8e1}Lf=Z?M&C}~LElN=Mc+-|L*Gl^N8eBHrw`B%&=1lN z(GSy)(2vrO(Ff@P`f>UY{RI6a{S^H){S1AWewKcYex81Tei5_%CD8j3`Y3&jewltn z=KOK`Rr)p5{<@j>Z_p>`H|dk8`7Qcw`W;jIyLkQ{{{24w-GbRee(=K_V7}GpS&t@A zVC#Ch@(1)O`ok{+uKbbk<&QC^KcPRx??1!b{+#}TK8^R!;GHGoFY){<`Yio5{SEys z%6~_HPyaywXj=aX&(G06)4!nQU+LfI^YriZAExaKc>X8-7dDVmp1MFWcIMxO>LPWq z@@S9JBV3{`RhOwppyrY4QR>mA_HsP;;@@M`W7Xr-37XDA-kSI-27x1qQG|4;C0YMFQz>Ob@df}HZtRcbf;{n_d{ z>TRL6Z_NlD84q7#*@~WVUYQGv*BWhHYz@xKZ+*xqw zdUaq|JUV~gXf0uNV!DoqUl<_syuIj_$h;ePPaJ-6GBRIe1*G`F6XjAH3%K-;wwm)H3zk-Lq;= z-J<5zf?8C^)Nyq}-KuU=FH}qFc6Cy{NR`!#RR!xgy*N3;-s$I4z0><*-l@2yzIp(Q z1wHyg_D3hwhxl=pKFyDN<$>m>Lyy2ay@nmpy}GnlyjpmtdFWbrr`#RhDR=kI(ucKo z%8%Bg2>uq)vRYA972qFB#Hw0T>#C;iPNfFqmujiD>Zq>T zQm53mI<3yAyVXn7J?f?EW$LVYxq5|qrFxZmwR(+ut$Lk$y?TRsBmD3;tGB4Ps(aPj z)P3sh>K*E<)K{x_s{7Tu)VtN!sIOIDr@mf&gL;qpM)h9xP3nE>o7K0dZ&lx>zFmEX z`cCy->buqVsP9$Zr@mjkUwuIRfcio8L+XdskEkCN%6<%#eNa81eq4P>%0GefPs-a* z;q9l@&!`WppH)AneqQ~8`bG6i>LXa2s(LJV@v0avzI12!QOx6G>X*aW{z^E{56aue zWuCvPeog(l`VI97^_%LG>bLOxZS_0qch&Ey-&cR2KBfLp{gL`(^(X32)t{mC=Xm}F z;682mQ3Wp`B93f)23VO>tt$!su-o$G!KuGgf2BUF{#yNw`djsP>hIM*sDD)dq&}zq zS^bOp*S@^`H{s>y)xWF%P+tHK|I_gDzu@30&+{(uF7!U7F7ht+_IQ_gnwOX2d71Y~ z^$72g-lM!nd!JC3dwT)(81J!Yd7Srn?+M-$QGSwvzXH!Iy(fE5@t*2E4fRj=o?%*i zJfG=3%exA-&o*_>!SibGxn9N_@UHQ$^#;9tUe>$L({lX41^9o2#a3tcdwR&LD&9Rg zk9R%qn+Jq1d5`x^!7G|EJ`4PhiH*U%v=r_a*kJ>?39xs@Aa_sAh&Kv)zI0{F)iWjU zdhbBUwYavq!Mo8r=snN7$s6+ydE?%MH|ZVrZuX9NQ{MBv7kJa&jCa(V_2#@=4A;I= z_42&8;4ON`yyIS^mtP03@N7(izH}vGcY67RcdK_BbixavAy_LfdAEBfvAjU3<#WwcFn5n5I2rR^AlK( bwf7qDwchKz*L!d9-sru_d$aczN4Nbq|Dct6 literal 0 HcmV?d00001 diff --git a/thermion_dart/native/include/material/grid.c b/thermion_dart/native/include/material/grid.c new file mode 100644 index 00000000..f68f4007 --- /dev/null +++ b/thermion_dart/native/include/material/grid.c @@ -0,0 +1,1521 @@ +#include "grid.h" +#include + +const uint8_t GRID_PACKAGE[] = { +// GRID +0x53, 0x52, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x54, 0x41, 0x45, 0x46, +0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x45, 0x4d, 0x41, 0x4e, 0x5f, 0x54, 0x41, 0x4d, 0x05, 0x00, 0x00, +0x00, 0x47, 0x72, 0x69, 0x64, 0x00, 0x4c, 0x44, 0x4d, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, +0x00, 0x00, 0x4e, 0x4d, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4c, 0x46, 0x56, 0x5f, +0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x46, 0x49, 0x4e, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x98, +0x00, 0x00, 0x00, 0x09, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x00, 0x4f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x01, 0x4c, 0x69, 0x67, 0x68, 0x74, +0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x04, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x05, 0x46, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x06, 0x46, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x73, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x00, 0x07, 0x42, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, +0x02, 0x4d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x03, 0x4d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x08, 0x50, 0x4d, 0x41, 0x53, 0x5f, +0x54, 0x41, 0x4d, 0xcb, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x07, 0x07, 0x01, 0x02, 0x09, 0x07, 0x00, 0x09, 0x01, 0x01, +0x0a, 0x00, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x00, 0x01, 0x6c, +0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x00, 0x02, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, +0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x00, 0x03, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, +0x61, 0x6f, 0x00, 0x04, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x00, 0x05, 0x6c, 0x69, 0x67, 0x68, 0x74, +0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x00, 0x06, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, +0x67, 0x00, 0x07, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x00, 0x08, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, +0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x00, 0x09, +0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, +0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, 0x20, 0x42, 0x49, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x3d, 0x00, +0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x06, 0x03, 0x20, 0x42, 0x49, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x4e, +0x4f, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, +0x55, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, +0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4e, +0x45, 0x4c, 0x42, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x44, 0x4d, 0x52, 0x54, 0x5f, 0x54, 0x41, 0x4d, +0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x52, +0x57, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, +0x00, 0x00, 0x00, 0x01, 0x49, 0x52, 0x57, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x45, 0x54, +0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x53, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, +0x00, 0x00, 0x00, 0x53, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x43, 0x32, 0x41, +0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4d, 0x55, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, +0x00, 0x00, 0x50, 0x4f, 0x52, 0x50, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x44, 0x49, 0x55, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x2e, 0x93, 0xfd, 0x40, 0xe9, 0x81, +0xd0, 0x07, 0x44, 0x41, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, 0x5f, +0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, +0x00, 0x54, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x49, 0x43, 0x5f, 0x54, +0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x41, 0x51, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x41, 0x41, 0x50, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x41, 0x56, 0x53, +0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x19, 0x3e, 0x52, 0x48, 0x54, 0x53, 0x5f, 0x54, 0x41, 0x4d, +0x04, 0x00, 0x00, 0x00, 0xcd, 0xcc, 0x4c, 0x3e, 0x4f, 0x44, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, +0x00, 0x52, 0x54, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x44, 0x53, 0x43, 0x5f, 0x54, +0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x63, 0x5c, 0x00, 0x00, 0x8f, +0x02, 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x30, 0x30, 0x20, 0x65, 0x73, 0x00, 0x73, +0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, +0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x7b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x7d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x50, +0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x00, 0x6d, 0x61, 0x74, +0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x69, 0x6e, 0x74, +0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x69, +0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x69, 0x6e, +0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, +0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, +0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, +0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x00, +0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, +0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x20, 0x36, 0x34, 0x00, 0x23, 0x65, 0x6e, +0x64, 0x69, 0x66, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, +0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, +0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, +0x5f, 0x31, 0x3b, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, +0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x00, 0x23, 0x64, +0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, +0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x00, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, 0x4f, 0x57, 0x45, +0x52, 0x5f, 0x56, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x41, 0x52, 0x4f, 0x55, +0x4e, 0x44, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, +0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, +0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, +0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, +0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, +0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x6d, 0x61, 0x74, +0x34, 0x20, 0x62, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, +0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x65, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, +0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, +0x20, 0x69, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, +0x20, 0x72, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, +0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, 0x00, 0x6d, 0x65, 0x64, +0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x61, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, +0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, +0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, +0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, 0x00, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6b, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, +0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, +0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x32, 0x20, 0x72, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x74, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, +0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, +0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, +0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, +0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x67, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x33, +0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, +0x20, 0x6b, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, +0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, +0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x7a, 0x7a, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x7a, 0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, +0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, +0x34, 0x20, 0x75, 0x7a, 0x7a, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x66, 0x6c, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, +0x00, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x6f, +0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, +0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x56, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x52, +0x4b, 0x41, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x29, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x20, 0x2b, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x49, 0x44, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x00, 0x7d, 0x00, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x49, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x30, 0x39, +0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, +0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, +0x36, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x38, +0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x3b, 0x00, 0x5f, 0x31, 0x39, 0x38, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x39, 0x38, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x39, 0x38, 0x2e, +0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, +0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x39, 0x38, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, +0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x65, 0x6d, 0x69, 0x73, 0x73, +0x69, 0x76, 0x65, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x52, 0x6f, 0x75, +0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, +0x72, 0x6f, 0x70, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, +0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x34, +0x32, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x33, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x34, 0x34, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x65, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, +0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x6b, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, +0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x78, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x7a, 0x3b, 0x00, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, +0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, +0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6b, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x7a, +0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x73, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x75, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x76, 0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x78, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, +0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x7a, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x69, 0x7a, +0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6b, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x7a, 0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x69, 0x6e, +0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x7a, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, +0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x3b, 0x00, 0x7d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, +0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, +0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, +0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2e, +0x78, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, +0x5f, 0x33, 0x38, 0x31, 0x20, 0x3e, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, +0x73, 0x2e, 0x61, 0x29, 0x00, 0x5f, 0x34, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, +0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, +0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x2c, 0x20, 0x31, 0x2e, +0x30, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x38, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x33, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x38, 0x31, +0x20, 0x3e, 0x20, 0x5f, 0x33, 0x39, 0x38, 0x29, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x36, 0x39, 0x20, 0x3d, +0x20, 0x5f, 0x33, 0x39, 0x34, 0x3b, 0x00, 0x5f, 0x34, 0x36, 0x39, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, +0x2d, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x38, 0x31, 0x20, 0x2d, 0x20, 0x5f, 0x33, 0x39, 0x38, 0x29, 0x20, 0x2f, 0x20, 0x28, +0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2d, 0x20, 0x5f, +0x33, 0x39, 0x38, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x39, 0x3b, 0x00, +0x5f, 0x34, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x3b, 0x00, 0x5f, 0x34, 0x37, 0x32, 0x20, 0x3d, 0x20, +0x5f, 0x34, 0x37, 0x33, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, +0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x5f, 0x34, 0x37, 0x32, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x32, 0x2c, 0x20, +0x5f, 0x34, 0x34, 0x33, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x33, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x33, 0x2c, 0x20, 0x5f, 0x34, +0x34, 0x34, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x32, 0x2c, +0x20, 0x5f, 0x34, 0x34, 0x33, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x33, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x33, 0x2c, 0x20, 0x5f, +0x34, 0x34, 0x34, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x36, 0x37, 0x38, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x37, 0x39, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x38, 0x30, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, +0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, +0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, +0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, 0x39, 0x33, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x7a, 0x7a, 0x29, 0x00, 0x72, 0x65, 0x74, 0x75, +0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x32, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x31, 0x35, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x61, +0x62, 0x73, 0x28, 0x5f, 0x32, 0x32, 0x31, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, +0x5f, 0x37, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x32, 0x31, +0x29, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, 0x31, 0x3b, 0x00, 0x5f, 0x37, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x65, 0x78, +0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x31, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x39, 0x33, 0x20, +0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, +0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, +0x79, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x32, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, +0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x35, 0x34, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x37, 0x31, 0x36, 0x3b, 0x00, +0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x7a, +0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x39, 0x33, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x31, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x20, 0x3d, 0x20, +0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x37, 0x31, 0x36, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, +0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, +0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, +0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, +0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, +0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x38, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x2e, 0x78, 0x2c, 0x20, 0x63, +0x6c, 0x61, 0x6d, 0x70, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x38, 0x31, 0x2c, 0x20, 0x30, 0x2e, +0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x37, 0x31, 0x36, 0x20, +0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 0x36, 0x20, 0x2a, 0x20, +0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x20, 0x2a, 0x20, +0x5f, 0x32, 0x36, 0x31, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x37, 0x31, 0x38, 0x3b, 0x00, 0x69, 0x66, +0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x20, +0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x33, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x31, 0x35, 0x20, 0x2a, 0x20, 0x6d, +0x61, 0x78, 0x28, 0x5f, 0x31, 0x39, 0x33, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, +0x38, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x20, +0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, +0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, +0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x3b, 0x00, 0x5f, 0x37, +0x31, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, +0x70, 0x6f, 0x77, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x36, 0x34, 0x2c, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, +0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, 0x38, 0x29, 0x29, 0x29, 0x3b, +0x00, 0x5f, 0x37, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x33, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x33, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x33, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x38, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x36, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x37, 0x31, 0x38, +0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x38, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, +0x38, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x38, +0x2e, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, +0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2e, +0x78, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x37, 0x31, 0x33, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, +0x5f, 0x36, 0x30, 0x39, 0x20, 0x3e, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, +0x73, 0x2e, 0x61, 0x29, 0x00, 0x5f, 0x37, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, +0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x36, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, +0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x2c, 0x20, 0x31, 0x2e, +0x30, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x38, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x37, 0x31, 0x34, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x30, 0x39, +0x20, 0x3e, 0x20, 0x5f, 0x36, 0x32, 0x36, 0x29, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x3d, +0x20, 0x5f, 0x36, 0x32, 0x32, 0x3b, 0x00, 0x5f, 0x37, 0x30, 0x34, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, +0x2d, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x30, 0x39, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x32, 0x36, 0x29, 0x20, 0x2f, 0x20, 0x28, +0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2d, 0x20, 0x5f, +0x36, 0x32, 0x36, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x37, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x3b, 0x00, +0x5f, 0x37, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x32, 0x32, 0x3b, 0x00, 0x5f, 0x37, 0x31, 0x33, 0x20, 0x3d, 0x20, +0x5f, 0x37, 0x31, 0x34, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, +0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x5f, 0x37, 0x31, 0x33, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x38, 0x2c, 0x20, +0x5f, 0x36, 0x37, 0x39, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x39, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x39, 0x2c, 0x20, 0x5f, 0x36, +0x38, 0x30, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x38, 0x2c, +0x20, 0x5f, 0x36, 0x37, 0x39, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x39, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x39, 0x2c, 0x20, 0x5f, +0x36, 0x38, 0x30, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, +0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, +0x35, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2c, 0x20, 0x70, 0x61, 0x72, +0x61, 0x6d, 0x5f, 0x31, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, +0x35, 0x30, 0x37, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, +0x75, 0x6e, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, +0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, +0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, +0x5f, 0x31, 0x36, 0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, +0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x69, 0x6e, 0x74, 0x42, 0x69, 0x74, 0x73, 0x54, 0x6f, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, +0x79, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x7a, 0x20, 0x2f, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x77, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, +0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, +0x45, 0x58, 0x54, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x63, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, +0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, +0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, +0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, +0x20, 0x32, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x53, +0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, +0x49, 0x44, 0x5f, 0x38, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, +0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x33, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x2e, +0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, +0x3d, 0x20, 0x5f, 0x38, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x2e, 0x7a, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x3b, 0x00, +0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, +0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, +0x34, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, +0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x39, 0x34, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x28, 0x5f, 0x39, 0x33, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, +0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x39, 0x34, 0x29, 0x3b, 0x00, 0x5f, 0x39, +0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, +0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x39, 0x35, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x39, 0x39, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x31, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, +0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, +0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x39, 0x39, 0x29, 0x20, 0x2a, 0x20, +0x5f, 0x39, 0x31, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x39, 0x31, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x39, 0x35, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, +0x5f, 0x39, 0x33, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x31, 0x2e, 0x77, 0x29, 0x29, +0x3b, 0x00, 0x5f, 0x39, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x39, 0x31, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x5f, 0x39, 0x31, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x33, 0x3b, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, +0x31, 0x30, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, +0x5f, 0x73, 0x68, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, +0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, +0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x38, 0x29, 0x20, 0x66, 0x6c, 0x61, 0x74, +0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6c, 0x61, 0x79, +0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x6f, 0x75, +0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x30, 0x2e, +0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, +0x31, 0x30, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, +0x3d, 0x20, 0x34, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, +0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, +0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, +0x65, 0x77, 0x29, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, +0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, +0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, +0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, +0x31, 0x35, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, +0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x31, 0x35, 0x20, 0x2a, 0x20, +0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x39, 0x33, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, +0x20, 0x5f, 0x32, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, +0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, +0x3b, 0x00, 0x5f, 0x37, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, +0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, +0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x38, 0x2e, 0x79, 0x2c, 0x20, 0x5f, +0x32, 0x38, 0x38, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x5f, 0x31, 0x39, 0x33, 0x20, 0x2a, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, +0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x2c, +0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x37, +0x31, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, +0x70, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, +0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, +0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x31, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, +0x31, 0x39, 0x33, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, +0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, +0x7a, 0x29, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, +0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, +0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x37, 0x39, +0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x37, 0x39, 0x5d, +0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, +0x31, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x31, 0x39, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x33, 0x2e, 0x79, +0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x32, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x38, 0x36, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x3b, 0x00, 0x69, 0x6e, 0x74, +0x20, 0x5f, 0x32, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x32, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x35, 0x20, 0x2a, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x31, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, +0x31, 0x34, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x78, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x35, +0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x32, 0x36, 0x29, 0x20, 0x2a, 0x20, 0x5f, +0x32, 0x30, 0x35, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x32, 0x36, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x77, +0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, +0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, +0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x35, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x31, +0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x77, 0x29, 0x29, 0x3b, +0x00, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x7a, 0x20, 0x2a, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x37, 0x39, 0x3b, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, +0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x00, 0x23, 0x69, +0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69, 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, +0x00, 0x00, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, +0x74, 0x61, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, +0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, +0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, +0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, +0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, +0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, +0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, +0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, +0x20, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x64, +0x61, 0x74, 0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, +0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, +0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, +0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, +0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, +0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x4e, 0x6f, 0x69, 0x73, +0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x54, 0x69, +0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, +0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, +0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, +0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x72, 0x65, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x64, 0x4f, 0x66, 0x66, 0x73, +0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, +0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, +0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x4f, 0x76, +0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x46, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x76, 0x31, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, +0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x53, 0x61, 0x6d, 0x70, 0x6c, +0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x64, 0x45, 0x64, 0x67, 0x65, 0x44, 0x69, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x42, +0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x7a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, +0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x66, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x43, 0x6f, +0x75, 0x6e, 0x74, 0x58, 0x59, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, 0x6c, +0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x69, 0x62, 0x6c, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x65, 0x4c, 0x65, 0x76, 0x65, +0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x69, 0x62, 0x6c, 0x53, 0x48, 0x5b, +0x39, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, +0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x73, 0x75, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x68, 0x61, +0x64, 0x6f, 0x77, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, +0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, +0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, +0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x52, 0x61, 0x74, 0x69, +0x6f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, +0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x45, +0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, +0x73, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x42, 0x6c, 0x65, 0x65, 0x64, 0x52, 0x65, 0x64, +0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, +0x64, 0x6f, 0x77, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x44, 0x65, +0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, +0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, +0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, +0x66, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, +0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, +0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, +0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, +0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, +0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, +0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, +0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x52, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x55, 0x76, +0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x53, 0x74, 0x72, 0x69, 0x64, +0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, +0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x37, 0x30, 0x39, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, +0x65, 0x64, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, +0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, +0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x73, 0x74, +0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x34, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, +0x63, 0x6e, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, +0x63, 0x6e, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, +0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, +0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, +0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, +0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, +0x5d, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, +0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5d, 0x5d, +0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, +0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x49, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, +0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x39, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, +0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x36, 0x39, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, +0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, +0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x5b, +0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, +0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, +0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, +0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, +0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, +0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x68, 0x61, 0x6c, +0x66, 0x34, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x76, 0x69, 0x65, +0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, +0x2e, 0x78, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x38, 0x31, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x33, 0x38, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, +0x5f, 0x34, 0x38, 0x31, 0x20, 0x3e, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, +0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x34, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x20, 0x5f, 0x34, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x33, 0x39, 0x34, +0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x2c, 0x20, 0x5f, 0x34, +0x38, 0x36, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x34, +0x38, 0x37, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x34, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x28, 0x30, 0x2e, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, +0x20, 0x28, 0x5f, 0x34, 0x38, 0x31, 0x20, 0x3e, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x34, 0x38, 0x37, 0x20, +0x2a, 0x20, 0x5f, 0x34, 0x38, 0x38, 0x29, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x34, 0x39, 0x31, +0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x2d, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, +0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x34, 0x36, 0x39, +0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x34, 0x36, 0x39, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x28, 0x66, 0x6d, +0x61, 0x28, 0x5f, 0x34, 0x39, 0x31, 0x2c, 0x20, 0x5f, 0x34, 0x38, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x29, 0x20, +0x2f, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x39, 0x31, 0x2c, 0x20, 0x5f, 0x34, 0x38, 0x38, 0x2c, 0x20, 0x5f, 0x34, +0x38, 0x37, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, +0x37, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x33, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x34, 0x37, 0x32, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, +0x6e, 0x74, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x73, 0x74, 0x72, 0x75, +0x63, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, +0x75, 0x66, 0x66, 0x65, 0x72, 0x31, 0x20, 0x7b, 0x00, 0x64, 0x65, 0x70, 0x74, 0x68, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, +0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, +0x6f, 0x77, 0x4d, 0x61, 0x70, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, +0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, +0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, +0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, +0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x53, 0x6d, +0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, +0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x34, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, +0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x35, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, +0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x20, 0x5b, +0x5b, 0x69, 0x64, 0x28, 0x36, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, +0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x37, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, +0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x20, 0x5b, 0x5b, +0x69, 0x64, 0x28, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, +0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x39, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x5b, 0x5b, 0x69, 0x64, +0x28, 0x31, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, +0x64, 0x28, 0x31, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, +0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x20, 0x5b, 0x5b, +0x69, 0x64, 0x28, 0x31, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, +0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x33, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, +0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, +0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, +0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x31, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, +0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x37, 0x29, +0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, +0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, +0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x20, 0x5f, 0x36, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x68, 0x61, 0x6c, +0x66, 0x34, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x76, 0x69, 0x65, +0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, +0x2e, 0x78, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x33, 0x31, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x36, 0x31, 0x36, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x39, 0x31, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, +0x5f, 0x39, 0x33, 0x31, 0x20, 0x3e, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, +0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x20, 0x5f, 0x39, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x36, 0x32, 0x39, 0x20, +0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x2c, 0x20, 0x5f, 0x39, 0x33, +0x36, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x39, 0x33, +0x37, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, +0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x39, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x28, 0x30, 0x2e, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x34, 0x20, 0x5f, 0x39, 0x31, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, +0x28, 0x5f, 0x39, 0x33, 0x31, 0x20, 0x3e, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x33, 0x37, 0x20, 0x2a, +0x20, 0x5f, 0x39, 0x33, 0x38, 0x29, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x39, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x2d, 0x6d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x32, 0x39, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x39, 0x34, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x5f, +0x39, 0x33, 0x36, 0x20, 0x2d, 0x20, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x39, 0x33, +0x38, 0x2c, 0x20, 0x5f, 0x36, 0x31, 0x36, 0x29, 0x20, 0x2f, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, 0x34, 0x31, 0x2c, +0x20, 0x5f, 0x39, 0x33, 0x38, 0x2c, 0x20, 0x5f, 0x39, 0x33, 0x37, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x39, 0x34, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x5f, +0x36, 0x32, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x31, 0x20, 0x3d, 0x20, +0x5f, 0x39, 0x31, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, +0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x39, 0x31, 0x31, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x35, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, +0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, +0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x39, 0x32, +0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x5f, 0x35, +0x30, 0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x37, 0x30, +0x38, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x35, +0x30, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x37, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x20, 0x2a, 0x20, +0x5f, 0x37, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x39, 0x31, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, +0x73, 0x28, 0x5f, 0x37, 0x32, 0x35, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6d, +0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, +0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, +0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, +0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x5f, 0x37, 0x32, 0x34, 0x2c, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, +0x69, 0x74, 0x79, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x2f, +0x20, 0x5f, 0x37, 0x32, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x39, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x39, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, +0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, +0x37, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x5f, 0x39, 0x34, 0x39, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x39, 0x31, 0x33, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, +0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x37, 0x30, 0x38, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, +0x29, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x39, 0x36, 0x30, 0x20, +0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x34, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, +0x62, 0x6c, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x39, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, +0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, +0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, +0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x30, 0x20, 0x2a, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, +0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, +0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, +0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, +0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, +0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, +0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, +0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, +0x35, 0x30, 0x32, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x39, 0x35, 0x32, +0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x39, 0x35, 0x32, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x68, 0x61, +0x6c, 0x66, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x37, 0x30, 0x38, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, +0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, +0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x30, 0x2e, +0x30, 0x29, 0x2c, 0x20, 0x5f, 0x39, 0x34, 0x39, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x39, +0x36, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, +0x30, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x34, 0x20, 0x2a, 0x20, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, +0x61, 0x6e, 0x63, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x35, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, +0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x39, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x37, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x68, 0x61, 0x6c, 0x66, +0x34, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x29, 0x2e, 0x78, 0x79, 0x7a, +0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, +0x79, 0x2e, 0x77, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x61, +0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, 0x6f, +0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x35, 0x30, 0x32, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x39, 0x34, 0x39, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, +0x28, 0x2d, 0x28, 0x5f, 0x39, 0x31, 0x33, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, +0x5f, 0x37, 0x30, 0x38, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, +0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x37, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x39, 0x36, 0x39, 0x20, 0x3d, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x35, +0x37, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x39, 0x36, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x39, 0x34, +0x39, 0x20, 0x2d, 0x20, 0x5f, 0x37, 0x35, 0x38, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x39, 0x31, 0x39, 0x20, 0x2a, +0x20, 0x5f, 0x39, 0x36, 0x39, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x34, 0x20, 0x5f, 0x39, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x30, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x35, 0x37, 0x2e, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x30, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, +0x38, 0x35, 0x37, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x30, 0x34, 0x2e, +0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x35, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x39, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, +0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, +0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x39, 0x32, 0x30, 0x29, +0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x35, 0x20, +0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6f, 0x75, 0x74, +0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, +0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, +0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, +0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, +0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, +0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, +0x64, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, +0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, +0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x5b, 0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, +0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, +0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x69, 0x73, +0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x64, +0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, +0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x29, 0x20, 0x3f, 0x20, 0x43, 0x4f, +0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, +0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x3a, 0x20, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x5b, 0x5b, 0x63, +0x6c, 0x69, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, 0x5d, 0x20, 0x5b, 0x32, 0x5d, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x30, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, +0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, +0x63, 0x6c, 0x69, 0x70, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, +0x33, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x33, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, +0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x37, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x37, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x38, 0x30, 0x20, +0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, +0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, +0x31, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, +0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x38, +0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x37, 0x38, 0x2e, 0x78, 0x2c, +0x20, 0x5f, 0x38, 0x33, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x38, 0x31, 0x2c, +0x20, 0x5f, 0x38, 0x35, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x33, 0x29, 0x20, +0x2a, 0x20, 0x5f, 0x38, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x39, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x39, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x32, +0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x38, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, 0x32, 0x2c, 0x20, 0x5f, +0x38, 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x38, 0x38, 0x2c, 0x20, 0x5f, 0x39, 0x30, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, +0x39, 0x32, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, +0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x38, 0x38, 0x2c, 0x20, 0x5f, 0x39, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, +0x39, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, +0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5b, 0x30, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, +0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, +0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x2e, 0x7a, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, +0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x37, +0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x20, 0x3d, 0x20, +0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, +0x31, 0x2e, 0x30, 0x29, 0x29, 0x2e, 0x78, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x38, 0x31, +0x20, 0x3e, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x61, +0x78, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x34, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x20, 0x3d, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, +0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x38, 0x31, 0x20, 0x3e, 0x20, 0x28, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x38, 0x29, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x2d, 0x6d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x36, 0x39, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, +0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x37, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x38, 0x2c, +0x20, 0x5f, 0x33, 0x38, 0x31, 0x29, 0x20, 0x2f, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x37, 0x34, 0x2c, 0x20, 0x30, +0x2e, 0x38, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, +0x61, 0x78, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, +0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x76, +0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x31, 0x2e, 0x30, +0x29, 0x29, 0x2e, 0x78, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x39, 0x31, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x31, 0x36, 0x20, 0x3e, 0x20, +0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x31, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x36, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, +0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x31, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x31, 0x36, 0x20, 0x3e, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x20, 0x2a, 0x20, 0x30, 0x2e, 0x38, 0x29, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x2d, 0x6d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x38, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x32, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x39, 0x34, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, +0x2d, 0x20, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, 0x32, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x38, 0x2c, 0x20, 0x5f, 0x36, +0x31, 0x36, 0x29, 0x20, 0x2f, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, 0x32, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x38, 0x2c, +0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x44, +0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, +0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x35, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, +0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x39, 0x32, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x39, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, +0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x39, 0x31, 0x33, 0x20, +0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x37, 0x30, 0x38, 0x20, 0x2d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, +0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x34, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, +0x5f, 0x39, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, +0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, +0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, +0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x20, 0x2a, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x33, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, +0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, +0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, +0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, +0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x5f, 0x35, 0x30, 0x32, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, +0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x32, 0x38, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x28, 0x5f, 0x39, 0x32, 0x38, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x63, 0x6c, 0x61, +0x6d, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x37, 0x30, 0x38, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, +0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, +0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, +0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x38, +0x30, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x34, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, +0x2a, 0x20, 0x5f, 0x37, 0x35, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x39, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x37, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, +0x77, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, +0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x35, 0x30, 0x32, 0x29, 0x2c, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, +0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x2a, +0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x39, 0x31, 0x33, 0x20, 0x2a, +0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x37, 0x30, 0x38, 0x20, 0x2d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, +0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, +0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, +0x5f, 0x38, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x35, 0x30, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x37, 0x35, 0x38, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x39, 0x31, 0x39, +0x20, 0x2a, 0x20, 0x5f, 0x35, 0x30, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x30, 0x34, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, +0x5f, 0x39, 0x32, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x37, 0x31, 0x20, 0x3d, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, +0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, +0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, +0x34, 0x34, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x37, 0x31, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, +0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, +0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, +0x20, 0x5f, 0x32, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x20, 0x3d, 0x20, +0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x30, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x30, 0x32, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x5f, +0x31, 0x39, 0x37, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, +0x34, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x39, 0x37, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x32, 0x31, 0x31, +0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x30, 0x36, 0x2c, 0x20, 0x5f, 0x32, +0x31, 0x37, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x29, 0x20, 0x2a, +0x20, 0x5f, 0x32, 0x33, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x33, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x38, 0x30, +0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x33, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x30, +0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, +0x5f, 0x33, 0x38, 0x36, 0x2c, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, +0x33, 0x30, 0x2c, 0x20, 0x5f, 0x32, 0x33, 0x34, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, +0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, +0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x33, 0x38, 0x36, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x28, 0x5f, 0x32, 0x30, 0x32, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, +0x33, 0x30, 0x2c, 0x20, 0x5f, 0x32, 0x33, 0x34, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, +0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x30, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x37, 0x31, 0x3b, 0x00, 0x4c, 0x53, 0x4c, 0x47, 0x5f, 0x54, 0x41, 0x4d, 0x92, 0x0a, +0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, +0x8c, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x8e, 0x02, 0x00, 0x00, 0x01, 0x20, +0x01, 0xa2, 0x02, 0x00, 0x00, 0x01, 0x30, 0x01, 0x1a, 0x04, 0x00, 0x00, 0x01, 0x44, 0x01, 0x5c, 0x04, 0x00, 0x00, 0x01, +0x80, 0x00, 0x74, 0x04, 0x00, 0x00, 0x01, 0x90, 0x00, 0x74, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x98, 0x05, 0x00, 0x00, +0x02, 0x00, 0x01, 0xa0, 0x06, 0x00, 0x00, 0x02, 0x10, 0x00, 0x98, 0x05, 0x00, 0x00, 0x02, 0x10, 0x01, 0xa0, 0x07, 0x00, +0x00, 0x02, 0x20, 0x01, 0xb2, 0x07, 0x00, 0x00, 0x02, 0x30, 0x01, 0x18, 0x09, 0x00, 0x00, 0x02, 0x44, 0x01, 0x58, 0x09, +0x00, 0x00, 0x02, 0x80, 0x00, 0x6e, 0x09, 0x00, 0x00, 0x02, 0x90, 0x00, 0x6e, 0x09, 0x00, 0x00, 0x40, 0x09, 0x00, 0x00, +0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, +0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, +0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, +0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, +0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, +0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, +0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, +0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, +0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, +0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, +0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x6c, 0x00, +0x6d, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x69, 0x00, 0x66, 0x07, +0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x02, 0x00, 0x78, 0x00, 0x79, 0x00, +0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x04, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x17, 0x00, 0x02, 0x00, +0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, +0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, +0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, +0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, +0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, +0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, +0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, +0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0x61, 0x00, 0xca, 0x00, 0x02, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, +0xcf, 0x00, 0x66, 0x00, 0x02, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0x02, 0x00, 0xd3, 0x00, 0x69, 0x00, 0x6a, 0x00, +0x02, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0x02, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0x69, 0x00, +0x6a, 0x00, 0x02, 0x00, 0xdb, 0x00, 0x69, 0x00, 0xdc, 0x00, 0x69, 0x00, 0xdd, 0x00, 0x69, 0x00, 0x51, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x76, 0x00, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0x22, 0x0e, 0x00, 0x00, +0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x02, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, 0x00, +0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x04, 0x00, 0xde, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0x17, 0x00, 0x02, 0x00, 0x81, 0x00, +0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, +0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, +0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, +0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, +0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, +0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, +0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, +0xc8, 0x00, 0xc9, 0x00, 0x61, 0x00, 0xca, 0x00, 0x02, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xe1, 0x00, 0xce, 0x00, +0xcf, 0x00, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0x02, 0x00, 0xe5, 0x00, 0x69, 0x00, 0xe6, 0x00, 0xe7, 0x00, +0xe8, 0x00, 0x02, 0x00, 0xe9, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xea, 0x00, 0x69, 0x00, 0xeb, 0x00, 0xec, 0x00, +0xed, 0x00, 0xee, 0x00, 0xef, 0x00, 0x02, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0x69, 0x00, 0x6a, 0x00, +0x02, 0x00, 0xf4, 0x00, 0x69, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0x02, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, +0xfb, 0x00, 0xfc, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xfd, 0x00, 0x69, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x00, 0x01, +0x01, 0x01, 0x02, 0x01, 0x03, 0x01, 0xe5, 0x00, 0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, +0x02, 0x00, 0x07, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x08, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x02, 0x00, +0x0c, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x0f, 0x01, 0x69, 0x00, 0x10, 0x01, 0x69, 0x00, +0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x69, 0x00, 0xec, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, +0x00, 0x00, 0x75, 0x00, 0x76, 0x00, 0x05, 0x00, 0x02, 0x00, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, +0x1b, 0x01, 0x1c, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x1d, 0x01, 0x14, 0x00, 0x02, 0x00, +0x15, 0x00, 0x16, 0x00, 0x1e, 0x01, 0x1f, 0x01, 0x66, 0x00, 0x02, 0x00, 0x20, 0x01, 0x21, 0x01, 0x69, 0x00, 0x91, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x76, 0x00, 0xcf, 0x00, 0x66, 0x00, 0x02, 0x00, 0x22, 0x01, +0x69, 0x00, 0xbe, 0x0b, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, +0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, +0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x24, 0x01, 0x25, 0x01, 0x0f, 0x00, 0x26, 0x01, 0x11, 0x00, +0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, +0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, +0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, +0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, +0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, +0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, +0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, +0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, +0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x63, 0x00, 0x62, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, +0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x27, 0x01, 0x28, 0x01, 0x29, 0x01, +0x2a, 0x01, 0x2b, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x2e, 0x01, 0x2f, 0x01, 0x30, 0x01, 0x31, 0x01, 0x32, 0x01, 0x33, 0x01, +0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x69, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x3a, 0x01, 0x3b, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, +0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, +0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, +0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x2a, 0x00, +0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, +0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0x39, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0x3d, 0x00, 0xa7, 0x00, +0xa8, 0x00, 0x40, 0x00, 0xaa, 0x00, 0xab, 0x00, 0x43, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0x48, 0x00, +0x49, 0x00, 0xb3, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0x50, 0x00, 0xba, 0x00, 0x52, 0x00, +0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0x5b, 0x00, 0xc5, 0x00, +0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0x61, 0x00, 0x62, 0x00, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x66, 0x00, +0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x3f, 0x01, +0x40, 0x01, 0x6e, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x41, 0x01, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x69, 0x00, 0xa4, 0x06, +0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x3a, 0x01, 0x3b, 0x01, 0x77, 0x00, 0x02, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, 0x00, +0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x04, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, +0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, +0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, +0x2d, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, +0xa0, 0x00, 0xa1, 0x00, 0x39, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0x3d, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0x40, 0x00, +0xaa, 0x00, 0xab, 0x00, 0x43, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0x48, 0x00, 0x49, 0x00, 0xb3, 0x00, +0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0x50, 0x00, 0xba, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, +0x55, 0x00, 0x56, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0x5b, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, +0xc8, 0x00, 0xc9, 0x00, 0x61, 0x00, 0xca, 0x00, 0x02, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0x42, 0x01, 0xcf, 0x00, +0x66, 0x00, 0x02, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0x02, 0x00, 0xd3, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, +0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0x02, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0x69, 0x00, 0x6a, 0x00, +0x02, 0x00, 0xdb, 0x00, 0x69, 0x00, 0xdc, 0x00, 0x69, 0x00, 0xdd, 0x00, 0x69, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, +0x00, 0x00, 0x3a, 0x01, 0x3b, 0x01, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0x4c, 0x0c, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, +0x3a, 0x01, 0x3b, 0x01, 0x77, 0x00, 0x02, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, +0x04, 0x00, 0xde, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, +0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, +0x26, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x97, 0x00, 0x98, 0x00, +0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0x39, 0x00, +0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0x3d, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0x40, 0x00, 0xaa, 0x00, 0xab, 0x00, 0x43, 0x00, +0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0x48, 0x00, 0x49, 0x00, 0xb3, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, +0xb7, 0x00, 0xb8, 0x00, 0x50, 0x00, 0xba, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xc0, 0x00, +0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0x5b, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0x61, 0x00, +0xca, 0x00, 0x02, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0x43, 0x01, 0x42, 0x01, 0xcf, 0x00, 0x44, 0x01, 0x02, 0x00, +0x45, 0x01, 0xe4, 0x00, 0x02, 0x00, 0xe5, 0x00, 0x69, 0x00, 0x46, 0x01, 0x47, 0x01, 0xe8, 0x00, 0x02, 0x00, 0xe9, 0x00, +0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xea, 0x00, 0x69, 0x00, 0x48, 0x01, 0xee, 0x00, 0xef, 0x00, 0x02, 0x00, 0x49, 0x01, +0x4a, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xf4, 0x00, 0x69, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0x02, 0x00, +0x4b, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xfd, 0x00, 0x69, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, +0x02, 0x01, 0x03, 0x01, 0xe5, 0x00, 0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x02, 0x00, +0x07, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x08, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x02, 0x00, 0x0c, 0x01, +0x0d, 0x01, 0x0e, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x0f, 0x01, 0x69, 0x00, 0x10, 0x01, 0x69, 0x00, 0x11, 0x01, +0x12, 0x01, 0x4c, 0x01, 0x14, 0x01, 0x15, 0x01, 0x69, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x3a, 0x01, +0x3b, 0x01, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, +0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x1d, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, +0x4d, 0x01, 0x4e, 0x01, 0x66, 0x00, 0x02, 0x00, 0x20, 0x01, 0x21, 0x01, 0x69, 0x00, 0x92, 0x00, 0x00, 0x00, 0x07, 0x00, +0x00, 0x00, 0x3a, 0x01, 0x3b, 0x01, 0xcf, 0x00, 0x66, 0x00, 0x02, 0x00, 0x22, 0x01, 0x69, 0x00, 0xf5, 0x0a, 0x00, 0x00, +0x8e, 0x00, 0x00, 0x00, 0x3a, 0x01, 0x3b, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, +0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, +0x0f, 0x00, 0x10, 0x00, 0x24, 0x01, 0x25, 0x01, 0x0f, 0x00, 0x26, 0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, +0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, +0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, +0x26, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x97, 0x00, 0x98, 0x00, +0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0x39, 0x00, +0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0x3d, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0x40, 0x00, 0xaa, 0x00, 0xab, 0x00, 0x43, 0x00, +0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0x48, 0x00, 0x49, 0x00, 0xb3, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, +0xb7, 0x00, 0xb8, 0x00, 0x50, 0x00, 0xba, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xc0, 0x00, +0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0x5b, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0x61, 0x00, +0x3c, 0x01, 0x62, 0x00, 0x3d, 0x01, 0x3e, 0x01, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, +0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, +0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, +0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x69, 0x00, 0x4c, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x41, 0x4d, 0xfa, 0x0a, 0x00, 0x00, +0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x92, 0x01, +0x00, 0x00, 0x01, 0x10, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xa2, 0x02, 0x00, 0x00, 0x01, 0x20, 0x01, 0xbc, +0x02, 0x00, 0x00, 0x01, 0x30, 0x01, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x44, 0x01, 0xbe, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, +0xe8, 0x04, 0x00, 0x00, 0x01, 0x90, 0x00, 0xe8, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1e, 0x06, 0x00, 0x00, 0x02, 0x00, +0x01, 0x2a, 0x07, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1e, 0x06, 0x00, 0x00, 0x02, 0x10, 0x01, 0xa2, 0x02, 0x00, 0x00, 0x02, +0x20, 0x01, 0x32, 0x08, 0x00, 0x00, 0x02, 0x30, 0x01, 0x5a, 0x04, 0x00, 0x00, 0x02, 0x44, 0x01, 0xbe, 0x04, 0x00, 0x00, +0x02, 0x80, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x02, 0x90, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x72, 0x0d, 0x00, 0x00, 0x82, 0x00, +0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0x05, 0x00, 0x02, 0x00, 0x66, 0x01, 0x67, 0x01, +0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x04, 0x00, 0x64, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x6d, 0x01, 0x64, 0x01, 0x6e, 0x01, 0x02, 0x00, 0x6f, 0x01, 0x04, 0x00, 0x64, 0x01, 0x70, 0x01, 0x02, 0x00, 0x71, 0x01, +0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, +0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, +0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, +0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, +0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, +0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, +0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, +0xb8, 0x01, 0xb9, 0x01, 0x04, 0x00, 0x64, 0x01, 0xba, 0x01, 0x02, 0x00, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, +0x04, 0x00, 0x64, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xc0, 0x01, 0x04, 0x00, 0x64, 0x01, 0xc1, 0x01, 0x02, 0x00, 0xc2, 0x01, +0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0x69, 0x00, +0x64, 0x01, 0x12, 0x0d, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, +0x70, 0x01, 0x02, 0x00, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, +0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, +0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, +0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, +0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, +0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, +0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, +0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0x04, 0x00, 0x64, 0x01, 0xcc, 0x01, 0x02, 0x00, 0xcd, 0x01, +0xce, 0x01, 0x04, 0x00, 0x64, 0x01, 0xba, 0x01, 0x02, 0x00, 0xcf, 0x01, 0x04, 0x00, 0x64, 0x01, 0xbf, 0x01, 0x02, 0x00, +0xbb, 0x01, 0x04, 0x00, 0x64, 0x01, 0xd0, 0x01, 0x02, 0x00, 0xc2, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, +0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd5, 0x01, 0xd9, 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, +0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xdf, 0x01, 0xe6, 0x01, +0xe4, 0x01, 0xe7, 0x01, 0xd7, 0x01, 0xe8, 0x01, 0xcb, 0x01, 0x69, 0x00, 0x64, 0x01, 0x64, 0x00, 0x00, 0x00, 0x09, 0x00, +0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0xe9, 0x01, 0x02, 0x00, 0x69, 0x00, 0x64, 0x01, +0x72, 0x19, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0x70, 0x01, +0x02, 0x00, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, +0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, +0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, +0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, +0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, +0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, +0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, +0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0x04, 0x00, 0x64, 0x01, 0xcc, 0x01, 0x02, 0x00, 0xcd, 0x01, 0xce, 0x01, +0x04, 0x00, 0x64, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, +0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0x04, 0x00, 0x64, 0x01, 0xba, 0x01, +0x02, 0x00, 0xcf, 0x01, 0x04, 0x00, 0x64, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xbb, 0x01, 0x04, 0x00, 0x64, 0x01, 0xf9, 0x01, +0x02, 0x00, 0xc2, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xd5, 0x01, 0xfe, 0x01, 0xd7, 0x01, 0xd8, 0x01, +0xd5, 0x01, 0xff, 0x01, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0xdf, 0x01, 0x05, 0x02, 0x06, 0x02, +0x07, 0x02, 0x08, 0x02, 0xe4, 0x01, 0xe5, 0x01, 0xdf, 0x01, 0x09, 0x02, 0xe4, 0x01, 0x0a, 0x02, 0xd7, 0x01, 0x0b, 0x02, +0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0xd5, 0x01, 0x0f, 0x02, 0x10, 0x02, 0xdf, 0x01, 0x11, 0x02, 0x12, 0x02, 0xe4, 0x01, +0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0xdf, 0x01, 0x17, 0x02, 0xe4, 0x01, 0xe5, 0x01, 0xdf, 0x01, 0x18, 0x02, +0xe4, 0x01, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0xdf, 0x01, 0x1e, 0x02, 0x1f, 0x02, 0xe4, 0x01, +0xe5, 0x01, 0xdf, 0x01, 0x20, 0x02, 0xe4, 0x01, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0xdf, 0x01, 0x24, 0x02, 0xe4, 0x01, +0xe5, 0x01, 0xdf, 0x01, 0x25, 0x02, 0xe4, 0x01, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x2b, 0x02, +0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0xcb, 0x01, 0x69, 0x00, 0x64, 0x01, 0xbc, 0x03, 0x00, 0x00, 0x2e, 0x00, +0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0x05, 0x00, 0x02, 0x00, 0x66, 0x01, 0x67, 0x01, +0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x04, 0x00, 0x64, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x6d, 0x01, 0x64, 0x01, 0x6e, 0x01, 0x02, 0x00, 0x6f, 0x01, 0x04, 0x00, 0x64, 0x01, 0x30, 0x02, 0x64, 0x01, 0xba, 0x01, +0x02, 0x00, 0x31, 0x02, 0x04, 0x00, 0x64, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xbc, 0x01, 0x04, 0x00, 0x64, 0x01, 0x32, 0x02, +0x02, 0x00, 0xc2, 0x01, 0x33, 0x02, 0x34, 0x02, 0xcb, 0x01, 0x69, 0x00, 0x64, 0x01, 0xec, 0x00, 0x00, 0x00, 0x11, 0x00, +0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0xba, 0x01, 0x02, 0x00, 0xcf, 0x01, 0x04, 0x00, +0x64, 0x01, 0x35, 0x02, 0x02, 0x00, 0xc2, 0x01, 0x36, 0x02, 0xcb, 0x01, 0x69, 0x00, 0x64, 0x01, 0x70, 0x11, 0x00, 0x00, +0x97, 0x00, 0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0x05, 0x00, 0x02, 0x00, 0x66, 0x01, +0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x04, 0x00, 0x64, 0x01, 0x0d, 0x00, 0x0e, 0x00, +0x0f, 0x00, 0x6d, 0x01, 0x64, 0x01, 0x6e, 0x01, 0x02, 0x00, 0x6f, 0x01, 0x04, 0x00, 0x64, 0x01, 0x37, 0x02, 0x38, 0x02, +0x64, 0x01, 0x70, 0x01, 0x02, 0x00, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, +0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, +0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, +0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, +0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, +0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, +0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, +0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0x04, 0x00, 0x64, 0x01, 0xba, 0x01, 0x02, 0x00, +0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x04, 0x00, 0x64, 0x01, 0xbf, 0x01, +0x02, 0x00, 0xc0, 0x01, 0x04, 0x00, 0x64, 0x01, 0xc1, 0x01, 0x02, 0x00, 0xc2, 0x01, 0xc3, 0x01, 0x3c, 0x02, 0x3d, 0x02, +0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x47, 0x02, +0x48, 0x02, 0x49, 0x02, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x02, 0x4f, 0x02, 0x50, 0x02, 0x51, 0x02, +0xcb, 0x01, 0x69, 0x00, 0x64, 0x01, 0x72, 0x0d, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, +0x65, 0x01, 0x64, 0x01, 0x05, 0x00, 0x02, 0x00, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, +0x6c, 0x01, 0x04, 0x00, 0x64, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x6d, 0x01, 0x64, 0x01, 0x6e, 0x01, 0x02, 0x00, +0x6f, 0x01, 0x04, 0x00, 0x64, 0x01, 0x70, 0x01, 0x02, 0x00, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, +0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, +0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, +0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, +0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, +0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, +0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, +0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0x04, 0x00, 0x64, 0x01, +0xba, 0x01, 0x02, 0x00, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, 0x64, 0x01, 0xbf, 0x01, 0x02, 0x00, +0xc0, 0x01, 0x04, 0x00, 0x64, 0x01, 0xc1, 0x01, 0x02, 0x00, 0xc2, 0x01, 0xc3, 0x01, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, +0x55, 0x02, 0x56, 0x02, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0x69, 0x00, 0x64, 0x01, 0x88, 0x0c, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0x70, 0x01, 0x02, 0x00, 0x71, 0x01, 0x72, 0x01, +0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, +0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, +0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, +0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, +0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, +0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, +0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, +0xb9, 0x01, 0x04, 0x00, 0x64, 0x01, 0xcc, 0x01, 0x02, 0x00, 0xcd, 0x01, 0xce, 0x01, 0x04, 0x00, 0x64, 0x01, 0xba, 0x01, +0x02, 0x00, 0xcf, 0x01, 0x04, 0x00, 0x64, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xbb, 0x01, 0x04, 0x00, 0x64, 0x01, 0xd0, 0x01, +0x02, 0x00, 0xc2, 0x01, 0x57, 0x02, 0x58, 0x02, 0x59, 0x02, 0xd5, 0x01, 0x5a, 0x02, 0xd7, 0x01, 0xd8, 0x01, 0xd5, 0x01, +0x5b, 0x02, 0x5c, 0x02, 0x5d, 0x02, 0xdf, 0x01, 0x5e, 0x02, 0x5f, 0x02, 0x60, 0x02, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, +0xdf, 0x01, 0xe6, 0x01, 0xe4, 0x01, 0xe7, 0x01, 0xd7, 0x01, 0x61, 0x02, 0xcb, 0x01, 0x69, 0x00, 0x64, 0x01, 0x87, 0x18, +0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0x70, 0x01, 0x02, 0x00, +0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, +0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, +0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, +0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, +0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, +0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, +0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, +0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0x04, 0x00, 0x64, 0x01, 0xcc, 0x01, 0x02, 0x00, 0xcd, 0x01, 0xce, 0x01, 0x04, 0x00, +0x64, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, +0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0x04, 0x00, 0x64, 0x01, 0xba, 0x01, 0x02, 0x00, +0xcf, 0x01, 0x04, 0x00, 0x64, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xbb, 0x01, 0x04, 0x00, 0x64, 0x01, 0xf9, 0x01, 0x02, 0x00, +0xc2, 0x01, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0xd5, 0x01, 0x65, 0x02, 0xd7, 0x01, 0xd8, 0x01, 0xd5, 0x01, 0x66, 0x02, +0x67, 0x02, 0x68, 0x02, 0xdf, 0x01, 0x69, 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x08, 0x02, 0xe4, 0x01, 0xe5, 0x01, 0xdf, 0x01, +0x09, 0x02, 0xe4, 0x01, 0x0a, 0x02, 0xd7, 0x01, 0x6c, 0x02, 0x0c, 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x0e, 0x02, 0xd5, 0x01, +0x0f, 0x02, 0x10, 0x02, 0xdf, 0x01, 0x6f, 0x02, 0x12, 0x02, 0xe4, 0x01, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, +0xdf, 0x01, 0x17, 0x02, 0xe4, 0x01, 0xe5, 0x01, 0xdf, 0x01, 0x18, 0x02, 0xe4, 0x01, 0x70, 0x02, 0x71, 0x02, 0x1d, 0x02, +0xdf, 0x01, 0x72, 0x02, 0x73, 0x02, 0xe4, 0x01, 0xe5, 0x01, 0xdf, 0x01, 0x74, 0x02, 0xe4, 0x01, 0x75, 0x02, 0x76, 0x02, +0x23, 0x02, 0xdf, 0x01, 0x77, 0x02, 0xe4, 0x01, 0xe5, 0x01, 0xdf, 0x01, 0x25, 0x02, 0xe4, 0x01, 0x78, 0x02, 0x79, 0x02, +0x29, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x7a, 0x02, 0xcb, 0x01, 0x69, 0x00, 0x64, 0x01, +0x98, 0x11, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0x05, 0x00, +0x02, 0x00, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x04, 0x00, 0x64, 0x01, +0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x6d, 0x01, 0x64, 0x01, 0x6e, 0x01, 0x02, 0x00, 0x6f, 0x01, 0x04, 0x00, 0x64, 0x01, +0x37, 0x02, 0x38, 0x02, 0x64, 0x01, 0x70, 0x01, 0x02, 0x00, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, +0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, +0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, +0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, +0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, +0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, +0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, +0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0x04, 0x00, 0x64, 0x01, +0xba, 0x01, 0x02, 0x00, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x04, 0x00, +0x64, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xc0, 0x01, 0x04, 0x00, 0x64, 0x01, 0xc1, 0x01, 0x02, 0x00, 0xc2, 0x01, 0xc3, 0x01, +0x7b, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, 0x02, 0x82, 0x02, 0x83, 0x02, 0x84, 0x02, +0x85, 0x02, 0x86, 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, 0x02, 0x8a, 0x02, 0x8b, 0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, +0x50, 0x02, 0x51, 0x02, 0xcb, 0x01, 0x69, 0x00, 0x64, 0x01, + +}; + +int GRID_GRID_OFFSET = 0; +int GRID_GRID_SIZE = 30210; diff --git a/thermion_dart/native/include/material/grid.h b/thermion_dart/native/include/material/grid.h new file mode 100644 index 00000000..58dbdbd3 --- /dev/null +++ b/thermion_dart/native/include/material/grid.h @@ -0,0 +1,13 @@ +#ifndef GRID_H_ +#define GRID_H_ + +#include + +extern "C" { + extern const uint8_t GRID_PACKAGE[]; + extern int GRID_GRID_OFFSET; + extern int GRID_GRID_SIZE; +} +#define GRID_GRID_DATA (GRID_PACKAGE + GRID_GRID_OFFSET) + +#endif From 4e14bd2396f57634dbc9a713dce8fca4d640086d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 22:19:54 +0800 Subject: [PATCH 066/232] fix: ignore pick results directly on axis --- thermion_dart/native/include/Gizmo.hpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/thermion_dart/native/include/Gizmo.hpp b/thermion_dart/native/include/Gizmo.hpp index fd27d03d..21b5127b 100644 --- a/thermion_dart/native/include/Gizmo.hpp +++ b/thermion_dart/native/include/Gizmo.hpp @@ -37,8 +37,11 @@ class Gizmo { void handle(filament::View::PickingQueryResult const &result) { auto x = static_cast(result.fragCoords.x); auto y= static_cast(result.fragCoords.y); - for(int i = 4; i < 7; i++) { + for(int i = 0; i < 7; i++) { if(_gizmo->_entities[i] == result.renderable) { + if(i < 4) { + return; + } _gizmo->highlight(_gizmo->_entities[i - 4]); _callback(Entity::smuggle(_gizmo->_entities[i - 4]), x, y); return; @@ -96,9 +99,9 @@ class Gizmo { Material* _material; MaterialInstance* _materialInstances[7]; math::float4 inactiveColors[3] { - math::float4 { 0.75f, 0.0f, 0.0f, 1.0f }, - math::float4 { 0.0f, 0.75f, 0.0f, 1.0f }, - math::float4 { 0.0f, 0.0f, 0.75f, 1.0f }, + math::float4 { 1.0f, 0.0f, 0.0f, 0.5f }, + math::float4 { 0.0f, 1.0f, 0.0f, 0.5f }, + math::float4 { 0.0f, 0.0f, 1.0f, 0.5f }, }; math::float4 activeColors[3] { math::float4 { 1.0f, 0.0f, 0.0f, 1.0f }, From cf61369a8dfe9523add025a72e1efd84e6b2f4a0 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 22:20:11 +0800 Subject: [PATCH 067/232] chore: clean up old commented code --- thermion_dart/native/src/SceneManager.cpp | 108 ---------------------- 1 file changed, 108 deletions(-) diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 55d2fef0..5897426c 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -1813,41 +1813,6 @@ namespace thermion_filament tm.setTransform(transformInstance, newTransform); } - // Log("view matrix %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", - // viewMatrix[0][0], viewMatrix[0][1], viewMatrix[0][2], viewMatrix[0][3], - // viewMatrix[1][0], viewMatrix[1][1], viewMatrix[1][2], viewMatrix[1][3], - // viewMatrix[2][0], viewMatrix[2][1], viewMatrix[2][2], viewMatrix[2][3], - // viewMatrix[3][0], viewMatrix[3][1], viewMatrix[3][2], viewMatrix[3][3]); - - // math::float4 worldspace = { 250.0f, 0.0f, 0.0f, 1.0f }; - // math::float4 viewSpace = viewMatrix * worldspace; - // Log("viewspace %f %f %f %f", viewSpace.x, viewSpace.y, viewSpace.z, viewSpace.w); - - // math::float4 clipSpace = camera.getProjectionMatrix() * viewSpace; - // Log("clip space %f %f %f %f", clipSpace.x, clipSpace.y, clipSpace.z, clipSpace.w); - - // math::float4 ndc = clipSpace / clipSpace.w; - // Log("ndc %f %f %f %f", ndc.x, ndc.y, ndc.z, ndc.w); - - // ndc.x = -1.0; - - // // Multiply by inverse view-projection matrix - // auto inverseProj = inverse(camera.getProjectionMatrix()); - // clipSpace = inverseProj * math::float4 { ndc.x, ndc.y, ndc.z, 1.0f }; - // viewSpace = clipSpace / clipSpace.w; - // Log("clip space %f %f %f %f", viewSpace.x, viewSpace.y, viewSpace.z, viewSpace.w); - - // auto inverseView = inverse(viewMatrix); - // worldspace = inverseView * viewSpace; - // Log("worldspace space %f %f %f %f", worldspace.x, worldspace.y, worldspace.z, worldspace.w); - - // return; - - // Log("viewMatrixRotation %f %f %f %f %f %f %f %f %f", - // viewMatrixRotation[0][0], viewMatrixRotation[0][1], viewMatrixRotation[0][2], - // viewMatrixRotation[1][0], viewMatrixRotation[1][1], viewMatrixRotation[1][2], - // viewMatrixRotation[2][0], viewMatrixRotation[2][1], viewMatrixRotation[2][2]); - void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z) { auto worldAxis = math::float3{x, y, z}; @@ -1892,7 +1857,6 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v ndcAxis = (camera.getProjectionMatrix() * math::float4(viewMatrix.upperLeft() * perpendicularAxis, 0.0f)).xy; - Log("Corrected NDC axis %f %f", ndcAxis.x, ndcAxis.y); if (std::isnan(ndcAxis.x) || std::isnan(ndcAxis.y)) { return; } @@ -1994,78 +1958,6 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v _transformUpdates[entity] = curr; } - // void SceneManager::queuePositionUpdate(EntityId entity, float x, float y, float z, bool relative) - // { - // std::lock_guard lock(_mutex); - - // const auto &pos = _transformUpdates.find(entity); - // if (pos == _transformUpdates.end()) - // { - // _transformUpdates.emplace(entity, std::make_tuple(math::float3(), true, math::quatf(1.0f), true, 1.0f)); - // } - // auto curr = _transformUpdates[entity]; - // auto &trans = std::get<0>(curr); - - // const auto &tm = _engine->getTransformManager(); - // auto transformInstance = tm.getInstance(Entity::import(entity)); - // auto transform = tm.getTransform(transformInstance); - // math::double4 position { 0.0f, 0.0f, 0.0f, 1.0f}; - // math::mat4 worldTransform = tm.getWorldTransformAccurate(transformInstance); - // position = worldTransform * position; - - // // Get camera's view matrix and its inverse - // const Camera &camera = _view->getCamera(); - - // math::mat4 viewMatrix = camera.getViewMatrix(); - // math::mat4 invViewMatrix = inverse(viewMatrix); - - // // Transform object position to view space - // math::double4 viewSpacePos = viewMatrix * position; - - // Log("viewSpacePos %f %f %f %f", viewSpacePos.x, viewSpacePos.y, viewSpacePos.z, viewSpacePos.w); - - // // Calculate plane distance from camera - // float planeDistance = -viewSpacePos.z; - - // const auto &vp = _view->getViewport(); - - // // Calculate viewport to world scale at the object's distance - // float viewportToWorldScale = planeDistance * std::tan(camera.getFieldOfViewInDegrees(Camera::Fov::VERTICAL) * 0.5f * M_PI / 180.0f) * 2.0f / vp.height; - - // // Log("viewportToWorldScale %f", viewportToWorldScale); - - // // Calculate view space delta - // math::float4 viewSpaceDelta( - // x * viewportToWorldScale, - // -y * viewportToWorldScale, // Invert y-axis - // z * viewportToWorldScale, - // 0.0f); // Use 0 for the w component as it's a direction, not a position - - // // Log("viewSpaceDelta %f %f %f", viewSpaceDelta.x, viewSpaceDelta.y, viewSpaceDelta.z); - - // // Transform delta to world space - // math::float4 worldDelta = invViewMatrix * viewSpaceDelta; - - // // Log("worldDelta %f %f %f", worldDelta.x, worldDelta.y, worldDelta.z); - - // if (relative) - // { - // trans.x += worldDelta.x; - // trans.y += worldDelta.y; - // trans.z += worldDelta.z; - // } - // else - // { - // trans.x = worldDelta.x; - // trans.y = worldDelta.y; - // trans.z = worldDelta.z; - // } - - // auto &isRelative = std::get<1>(curr); - // isRelative = relative; - // _transformUpdates[entity] = curr; - // } - void SceneManager::queueRotationUpdate(EntityId entity, float rads, float x, float y, float z, float w, bool relative) { std::lock_guard lock(_mutex); From 2284d9d0812628590d78514609b8f8e62eb80eea Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 22:20:27 +0800 Subject: [PATCH 068/232] feat: grid uses own material --- thermion_dart/native/src/GridOverlay.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/thermion_dart/native/src/GridOverlay.cpp b/thermion_dart/native/src/GridOverlay.cpp index fa804f47..f7a358fd 100644 --- a/thermion_dart/native/src/GridOverlay.cpp +++ b/thermion_dart/native/src/GridOverlay.cpp @@ -7,7 +7,7 @@ #include #include -#include "material/gizmo.h" +#include "material/grid.h" #include "Log.hpp" namespace thermion_filament { @@ -76,13 +76,20 @@ GridOverlay::GridOverlay(Engine &engine) : _engine(engine) )); _gridEntity = entityManager.create(); - // _materialInstance = _material->createInstance(); - // _materialInstance->setParameter("color", math::float3{0.5f, 0.5f, 0.5f}); // Gray color for the grid + _material = Material::Builder() + .package(GRID_PACKAGE, GRID_GRID_SIZE) + .build(engine); + + _materialInstance = _material->createInstance(); + + _materialInstance->setParameter("maxDistance", 50.0f); // Adjust as needed + _materialInstance->setParameter("color", math::float3{0.5f, 0.5f, 0.5f}); // Gray color for the grid + RenderableManager::Builder(1) .boundingBox({{-gridSize * gridSpacing / 2, 0, -gridSize * gridSpacing / 2}, {gridSize * gridSpacing / 2, 0, gridSize * gridSpacing / 2}}) - // .material(0, _materialInstance) + .material(0, _materialInstance) .geometry(0, RenderableManager::PrimitiveType::LINES, vb, ib, 0, vertexCount) .priority(6) .layerMask(0xFF, 4) From 9a87eb4d9b0301594e831915382a6ef58e4b553e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 22:21:09 +0800 Subject: [PATCH 069/232] feat: allow passing null options to ThermionWidget --- .../lib/thermion/widgets/thermion_widget.dart | 2 +- .../lib/thermion/widgets/thermion_widget_web_impl.dart | 9 ++++++--- .../lib/thermion/widgets/thermion_widget_web_stub.dart | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart index c903e7a4..d0a6bf94 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart @@ -95,7 +95,7 @@ class _ThermionWidgetState extends State { return ResizeObserver( onResized: _resizeTexture, child: ThermionWidgetWeb( - options: widget.options! as ThermionFlutterWebOptions)); + options: widget.options as ThermionFlutterWebOptions?)); } if (_texture?.usesBackingWindow == true) { diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart index 752f5116..e1302aba 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart @@ -6,13 +6,16 @@ import 'package:web/web.dart'; import 'package:flutter/widgets.dart'; class ThermionWidgetWeb extends StatelessWidget { - final ThermionFlutterWebOptions options; + + late final ThermionFlutterWebOptions options; - const ThermionWidgetWeb({super.key, required this.options}); + const ThermionWidgetWeb({super.key, ThermionFlutterWebOptions? options}) { + this.options = options ?? ThermionFlutterWebOptions(); + } @override Widget build(BuildContext context) { - if (options.importCanvasAsWidget) { + if (options?.importCanvasAsWidget == true) { return _ImageCopyingWidget(); } return Container(color: const Color(0x00000000)); diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart index db61a5b5..01514bb8 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_stub.dart @@ -4,7 +4,7 @@ import 'package:thermion_flutter_ffi/thermion_flutter_ffi.dart'; import 'package:thermion_flutter_web/thermion_flutter_web_options.dart'; class ThermionWidgetWeb extends StatefulWidget { - final ThermionFlutterWebOptions options; + final ThermionFlutterWebOptions? options; const ThermionWidgetWeb({super.key, required this.options}); From e04390b2fe13ef853aa4d5196df6cc01883e8f59 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 22:21:19 +0800 Subject: [PATCH 070/232] feat: add grid material --- materials/grid.mat | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 materials/grid.mat diff --git a/materials/grid.mat b/materials/grid.mat new file mode 100644 index 00000000..cf3faf25 --- /dev/null +++ b/materials/grid.mat @@ -0,0 +1,53 @@ +material { + name : Grid, + parameters : [ + { + type : float, + name : maxDistance + }, + { + type : float3, + name : color + } + ], + depthWrite : true, + depthCulling : false, + shadingModel : unlit, + blending: transparent, + variantFilter : [ skinning, shadowReceiver, vsm ], + culling: none, + instanced: false, + vertexDomain: object +} + +vertex { + void materialVertex(inout MaterialVertexInputs material) { + material.worldPosition = getWorldFromModelMatrix() * getPosition(); + } +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + + // Convert world position to view space + float4 viewPos = getViewFromWorldMatrix() * float4(getWorldPosition(), 1.0); + + // Calculate distance in view space (camera is at 0,0,0 in view space) + float distance = length(viewPos.xz); + + // Discard fragment if it's too far from the camera + if (distance > materialParams.maxDistance) { + material.baseColor = float4(0.0); + } else { + material.baseColor = float4(materialParams.color, 1.0); + + // Optional: fade out as we approach maxDistance + float fadeStart = materialParams.maxDistance * 0.8; + if (distance > fadeStart) { + float fade = 1.0 - (distance - fadeStart) / (materialParams.maxDistance - fadeStart); + material.baseColor.a = fade; + } + } + } +} \ No newline at end of file From 226c45ee2e3d8a83167c983373d110c3affe5155 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 5 Sep 2024 22:22:25 +0800 Subject: [PATCH 071/232] chore: minor widget fixes --- .../widgets/camera/camera_options_widget.dart | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_options_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_options_widget.dart index b962c674..7e100c7d 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_options_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_options_widget.dart @@ -82,19 +82,19 @@ class _CameraOptionsWidgetState extends State { child: Container( decoration: BoxDecoration(color: Colors.white.withOpacity(0.5)), child: SliderTheme( - data: SliderThemeData( + data: const SliderThemeData( showValueIndicator: ShowValueIndicator.always, valueIndicatorTextStyle: TextStyle(color: Colors.black)), child: Column(mainAxisSize: MainAxisSize.min, children: [ Row(children: [ - Text("Aperture"), + const Text("Aperture"), Expanded( child: TextField( controller: _apertureController, )), - Text("Speed"), + const Text("Speed"), Expanded(child: TextField(controller: _speedController)), - Text("Sensitivity"), + const Text("Sensitivity"), Expanded( child: TextField(controller: _sensitivityController)), ]), @@ -112,7 +112,7 @@ class _CameraOptionsWidgetState extends State { }) ]), Row(children: [ - Text("Focal length"), + const Text("Focal length"), Slider( label: _focalLength.toString(), value: _focalLength, @@ -127,7 +127,7 @@ class _CameraOptionsWidgetState extends State { }) ]), Row(children: [ - Text("X"), + const Text("X"), Slider( label: widget.cameraOrientation.position.x.toString(), value: widget.cameraOrientation.position.x, @@ -141,7 +141,7 @@ class _CameraOptionsWidgetState extends State { }) ]), Row(children: [ - Text("Y"), + const Text("Y"), Slider( label: widget.cameraOrientation.position.y.toString(), value: widget.cameraOrientation.position.y, @@ -155,7 +155,7 @@ class _CameraOptionsWidgetState extends State { }) ]), Row(children: [ - Text("Z"), + const Text("Z"), Slider( label: widget.cameraOrientation.position.z.toString(), value: widget.cameraOrientation.position.z, @@ -169,7 +169,7 @@ class _CameraOptionsWidgetState extends State { }) ]), Row(children: [ - Text("ROTX"), + const Text("ROTX"), Slider( label: widget.cameraOrientation.rotationX.toString(), value: widget.cameraOrientation.rotationX, @@ -183,7 +183,7 @@ class _CameraOptionsWidgetState extends State { }) ]), Row(children: [ - Text("ROTY"), + const Text("ROTY"), Slider( label: widget.cameraOrientation.rotationY.toString(), value: widget.cameraOrientation.rotationY, @@ -197,7 +197,7 @@ class _CameraOptionsWidgetState extends State { }), ]), Row(children: [ - Text("ROTZ"), + const Text("ROTZ"), Slider( label: widget.cameraOrientation.rotationZ.toString(), value: widget.cameraOrientation.rotationZ, @@ -213,7 +213,7 @@ class _CameraOptionsWidgetState extends State { Wrap( children: [ GestureDetector( - child: Text("Main "), + child: const Text("Main "), onTap: () { widget.controller.setMainCamera(); }, From 9c5156e41a23adfe40d93f6d357185ae497774eb Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 6 Sep 2024 12:36:16 +0800 Subject: [PATCH 072/232] feat: add flag for keepData for gltf instancing, add highlightScene, add stencilHighlight method --- materials/unlit.mat | 33 + thermion_dart/hook/build.dart | 1 + .../compatibility/native/thermion_dart.g.dart | 42 +- .../lib/thermion_dart/thermion_viewer.dart | 19 +- .../thermion_dart/thermion_viewer_ffi.dart | 21 +- .../native/include/FilamentViewer.hpp | 1 + thermion_dart/native/include/SceneManager.hpp | 11 +- .../native/include/ThermionDartApi.h | 7 +- .../native/include/ThermionDartFFIApi.h | 6 +- .../material/UnlitMaterialProvider.hpp | 72 + thermion_dart/native/include/material/unlit.S | 12 + .../native/include/material/unlit.apple.S | 12 + .../native/include/material/unlit.bin | Bin 0 -> 26426 bytes thermion_dart/native/include/material/unlit.c | 1332 +++++++++++++++++ thermion_dart/native/include/material/unlit.h | 13 + thermion_dart/native/src/FilamentViewer.cpp | 34 +- thermion_dart/native/src/SceneManager.cpp | 48 +- thermion_dart/native/src/ThermionDartApi.cpp | 17 +- .../native/src/ThermionDartFFIApi.cpp | 18 +- thermion_dart/test/integration_test.dart | 361 ++++- 20 files changed, 1967 insertions(+), 93 deletions(-) create mode 100644 materials/unlit.mat create mode 100644 thermion_dart/native/include/material/UnlitMaterialProvider.hpp create mode 100644 thermion_dart/native/include/material/unlit.S create mode 100644 thermion_dart/native/include/material/unlit.apple.S create mode 100644 thermion_dart/native/include/material/unlit.bin create mode 100644 thermion_dart/native/include/material/unlit.c create mode 100644 thermion_dart/native/include/material/unlit.h diff --git a/materials/unlit.mat b/materials/unlit.mat new file mode 100644 index 00000000..4d1d4c3e --- /dev/null +++ b/materials/unlit.mat @@ -0,0 +1,33 @@ +material { + name : unlit, + parameters : [ + { + type : float3, + name : color + }, + { + type : float, + name : scale + } + ], + depthWrite : true, + depthCulling : false, + shadingModel : unlit, + blending: opaque, + variantFilter : [ skinning, shadowReceiver, vsm ], + culling: none, + instanced: false, + vertexDomain: object +} + vertex { + void materialVertex(inout MaterialVertexInputs material) { + material.worldPosition = materialParams.scale * getWorldFromModelMatrix() * getPosition(); + } + } + + fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor = float4(materialParams.color, 1.0); + } + } diff --git a/thermion_dart/hook/build.dart b/thermion_dart/hook/build.dart index f7b4943a..9b561f39 100644 --- a/thermion_dart/hook/build.dart +++ b/thermion_dart/hook/build.dart @@ -61,6 +61,7 @@ void main(List args) async { "${config.packageRoot.toFilePath()}/native/include/material/gizmo.c", "${config.packageRoot.toFilePath()}/native/include/material/image.c", "${config.packageRoot.toFilePath()}/native/include/material/grid.c", + "${config.packageRoot.toFilePath()}/native/include/material/unlit.c", ]); var libs = [ diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart index b27410e5..b065bfbe 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart @@ -206,28 +206,33 @@ external void set_light_direction( ); @ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Int)>() + EntityId Function( + ffi.Pointer, ffi.Pointer, ffi.Int, ffi.Bool)>() external int load_glb( ffi.Pointer sceneManager, ffi.Pointer assetPath, int numInstances, -); - -@ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Size)>() -external int load_glb_from_buffer( - ffi.Pointer sceneManager, - ffi.Pointer data, - int length, + bool keepData, ); @ffi.Native< EntityId Function( - ffi.Pointer, ffi.Pointer, ffi.Pointer)>() + ffi.Pointer, ffi.Pointer, ffi.Size, ffi.Bool)>() +external int load_glb_from_buffer( + ffi.Pointer sceneManager, + ffi.Pointer data, + int length, + bool keepData, +); + +@ffi.Native< + EntityId Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>() external int load_gltf( ffi.Pointer sceneManager, ffi.Pointer assetPath, ffi.Pointer relativePath, + bool keepData, ); @ffi.Native, EntityId)>() @@ -1111,6 +1116,12 @@ external void set_gizmo_visibility( bool visible, ); +@ffi.Native, EntityId)>() +external void set_stencil_highlight( + ffi.Pointer sceneManager, + int entity, +); + @ffi.Native< ffi.Void Function( ffi.Pointer, @@ -1347,12 +1358,17 @@ external void clear_lights_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Int, + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Bool, ffi.Pointer>)>() external void load_glb_ffi( ffi.Pointer sceneManager, ffi.Pointer assetPath, int numInstances, + bool keepData, ffi.Pointer> callback, ); @@ -1362,12 +1378,14 @@ external void load_glb_ffi( ffi.Pointer, ffi.Size, ffi.Int, + ffi.Bool, ffi.Pointer>)>() external void load_glb_from_buffer_ffi( ffi.Pointer sceneManager, ffi.Pointer data, int length, int numInstances, + bool keepData, ffi.Pointer> callback, ); @@ -1376,11 +1394,13 @@ external void load_glb_from_buffer_ffi( ffi.Pointer, ffi.Pointer, ffi.Pointer, + ffi.Bool, ffi.Pointer>)>() external void load_gltf_ffi( ffi.Pointer sceneManager, ffi.Pointer assetPath, ffi.Pointer relativePath, + bool keepData, ffi.Pointer> callback, ); diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index 7ace4468..fbde2d28 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -199,11 +199,14 @@ abstract class ThermionViewer { /// /// Load the .glb asset at the given path and insert into the scene. + /// Specify [numInstances] to create multiple instances (this is more efficient than dynamically instantating at a later time). You can then retrieve the created instances with [getInstances]. + /// If you want to be able to call [createInstance] at a later time, you must pass true for [keepData]. + /// If [keepData] is false, the source glTF data will be released and [createInstance] will throw an exception. /// - Future loadGlb(String path, {int numInstances = 1}); + Future loadGlb(String path, {int numInstances = 1, bool keepData = false}); /// - /// Create a new instance of [entity]. + /// Create a new instance of [entity]. /// Future createInstance(ThermionEntity entity); @@ -221,9 +224,11 @@ abstract class ThermionViewer { /// Load the .gltf asset at the given path and insert into the scene. /// [relativeResourcePath] is the folder path where the glTF resources are stored; /// this is usually the parent directory of the .gltf file itself. + /// + /// See [loadGlb] for an explanation of [keepData]. /// Future loadGltf(String path, String relativeResourcePath, - {bool force = false}); + {bool keepData = false}); /// /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. @@ -577,7 +582,8 @@ abstract class ThermionViewer { /// /// Set the world space position for [lightEntity] to the given coordinates. /// - Future setLightPosition(ThermionEntity lightEntity, double x, double y, double z); + Future setLightPosition( + ThermionEntity lightEntity, double x, double y, double z); /// /// Sets the world space direction for [lightEntity] to the given vector. @@ -810,4 +816,9 @@ abstract class ThermionViewer { /// Show/hide the translation gizmo. /// Future setGizmoVisibility(bool visible); + + /// + /// Outlines [entity]. + /// + Future setStencilHighlight(ThermionEntity entity); } diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index c195ee43..ed48c139 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -403,8 +403,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future createInstance(ThermionEntity entity) async { - var created = await withIntCallback( - (callback) => create_instance(_sceneManager!, entity)); + var created = create_instance(_sceneManager!, entity); if (created == _FILAMENT_ASSET_ERROR) { throw Exception("Failed to create instance"); } @@ -440,13 +439,13 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future loadGlb(String path, - {bool unlit = false, int numInstances = 1}) async { + {bool unlit = false, int numInstances = 1, bool keepData = false}) async { if (unlit) { throw Exception("Not yet implemented"); } final pathPtr = path.toNativeUtf8(allocator: allocator).cast(); var entity = await withIntCallback((callback) => - load_glb_ffi(_sceneManager!, pathPtr, numInstances, callback)); + load_glb_ffi(_sceneManager!, pathPtr, numInstances, keepData, callback)); allocator.free(pathPtr); if (entity == _FILAMENT_ASSET_ERROR) { throw Exception("An error occurred loading the asset at $path"); @@ -461,12 +460,12 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future loadGltf(String path, String relativeResourcePath, - {bool force = false}) async { + {bool keepData = false}) async { final pathPtr = path.toNativeUtf8(allocator: allocator).cast(); final relativeResourcePathPtr = relativeResourcePath.toNativeUtf8(allocator: allocator).cast(); var entity = await withIntCallback((callback) => load_gltf_ffi( - _sceneManager!, pathPtr, relativeResourcePathPtr, callback)); + _sceneManager!, pathPtr, relativeResourcePathPtr, keepData, callback)); allocator.free(pathPtr); allocator.free(relativeResourcePathPtr); if (entity == _FILAMENT_ASSET_ERROR) { @@ -1300,9 +1299,11 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future setLightDirection(ThermionEntity lightEntity, Vector3 direction) async { + Future setLightDirection( + ThermionEntity lightEntity, Vector3 direction) async { direction.normalize(); - set_light_direction(_viewer!, lightEntity, direction.x, direction.y, direction.z); + set_light_direction( + _viewer!, lightEntity, direction.x, direction.y, direction.z); } /// @@ -1828,4 +1829,8 @@ class ThermionViewerFFI extends ThermionViewer { Future setGizmoVisibility(bool visible) async { set_gizmo_visibility(_sceneManager!, visible); } + + Future setStencilHighlight(ThermionEntity entity) async { + set_stencil_highlight(_sceneManager!, entity); + } } diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index ead61fbb..1065e836 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -174,6 +174,7 @@ namespace thermion_filament const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; void* _context = nullptr; Scene *_scene = nullptr; + Scene *_highlightScene = nullptr; View *_view = nullptr; Engine *_engine = nullptr; diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index dbf55e03..14742178 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -46,10 +46,11 @@ namespace thermion_filament const ResourceLoaderWrapperImpl *const loader, Engine *engine, Scene *scene, + Scene *highlightScene, const char *uberArchivePath); ~SceneManager(); - EntityId loadGltf(const char *uri, const char *relativeResourcePath); + EntityId loadGltf(const char *uri, const char *relativeResourcePath, bool keepData = false); //// /// @brief Load the GLB from the specified path, optionally creating multiple instances. @@ -57,8 +58,8 @@ namespace thermion_filament /// @param numInstances the number of instances to create. /// @return an Entity representing the FilamentAsset associated with the loaded FilamentAsset. /// - EntityId loadGlb(const char *uri, int numInstances); - EntityId loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances = 1); + EntityId loadGlb(const char *uri, int numInstances, bool keepData); + EntityId loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances = 1, bool keepData = false); EntityId createInstance(EntityId entityId); void remove(EntityId entity); @@ -157,6 +158,8 @@ namespace thermion_filament bool addAnimationComponent(EntityId entity); void removeAnimationComponent(EntityId entity); + void setStencilHighlight(EntityId entity); + /// @brief returns the number of instances of the FilamentAsset represented by the given entity. /// @param entityId /// @return the number of instances @@ -194,9 +197,11 @@ namespace thermion_filament const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; Engine *_engine = nullptr; Scene *_scene = nullptr; + Scene *_highlightScene = nullptr; View* _view = nullptr; gltfio::MaterialProvider *_ubershaderProvider = nullptr; + gltfio::MaterialProvider *_unlitMaterialProvider = nullptr; gltfio::ResourceLoader *_gltfResourceLoader = nullptr; gltfio::TextureProvider *_stbDecoder = nullptr; gltfio::TextureProvider *_ktxDecoder = nullptr; diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 5dde05d6..6e2044fe 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -95,9 +95,9 @@ extern "C" EMSCRIPTEN_KEEPALIVE void clear_lights(const void *const viewer); EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, EntityId light, float x, float y, float z); EMSCRIPTEN_KEEPALIVE void set_light_direction(const void *const viewer, EntityId light, float x, float y, float z); - EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances); - EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length); - EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath); + EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances, bool keepData); + EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length, bool keepData); + EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath, bool keepData); EMSCRIPTEN_KEEPALIVE EntityId create_instance(void *sceneManager, EntityId id); EMSCRIPTEN_KEEPALIVE int get_instance_count(void *sceneManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE void get_instances(void *sceneManager, EntityId entityId, EntityId *out); @@ -259,6 +259,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled); EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)); EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible); + EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entity); #ifdef __cplusplus } diff --git a/thermion_dart/native/include/ThermionDartFFIApi.h b/thermion_dart/native/include/ThermionDartFFIApi.h index 7a49cf5f..a61cd6c9 100644 --- a/thermion_dart/native/include/ThermionDartFFIApi.h +++ b/thermion_dart/native/include/ThermionDartFFIApi.h @@ -66,9 +66,9 @@ extern "C" void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void remove_light_ffi(void *const viewer, EntityId entityId); EMSCRIPTEN_KEEPALIVE void clear_lights_ffi(void *const viewer); - EMSCRIPTEN_KEEPALIVE void load_glb_ffi(void *const sceneManager, const char *assetPath, int numInstances, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, const void *const data, size_t length, int numInstances, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void load_gltf_ffi(void *const sceneManager, const char *assetPath, const char *relativePath, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void load_glb_ffi(void *const sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, const void *const data, size_t length, int numInstances, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void load_gltf_ffi(void *const sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void create_instance_ffi(void *const sceneManager, EntityId entityId, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void remove_entity_ffi(void *const viewer, EntityId asset, void (*callback)()); EMSCRIPTEN_KEEPALIVE void clear_entities_ffi(void *const viewer, void (*callback)()); diff --git a/thermion_dart/native/include/material/UnlitMaterialProvider.hpp b/thermion_dart/native/include/material/UnlitMaterialProvider.hpp new file mode 100644 index 00000000..c1f9dffc --- /dev/null +++ b/thermion_dart/native/include/material/UnlitMaterialProvider.hpp @@ -0,0 +1,72 @@ +#ifndef UNLIT_MATERIAL_PROVIDER_HPP +#define UNLIT_MATERIAL_PROVIDER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace thermion_filament { + +class UnlitMaterialProvider : public filament::gltfio::MaterialProvider { +private: + filament::Material* mUnlitMaterial; + const filament::Material* mMaterials[1]; + filament::Engine* mEngine; + +public: + UnlitMaterialProvider(filament::Engine* engine, const void* const data, const size_t size) : mEngine(engine) { + mUnlitMaterial = filament::Material::Builder() + .package(data, size) + .build(*engine); + mMaterials[0] = mUnlitMaterial; + } + + ~UnlitMaterialProvider() { + mEngine->destroy(mUnlitMaterial); + } + + filament::MaterialInstance* createMaterialInstance(filament::gltfio::MaterialKey* config, + filament::gltfio::UvMap* uvmap, + const char* label = "unlit", + const char* extras = nullptr) override { + auto instance = mUnlitMaterial->createInstance(); + + // Set default parameters + instance->setParameter("color", filament::math::float3{1.0f, 1.0f, 1.0f}); + instance->setParameter("scale", 1.0f); + + return instance; + } + + filament::Material* getMaterial(filament::gltfio::MaterialKey* config, + filament::gltfio::UvMap* uvmap, + const char* label = "unlit") override { + return mUnlitMaterial; + } + + const filament::Material* const* getMaterials() const noexcept override { + return mMaterials; + } + + size_t getMaterialsCount() const noexcept override { + return 1; + } + + void destroyMaterials() override { + // Materials are destroyed in the destructor + } + + bool needsDummyData(filament::VertexAttribute attrib) const noexcept override { + // For unlit material, we don't need dummy data for any attribute + return false; + } +}; + +} // namespace thermion_filament + +#endif // UNLIT_MATERIAL_PROVIDER_HPP \ No newline at end of file diff --git a/thermion_dart/native/include/material/unlit.S b/thermion_dart/native/include/material/unlit.S new file mode 100644 index 00000000..c17de370 --- /dev/null +++ b/thermion_dart/native/include/material/unlit.S @@ -0,0 +1,12 @@ + .global UNLIT_UNLIT_OFFSET; + .global UNLIT_UNLIT_SIZE; + + .global UNLIT_PACKAGE + .section .rodata +UNLIT_PACKAGE: + .incbin "unlit.bin" +UNLIT_UNLIT_OFFSET: + .int 0 +UNLIT_UNLIT_SIZE: + .int 26426 + diff --git a/thermion_dart/native/include/material/unlit.apple.S b/thermion_dart/native/include/material/unlit.apple.S new file mode 100644 index 00000000..95391011 --- /dev/null +++ b/thermion_dart/native/include/material/unlit.apple.S @@ -0,0 +1,12 @@ + .global _UNLIT_UNLIT_OFFSET; + .global _UNLIT_UNLIT_SIZE; + + .global _UNLIT_PACKAGE + .section __TEXT,__const +_UNLIT_PACKAGE: + .incbin "unlit.bin" +_UNLIT_UNLIT_OFFSET: + .int 0 +_UNLIT_UNLIT_SIZE: + .int 26426 + diff --git a/thermion_dart/native/include/material/unlit.bin b/thermion_dart/native/include/material/unlit.bin new file mode 100644 index 0000000000000000000000000000000000000000..15ab3fa6e0ab02e0da6c00c05fcf141edb9aed4d GIT binary patch literal 26426 zcmeHP33y~jajt%Ad%d=?*IYiZ;o-$*WVEv8&}G>RT1o3wEUjcoyEcerGSWOrV~=L! zId-+{IB~eIBn~752#|yOzVAB;x5<3~34|ohi6JLvz~ry$e(&`=M$%#@eCCV3UA@=c z)z#Hi)zwwq^)xp-exx`*GIbge?)C$UKva+(;Y6j)g z=2lDP`thKA`hiA$!>i7EOZ7%Ms69j1hTV4Vuh+b==uFic>#LR8O3-7+RH@}PDy8a7 z3G_7S%$cbXnb7Az<7wpV+^L*hJ873vXHk_&DmI0XsnR+rT~S%Ajvcs;oS-zf?k%;e zr3URVJ({IDo#wwc=ydbiYP6SH?S@BZ=!)g~3hi8D3g=6W6|c3wy}ax-itF`erB$id zKwPr1RjRFcwN{gME%HoFmrAW%S@N1AwepRg@R8j86T`W3&= z*wI`nRlT5m+76%)&Rl@H7z!V1?$Goo3;0aG0#A4U;Vrw(SxPfu7Y>b2?hn*yY-)Bs zC`=w0pA8BVvp34PqNH;-jt45J&=MBr#^-|q&Cea02oTJT=0<|TbfhqKI6zG^)3Y-S z#`EK`_-Ab5uyB^^?k&FbA@9ERvX!xsgED7D!W$K6klPZF+`^#d^K!lQA=WBedzrY;o@3$Qa&k zoSwaYWOn-Sp|Q<~>KmqN=|sKV$~0T$Y@xTyZEIug#!PiW)^2GbjRD~I?XH%NZ+<%t z5#1a_cOXD{E}G|(c|y=q?=2KCg1j!9=ZcZ}syuUU#n*|O{g+z|MAbak3}nqb>%iod zEA6#)s2Xe2dc5M+umVdW=Qe!QP)FSbs%kXRe>oQR(Jja06}&1UF^RY%T|qGT{*ch1U}3As@13wRID0+6x^HR6}O;5Mz2~e zvcRpfMpo0H1-EWBG3dHg)}Xg)P_RGI)J)X05;bkBrp+T9LxoK7I9~J+8y1YNIe{91 zJ{bU&!q-K9^@S+7mh2jhq8!3|$=2ntbtQaV6+pI`74yby=E2y+-Xd=i-Ki$4){<4V zWL2H3M2zbvPwM4m5HpW%O?GG`tD4EGmR%+2+l;@7 z-0p%omY)|OuGW`I>|DV*!@^Z+uF$jQHCF?_ixmJXAC^#Tdj&?mR9o_jaI!qCQ?8dz z*gmmA7Gry2yxI5Wz}R}F46-V*nU0i*()@Bv^rQvpu;0KSSBbG-%BMf9)7 zTj)Isx|x~)k1s(+fIh>-zk3*8#=Kn_!&2$l=z^GZ^Ksyd4pQkk(KSpEjL(Vy^LoQu zs)$b((dc1HHef{t-j^>(xvv?DbQid7bWMI#qKMZb!FqF==?(XZl<=)NKk-z#Ari#MXd#0$}{;(h2>@j9ei z;BEK;jc;6=rM2~{*BEUtdTwwe!!mZQLDO~+7N-nt4-;ZdS)nVyoMmQpQZA_HMV;DAk(qaXj8O^D&ew@Q2tfi}Pq@A={xoC-o4$*1>M@9P$J8JtwfQ@^hox zU8-W`Wda!t6hxAGo9^n;ejqbHZ6dyG@;UJv8S2WofIOZq%iNOWV45Uh-%=%+FEF>a zr-v|?ofJ`{DdOP^)2zgNAL}`*cDdfl)a3N5a?;ZVAByJjR-B#U1~!1)A;qnZ}sSpb_K-s&Ak{G{+|!yMs;ZLx#g zupvCowYRSDP*>N2Zv{7Uw95k)v;E;IW-_V>y5=~zpQ$X}f}0^&g|zM75BenDH=v@F z7-xT_)ts*%;Pb&`w9GUd?eS*;PKQJFunHS#`uMTAUX`e02iTGiPd201{~nlduO<=V zb(6*Mo92s4)e3gKcC}h8SM))Jdo?(7Ya5Z-mgn7rTb?oxx;d=2*g5yy{P^tnbaDKN z<2XG(d}toi>U5%x1uc@1#UDLMz{JfFNF1N9zk{c6N>LmbxZjT^#8oQ}Zh0^<*uVL? z1llEZPM#OZF+vgTFkzz8#UZwmQ9Izpj$qu&J26hqE(X(&E{3p4h$x1JFhWce9WnY_ zPBDv1A`m7@-$87_{sdsQW;u9TZ~)QM!onhzcI-uhtT;4;j+nQ$`SOI-mvSOA*abOlavYjG!$DLLghXk3SK7JH zK(dc-A^nAs&$2t{@9jsd+sPl}nI#s!KC{Gjw8eoUA_+hK>=1XRveG}IPUoc9jPx)R zO@07soX)h+(==@zNE$#1A^lFVm}-0Oau~M7y-Yvw`pJxTPAx1<4~Tp>o6X*j;^CiS zyb%{rGz{3DxUJ|&f(22_{{@dXxp=TU7&{d8_mYsXKCxvM8XxUfiYF4=Gq-eK@^Z7W zO^b!|ANY-Fo;NlHc;(h*)~VdB@Lpd8A-xY0xu?)O@=e4 z=*EC(HvK}dFAkmzP#Z@kCp$t+DqDLpx!fsuGP#`P$)IQ8$>j2K{J`zO{ttq9!v}@h zm(eewGlTvq?QwU8QCjW{1`>aQk#+WG^iY;VvsE|WqltIKSxsz8mQSN;@aJHzz(Cg~ zZjE%=o?in{mTcUy!NTBtnc7mdUH05-*1T4!T11XYwX(R+s&7`-%2)BPp4ENGR&26g zQ$xyO6HbnYn@IE;CKo@ldlfc1WhVt7`Hjs3T?S<9kjzx_TVg@3U+o8n7CBbd5<_Vc zqXDi&VI_>mW2WWXU~zPc!oXLP-8CIeyX3)=`8;K$PjyP^F?bHxZYnXFfUSJ=%-6#= zaor`S+REp)Dr>li4M@Ss?Am(0QK}xQSDJQ1LG)ri3M~g8^=eyRy9P*b zKUH6;AcvEA25hZ4&gZm7NdQbQFE>5h$pt8Yp}fCR!mV9c)$kCJ$Q3WnjT1d`E^_`V z$BQMyyE#0Via~ivTb#CqRp0qdvZn+ zh&3?BQC_*omvDJ^*>2&*Du?Z1(qcen4#6HLHOt}HO;5DPMUL@g8@CmlcoM4*uIHy~ z-lTWTvlR>1Z;RErgOahu!x*|`Y34N@){T8Y2;j1_q&Lke?)7Xic96Ggd zh+(xi+qe}D$~jjjN<&;DEr7Qr%_h!@vY#(ds_F!9o2hQI$!i7LrrS~kQgD|_$WtzR za}Z$5bY>o#>L@zN+@1j~Ym1H2EE5!0QLG7`WoM#=b?&j|+Bo#C23@eG%++JwdTTX~ zl^Z4*@BS(jan>s%?^|*tm|JpFt9j+?;rxkpBju>T5ZI0JX*m1Z7%_j1g*Bf>IHX)E$ zu(P4{@G(Y^x-D_%`Bj`M>)e@;p{S2rRa8Z}tMv@kbJ#D-_T-`R?PjaK7VKWE?#Q|s z=pC|Ifr^1L|OIlvx9o;R9zDEVoBk8JqvhLALK^H!s9~Ny!)8` zoc7jRL^x)Tly;=yE-dhto5AUQttXxK@iGK?V@N;nlSE(I6 ziVIObVrSIcusiYu>(#hGD0qz7<6 zF)4OJA!kGaDr9&0=+Q1=R5*2x!LN01yIo5XrJfL6`txCQD-%bHAj6V8?!zTFLA%a= zI(d&cs!5dFjiW_JIk>9SdLkkXX-(5n6Wk5pUSJDAxw8c6969rBnAB8^a+S$|h@ctJ zC?`@LQ|`cxZ)|(EI%^RK665$9&7m`}h3&TD+ifP@1f)htffuN=@gQ$m>_*kOehvF# zLfHeAJ|!j7+QWPb2Q=3Xh0H4Q9`tYIDe&b%KA!3)ly%{{oI&|)UuTE-GzKZSy~x2e z>$|yrY|LveH7e_^dSlN23M=d0MrGdHbLC>G(I}m`Mh4uc{e|$OFxLLEVTC!?jf2d= z*=%UItXKz=hmk8saq92NG+<5uqX>1og)MJmTS5|30-yh7nntSaX#%MaWMSszK1>0f zsT{yZZW?WW3aw4FTKKee-U6TDk+#rLDtTWFxi}Q1E;?&1RRjozaKMhyx4oDA2+Nfhn_C>r za<)OR@Ip&--&Qi?)l6b34fczkD*~Y?JBp_a_Dj8u@%P!Qx2N00tNPbH=T-`VR07 zC71ap$T#fI;ULq>H`LAgcM)B9xV2JdZ(>Xn1L5YjTW1`mLPaP;_6`V3++PIo6w=pt zm*_ZD?x^H0g5+=_@_j`b(Q!5O>CGAMmHX%=(%;95!C8p1TK4MIVlGmc1vpABHCtC- zElH28C2<{PL&L$JpK<1Ib%~jT;h?{Gd@`_p26McAn5JMOO(2l)E~W3l5OO*g7yl%4 zBUz2DAkfdQ)8P6ykBd9LK{2Uz;uD(LhRCYK^uP?pg%Xa;-pA?j2Ojh{87X(`Ms?`J|3->We4 zLQM22M`SW(qk>yQ<3@+)A^DejzQOY6#87Pv!t_uhXsw88*n`tO7KkKA8&^27yyGm; zbleBC6hRm%BMtdVO1r;LU0;bc;Da=7A#b+CwUtPnY?G+PX0FGMt`}06*fIM-GDG>B66U2vkH3x}6AY`HMNESo#ME&F zYYIRm@!1y1qJdbEj>(qXqCAG@aFn(@!N!8hNLPthZ^ z_M6=?WfCw3dI`sg<4^io4rzTjk0zxak(k9w&Y~RPBhS=rB1!1~(Mhl5cl#6Tyy8Ln z_Le*Y#@76)p7dHLxhcEYTI68AM;ro)pHmyM2&_{Za%f=9j7q2=eisWP7&!_M9FQ=} z_{VpN&{IQlrCGx|CN^Pj@O|EWiHTD}8!H-)5x{<=zYv%z{$W3n1Jo?*xfJfV097U( zk0AY+nN5%Z5Lb1x@bo7CtXT$HN1)XD z$YFDdrf6Fv$c^suc6CY*(uoTe~G!>BeDplSS*_4ryobcI{9&=9<@UlDH3N_RL7BlQHxkaSPr&&dNduk z$v05RJq#X0hX_M=_J_;sa5vTU&2Iner~Bmlf`;umzYMsoOHT%jZG|~Gc!?_K{o?;( zEX`6Dg4xDx2N(le^2*6qtts-_o(r7I$^rWJec)V{-B#8-`D#8Az9A`BKIPP3Oo1|c zONP&sXP*flpyXqoaIU~xn3zaz#8Du!llk-B&>04uT${_=?l6GF9|mH3Bq)7ee-sz6 ziYv^8cp;K_!dd4SJM@Y%P{{qH=V<5@TG7>~iQNx=m%rSC=@@cYEO8t$*I1C4je}*$ zpJoNlaR+?1dyI*N^u~f!FdIv5m?q~Yuj4-u`C0rm$Oq%kGx87q4C6E9pkKMYoTiwegSMA1MU3GfZ zft`4asb})z4tg0s?v%&db`d?D$p9S=?ZDqOJsr<8XeXUXyXY)Bo6bSqgXmm3k9O1f zp!z&|2t5=q52J_E1$bUa7tzJ^2)cwWrAN}E$fZZqWweJLLzmMP^jOMJ7hOq@qi)(u zJ#-cIQkHV~+pz`eqkbBoK^mf~X_&5|YiS=no}NG>w4X+4jK=8zT}KCLf_{pwr%9Tk zLo`h@bOX)O9L>{VIzl(nP4q;15-re^=_oygiuBV|qD9cPL}l`5nO10(Ds(eyZo&U5 ztx*lnI-cuvD>bM|Eo##-I!+s?J0JYKNceGrPSS0F{2BbMte>TyqdVy5!HK8R)4(sr z{|pGqqh|@`XQL1FhCdIkLku>BVOHocNwMX#pU&}->+^m=*&y^-ETZ>G1< zTj_1|c6tZBlio$|ruWc$>3#Hm`T%{9K13g;kI+ZyWAt(Q9r|7RJ^BQFl0HSBrq9r4 z>2q`!eV%@w{(%0F{)qmV{)GP2a8b|l&*;xF)4#x+zCd5Z?=N9)e@TBuU&i}a@Xj3l zYdpV7e?xyue@Azt{P*+^^pEsUruCok{1^Hf-Gi2|(>Lf}>EGzzP1}Fq`JeP(^iBE} zeOqud_r62lrSH*y)A!MO52SKwz(>~5AJDz@Lny6Mj@qF@4Lwcyx_P=fLouG6>P)o; zt`anwe^@$NYP(QB2noGV>d#W!SpjFObJThCAoajo2`g9&omRrR>O8euov$9O9-IV$i`2#H5$Y0ksd}V(lybqXuY!fo0Jk2kF54EjPMu3y(|vo9uIWQY)2|gx ze}ZWGXrSqAFFs=I1#9{YG(EHzzNRm9(DY^6qaLF!7tM*=i!0P)m9`fd<=cw~Lo+Wl z97(S4&emcUePE%5liF5%>@321*ELB@p{3Z|-u}4x*QKsh&!WdEhq{$-DfX%!6}J>u zDQzWsRTg^1_QSRiIaAl!GUS!E40nP5ml&>XwsVDcp`iLKyYK?^#cn8a2(7~5v$a*& zuAcwsR^i7juRUs+I_Z1A8c>63NL{Ul)ivr`wNE`>Jwc7A{c04h$hbP7u2Tmgsmb~A zDfVhEhA)xyYF-iXYW`GvHQ&%)%@OU@d_a3OcWbYPACT%5SRU|d_OS!ATbFh#?hdb} z#g)B^yThyD?#>x8`P|t!=7=y(tgc6 z+7Clxk4W8(c)LkGQ9Vg5s3)tV>M5$Iep;2(qFPdA<*8-0qE=N!-K=g=RkfySs;<`6 zt*W7#s-@cMm^!XD)CqM`-KKs<-L8IC{hYc({k(drdYXE=dWL$YdX{>&dX9RodY*c| z`UUli>X+1=>X+3E)C<+Gs9%K__-pFL>Lu!>>etoF)XUW?)NiQY6v}=Jl>N4PrM$li z@2^&`QLk06lk)3PeuKQd5pQo&Z&q(nZ&hzoZ&&Y7?^N$n?}nVN2Tp>wVe=)9^F4y& zy@KO?rdJs~AXJ#dd z>Qm~|0e>|wn6s~zy3Yt#KC3>b?oyvuzpwrPKKdW2KURMNwfr;n=jt!i7t|L~{t`-m ziRWM8`DOJL_1EgFDE*E4TT}mcc;2o4Ui|}V|IyU_6Q2L9{zZLF-J`y)zM=kA{hRuC z^&dt8AA*MWMEJaYeg02qH*3p($sBk#uaUQJ%51)+zHP?12l&sAjKRG$556O?-!+gs zvB+N@f!sbd-&6k$dL9^BVz069s~@O)0}e)4+7ID4D#vklIHx(MJ7+jMoim+X&RNdc z&NHb$2e?*E;n^-gRXEM z>(~}3V|aYk|F3yj{r>LS + +const uint8_t UNLIT_PACKAGE[] = { +// UNLIT +0x53, 0x52, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x54, 0x41, 0x45, 0x46, +0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x45, 0x4d, 0x41, 0x4e, 0x5f, 0x54, 0x41, 0x4d, 0x06, 0x00, 0x00, +0x00, 0x75, 0x6e, 0x6c, 0x69, 0x74, 0x00, 0x4c, 0x44, 0x4d, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x4e, 0x4d, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4c, 0x46, 0x56, +0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x46, 0x49, 0x4e, 0x55, 0x5f, 0x54, 0x41, 0x4d, +0x98, 0x00, 0x00, 0x00, 0x09, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x00, +0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x01, 0x4c, 0x69, 0x67, 0x68, +0x74, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x04, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x05, 0x46, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x06, 0x46, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x73, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x07, 0x42, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x00, 0x02, 0x4d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x03, +0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x08, 0x50, 0x4d, 0x41, 0x53, +0x5f, 0x54, 0x41, 0x4d, 0xcb, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x07, 0x07, 0x01, 0x02, 0x09, 0x07, 0x00, 0x09, 0x01, +0x01, 0x0a, 0x00, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x00, 0x01, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x00, 0x02, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x00, 0x03, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, +0x73, 0x61, 0x6f, 0x00, 0x04, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x00, 0x05, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x00, 0x06, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, +0x6f, 0x67, 0x00, 0x07, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, +0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x00, 0x08, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, +0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x00, +0x09, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, +0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, 0x20, 0x42, 0x49, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x37, +0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x06, 0x03, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x20, 0x42, +0x49, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x4e, 0x4f, 0x43, 0x5f, 0x54, 0x41, +0x4d, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, 0x55, 0x53, 0x5f, 0x54, 0x41, +0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, +0x00, 0x49, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x45, 0x4c, 0x42, 0x5f, 0x54, +0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x44, 0x4d, 0x52, 0x54, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, +0x4c, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x52, 0x57, 0x43, 0x5f, 0x54, 0x41, +0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x49, +0x52, 0x57, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x45, 0x54, 0x44, 0x5f, 0x54, 0x41, 0x4d, +0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x53, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x53, 0x43, +0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, +0x00, 0x00, 0x00, 0x00, 0x4f, 0x4d, 0x55, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4f, 0x52, +0x50, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x49, 0x55, +0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0xfe, 0x5f, 0x9a, 0x13, 0xb5, 0x71, 0x22, 0x67, 0x44, 0x41, 0x48, +0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, +0x00, 0x00, 0x00, 0x4d, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x46, 0x45, 0x52, +0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x49, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, +0x00, 0x01, 0x41, 0x51, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x41, 0x41, +0x50, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x41, 0x56, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, +0x00, 0x00, 0x00, 0x9a, 0x99, 0x19, 0x3e, 0x52, 0x48, 0x54, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0xcd, +0xcc, 0x4c, 0x3e, 0x4f, 0x44, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x54, 0x4e, 0x49, +0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x44, 0x53, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, +0x00, 0x01, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x48, 0x51, 0x00, 0x00, 0x3d, 0x02, 0x00, 0x00, 0x23, 0x76, +0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x30, 0x30, 0x20, 0x65, 0x73, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, +0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, +0x73, 0x00, 0x7b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x3b, 0x00, 0x7d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, +0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x6d, +0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, +0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, +0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, +0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, +0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, +0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, +0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, +0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, +0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x20, 0x36, 0x34, 0x00, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x00, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, +0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, +0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x23, +0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, +0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, +0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, +0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, +0x6f, 0x6f, 0x6c, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x56, 0x52, 0x5f, +0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x41, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x20, 0x3d, +0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, +0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, +0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, +0x61, 0x74, 0x61, 0x20, 0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, +0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, +0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x62, 0x3b, 0x00, +0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, +0x20, 0x65, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, +0x67, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x6c, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x70, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x71, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x75, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, +0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x79, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x7a, 0x3b, 0x00, +0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x66, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, +0x67, 0x7a, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, +0x65, 0x63, 0x34, 0x20, 0x6b, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, +0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, +0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, +0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, +0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x3b, 0x00, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, +0x69, 0x75, 0x6d, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, +0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, +0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, 0x7a, 0x7a, 0x3b, 0x00, +0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, +0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6b, 0x7a, 0x7a, 0x3b, +0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, +0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x70, 0x7a, 0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x72, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x73, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, +0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, +0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, +0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x3b, 0x00, 0x6d, 0x65, 0x64, +0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x3b, 0x00, 0x7d, 0x20, 0x6d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, +0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x66, 0x6c, 0x61, 0x74, +0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x20, +0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x3b, 0x00, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x43, 0x4f, +0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x56, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, +0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x41, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x29, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x20, 0x2b, 0x20, 0x67, 0x6c, 0x5f, 0x49, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x00, 0x7d, 0x00, 0x65, 0x6c, +0x73, 0x65, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, +0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x33, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, +0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, +0x62, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x31, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x39, 0x32, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x32, 0x2e, +0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x32, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x31, 0x35, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x34, 0x3b, 0x00, 0x5f, +0x32, 0x30, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x30, 0x34, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x5f, 0x32, 0x30, 0x34, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x34, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, +0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, +0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x65, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, +0x72, 0x43, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, +0x61, 0x74, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, +0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x6e, 0x69, 0x73, +0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x5f, 0x33, 0x33, 0x36, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x72, +0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, +0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, +0x5f, 0x33, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, +0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, +0x20, 0x5f, 0x33, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, +0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x37, 0x36, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x35, 0x37, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x37, 0x38, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, +0x20, 0x62, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, +0x74, 0x34, 0x20, 0x65, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, +0x66, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, +0x32, 0x20, 0x69, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, +0x6d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x77, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x7a, +0x3b, 0x00, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, 0x5d, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x69, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x6b, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, 0x69, +0x6e, 0x74, 0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, +0x20, 0x72, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x74, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, +0x76, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x79, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, +0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, +0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, +0x61, 0x74, 0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, +0x6b, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x6d, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, +0x70, 0x7a, 0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x72, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, 0x5b, 0x34, +0x30, 0x5d, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, +0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, +0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, +0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, 0x65, +0x77, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, +0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, +0x5f, 0x31, 0x38, 0x36, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x62, 0x7a, 0x7a, 0x29, 0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, +0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x36, 0x30, 0x35, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x20, 0x3e, +0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x78, 0x20, 0x2a, +0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, +0x7a, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x34, +0x3b, 0x00, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2a, +0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, +0x34, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, +0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x2c, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x30, 0x36, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x5f, +0x31, 0x38, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, +0x32, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, 0x66, +0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x7a, +0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, +0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, +0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x79, 0x2c, +0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, +0x70, 0x79, 0x5f, 0x32, 0x37, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, +0x78, 0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x32, +0x20, 0x3d, 0x20, 0x5f, 0x36, 0x30, 0x36, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x33, 0x20, 0x5f, 0x36, 0x30, 0x38, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, +0x2d, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, +0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, +0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, +0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x35, 0x37, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x35, 0x37, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, +0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, +0x79, 0x5f, 0x33, 0x35, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, +0x70, 0x79, 0x5f, 0x33, 0x34, 0x31, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, +0x32, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, +0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, 0x31, +0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x29, +0x20, 0x2b, 0x20, 0x5f, 0x36, 0x30, 0x38, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x37, 0x37, 0x2e, 0x78, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, +0x37, 0x2e, 0x79, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x2e, +0x7a, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, +0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x36, 0x2c, 0x20, +0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, +0x37, 0x38, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x36, 0x2c, +0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, +0x35, 0x37, 0x38, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, +0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, +0x34, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2c, 0x20, 0x70, 0x61, 0x72, +0x61, 0x6d, 0x5f, 0x31, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, +0x34, 0x35, 0x33, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, +0x75, 0x6e, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, +0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, +0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, +0x5f, 0x31, 0x36, 0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, +0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x69, 0x6e, 0x74, 0x42, 0x69, 0x74, 0x73, 0x54, 0x6f, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, +0x79, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x7a, 0x20, 0x2f, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x77, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, +0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, +0x45, 0x58, 0x54, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x63, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, +0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, +0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, +0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, +0x20, 0x32, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x53, +0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, +0x49, 0x44, 0x5f, 0x38, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, +0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x37, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x35, +0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, +0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x2e, 0x7a, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, +0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x35, 0x3b, 0x00, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x3b, +0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, +0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x31, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, +0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, +0x30, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x31, +0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x39, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x37, 0x2e, 0x78, +0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, +0x30, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x2e, 0x78, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x31, 0x20, 0x2f, +0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x37, +0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, +0x2d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x37, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, +0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, +0x28, 0x5f, 0x39, 0x37, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x31, +0x30, 0x31, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x39, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x37, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x37, 0x2e, 0x7a, 0x20, 0x3d, +0x20, 0x28, 0x5f, 0x39, 0x37, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x39, 0x37, 0x2e, 0x77, 0x20, 0x2a, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, +0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x3b, 0x00, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x37, 0x3b, +0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x31, 0x30, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, +0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, +0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x3a, 0x20, 0x65, +0x6e, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x38, 0x29, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, +0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x6f, 0x75, 0x74, +0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x33, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, +0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, +0x62, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x31, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x5f, 0x32, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x31, 0x36, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, +0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, +0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, +0x2e, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, 0x35, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, +0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, +0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, +0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, +0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x36, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, +0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, +0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, +0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, +0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, +0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, +0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, +0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, +0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x78, 0x28, +0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, +0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, +0x5f, 0x36, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, +0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, +0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, +0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, +0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, +0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x6c, 0x61, +0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x69, +0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, +0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x5f, 0x33, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, +0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x38, 0x35, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x39, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x39, 0x2e, 0x78, +0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x39, 0x39, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x20, 0x3d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x33, 0x39, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x36, 0x20, 0x3d, +0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, +0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, +0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, +0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x31, 0x20, 0x3d, +0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, 0x30, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x32, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x31, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, +0x32, 0x31, 0x36, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x2e, +0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x32, +0x31, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, +0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x32, 0x31, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x2e, 0x77, 0x29, 0x3b, +0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, +0x3d, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, +0x32, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, +0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, +0x32, 0x31, 0x31, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x32, +0x31, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x31, 0x36, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x31, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x31, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x31, 0x2e, +0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, +0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, +0x31, 0x31, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x31, 0x38, 0x35, 0x3b, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65, 0x74, +0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, +0x3c, 0x73, 0x69, 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x00, 0x00, 0x75, 0x73, 0x69, 0x6e, 0x67, +0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, +0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, +0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, +0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, +0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, +0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, +0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, +0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, +0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, +0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, +0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, +0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, +0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, +0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x75, +0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, +0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x32, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x4e, 0x6f, 0x69, 0x73, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, +0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x4f, +0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x6f, 0x64, +0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x65, 0x66, 0x72, +0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, +0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x4f, +0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, +0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, +0x61, 0x6d, 0x65, 0x72, 0x61, 0x46, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x65, 0x76, 0x31, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x65, +0x64, 0x73, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6c, +0x69, 0x74, 0x79, 0x41, 0x6e, 0x64, 0x45, 0x64, 0x67, 0x65, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x42, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x72, 0x6d, +0x61, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x7a, 0x50, 0x61, 0x72, +0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, +0x33, 0x20, 0x66, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6c, +0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x58, 0x59, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, +0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, 0x6c, 0x52, 0x6f, 0x75, +0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x69, 0x62, 0x6c, 0x53, 0x48, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, +0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, +0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x73, 0x75, 0x6e, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x46, 0x61, 0x72, 0x41, +0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x61, +0x64, 0x6f, 0x77, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x43, 0x6f, +0x6e, 0x74, 0x61, 0x63, 0x74, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x53, +0x70, 0x6c, 0x69, 0x74, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, +0x64, 0x65, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, +0x77, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x72, +0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, +0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, +0x4c, 0x69, 0x67, 0x68, 0x74, 0x42, 0x6c, 0x65, 0x65, 0x64, 0x52, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x53, 0x61, 0x6d, 0x70, +0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, +0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, +0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, +0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, +0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, +0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, +0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, +0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, +0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x33, 0x78, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, +0x72, 0x52, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x55, 0x76, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, +0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, +0x73, 0x72, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x73, 0x73, 0x72, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x53, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x37, 0x30, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x30, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x31, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, +0x76, 0x65, 0x64, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, +0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, +0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, +0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x34, 0x29, 0x5d, 0x5d, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x37, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x38, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, 0x6c, 0x5f, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5d, 0x5d, +0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, +0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, +0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, +0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, +0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, 0x5d, 0x2c, 0x20, +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, +0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, +0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6d, +0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, +0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, +0x37, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, +0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, +0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x35, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x37, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, +0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, +0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, +0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, +0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, +0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x2c, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, +0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, +0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, +0x66, 0x65, 0x72, 0x31, 0x20, 0x7b, 0x00, 0x64, 0x65, 0x70, 0x74, 0x68, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, +0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, +0x4d, 0x61, 0x70, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, +0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x53, 0x6d, +0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, +0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, +0x6c, 0x44, 0x46, 0x47, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x53, 0x6d, 0x70, 0x6c, +0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, +0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, +0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x34, 0x29, 0x5d, 0x5d, 0x3b, +0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, +0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x35, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x20, 0x5b, 0x5b, 0x69, +0x64, 0x28, 0x36, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x37, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, +0x28, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, +0x5f, 0x73, 0x73, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x39, 0x29, 0x5d, 0x5d, 0x3b, +0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, +0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, +0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, +0x31, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x20, 0x5b, 0x5b, 0x69, 0x64, +0x28, 0x31, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x33, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, +0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, +0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, +0x75, 0x66, 0x66, 0x65, 0x72, 0x31, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, +0x72, 0x53, 0x65, 0x74, 0x31, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x37, 0x29, 0x5d, 0x5d, +0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, +0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, +0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, +0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x20, 0x5f, 0x38, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x33, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, +0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x38, 0x31, 0x33, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, +0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, +0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, +0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, +0x5f, 0x36, 0x30, 0x35, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, +0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x20, 0x3d, +0x20, 0x5f, 0x34, 0x34, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x36, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, +0x20, 0x2a, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x37, 0x39, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, +0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x36, 0x32, 0x32, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, +0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x3d, +0x20, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, +0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x5f, 0x36, 0x32, 0x31, +0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, +0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, +0x29, 0x20, 0x2f, 0x20, 0x5f, 0x36, 0x32, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, +0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x37, 0x20, +0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, +0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x5f, 0x38, 0x31, 0x33, 0x20, +0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x2a, 0x20, +0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, +0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, +0x74, 0x79, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, +0x5f, 0x38, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, +0x5f, 0x37, 0x39, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x46, 0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x38, 0x32, 0x30, 0x20, 0x3d, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, +0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x38, +0x32, 0x38, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, +0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, +0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, +0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, +0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, +0x28, 0x5f, 0x38, 0x32, 0x30, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x38, 0x32, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, +0x6d, 0x70, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x2c, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, +0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, +0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x38, 0x31, 0x33, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, +0x79, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, +0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x33, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x28, 0x68, 0x61, +0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, +0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, +0x67, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, +0x29, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, +0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x68, 0x61, +0x6c, 0x66, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, +0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, +0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, +0x53, 0x69, 0x7a, 0x65, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x33, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, +0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, +0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, +0x37, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, +0x38, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, +0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x33, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x38, 0x33, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, +0x20, 0x28, 0x5f, 0x38, 0x31, 0x33, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, +0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x37, +0x39, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x37, 0x39, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x79, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, +0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, +0x20, 0x5f, 0x37, 0x39, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, +0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x38, 0x30, 0x34, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, +0x67, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, +0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, +0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, +0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, +0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, +0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, +0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, +0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, +0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x7a, 0x20, 0x2f, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, +0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, +0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, +0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, +0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x5b, 0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, +0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, +0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, +0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, +0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x29, 0x20, 0x3f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, +0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, +0x3a, 0x20, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, +0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x5b, 0x5b, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x64, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, 0x5d, 0x20, 0x5b, 0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x31, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, +0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, +0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x34, 0x20, 0x3d, +0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, +0x61, 0x5b, 0x5f, 0x36, 0x37, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x5f, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, +0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, +0x3d, 0x20, 0x5f, 0x38, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x38, 0x37, 0x20, 0x3d, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, +0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, +0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, 0x38, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x38, 0x38, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x35, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x38, 0x35, 0x2e, 0x78, 0x2c, 0x20, +0x5f, 0x39, 0x30, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x38, 0x38, 0x2c, 0x20, +0x5f, 0x39, 0x32, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x30, 0x29, 0x20, 0x2a, +0x20, 0x5f, 0x39, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, +0x38, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x38, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x39, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x39, 0x20, +0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x38, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, +0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, 0x39, 0x2c, 0x20, 0x5f, 0x39, +0x32, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x39, 0x35, 0x2c, 0x20, 0x5f, 0x39, 0x37, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, +0x39, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x37, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, +0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x39, 0x35, 0x2c, 0x20, 0x5f, 0x39, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x39, +0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x3d, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5b, 0x30, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, +0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, +0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x6d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, +0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x36, 0x2e, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x36, 0x2e, +0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x36, +0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x20, +0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, +0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x32, 0x37, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, +0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, +0x31, 0x5d, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, +0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, +0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, +0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x69, 0x6e, +0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x2a, 0x20, +0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, +0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x38, +0x31, 0x30, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, 0x73, +0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, +0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x33, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, +0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, 0x61, 0x6d, +0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, +0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x28, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x2e, +0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, +0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, +0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x31, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, +0x5f, 0x38, 0x31, 0x30, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x63, 0x6c, 0x61, 0x6d, 0x70, +0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, +0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, +0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, +0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x30, 0x34, +0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, +0x5f, 0x36, 0x35, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x38, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, +0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, +0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, +0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, +0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, +0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x2a, 0x20, 0x66, +0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, +0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, +0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x35, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, +0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x20, 0x3d, +0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, +0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, +0x20, 0x5f, 0x31, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x37, 0x37, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, +0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, +0x6c, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, +0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, +0x35, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, +0x30, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, +0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, +0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, +0x32, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x38, 0x20, 0x3d, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, +0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, +0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x32, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, +0x31, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x33, 0x20, 0x3d, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x30, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x2e, 0x77, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, +0x5f, 0x32, 0x30, 0x33, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, +0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x33, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, +0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x33, 0x36, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, +0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x38, 0x36, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, +0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x32, 0x20, 0x3d, 0x20, +0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, +0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x33, 0x39, 0x32, 0x2c, 0x20, 0x5f, 0x32, +0x32, 0x33, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x30, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, +0x28, 0x5f, 0x33, 0x39, 0x32, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x30, 0x38, 0x20, 0x2b, 0x20, +0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x30, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x37, 0x37, +0x3b, 0x00, 0x4c, 0x53, 0x4c, 0x47, 0x5f, 0x54, 0x41, 0x4d, 0xca, 0x08, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x96, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, +0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xd0, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xe4, 0x01, 0x00, 0x00, 0x01, 0x30, 0x01, +0x2c, 0x03, 0x00, 0x00, 0x01, 0x44, 0x01, 0x6e, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x86, 0x03, 0x00, 0x00, 0x01, 0x90, +0x00, 0x86, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, 0x02, 0x00, 0x01, 0xc6, 0x05, 0x00, 0x00, 0x02, +0x10, 0x00, 0xb4, 0x04, 0x00, 0x00, 0x02, 0x10, 0x01, 0xfe, 0x05, 0x00, 0x00, 0x02, 0x20, 0x01, 0x10, 0x06, 0x00, 0x00, +0x02, 0x30, 0x01, 0x46, 0x07, 0x00, 0x00, 0x02, 0x44, 0x01, 0x86, 0x07, 0x00, 0x00, 0x02, 0x80, 0x00, 0x9c, 0x07, 0x00, +0x00, 0x02, 0x90, 0x00, 0x9c, 0x07, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, +0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, +0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, +0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, +0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, +0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, +0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, +0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, +0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, +0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, +0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, +0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, 0x00, +0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x6d, 0x00, +0x11, 0x02, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x02, 0x00, 0x7c, 0x00, +0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x04, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x62, 0x00, +0x02, 0x00, 0x85, 0x00, 0x86, 0x00, 0x65, 0x00, 0x87, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x88, 0x00, 0x6d, 0x00, 0x51, 0x00, +0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x96, 0x0c, +0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x02, 0x00, 0x7c, 0x00, 0x7d, 0x00, +0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x04, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x17, 0x00, 0x02, 0x00, +0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, +0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, +0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, +0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, +0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, +0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, +0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, +0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x85, 0x00, 0x86, 0x00, 0x65, 0x00, 0xd5, 0x00, +0xd6, 0x00, 0x87, 0x00, 0xd7, 0x00, 0x02, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x02, 0x00, 0xda, 0x00, 0x6d, 0x00, 0xdb, 0x00, +0xdc, 0x00, 0xdd, 0x00, 0x02, 0x00, 0xde, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xdf, 0x00, 0x6d, 0x00, 0xe0, 0x00, +0xe1, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0x02, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0x6d, 0x00, +0x6e, 0x00, 0x02, 0x00, 0xe9, 0x00, 0x6d, 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0x02, 0x00, 0xed, 0x00, 0xee, 0x00, +0xef, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xf2, 0x00, 0x6d, 0x00, 0xf3, 0x00, 0xf4, 0x00, +0xf5, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xda, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, +0xfb, 0x00, 0xfc, 0x00, 0x6d, 0x00, 0xec, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x7a, 0x00, +0x05, 0x00, 0x02, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x00, +0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x04, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x05, 0x01, +0x06, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x07, 0x01, 0x08, 0x01, 0x6d, 0x00, 0x91, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x87, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x09, 0x01, 0x6d, 0x00, 0x38, 0x0c, 0x00, 0x00, +0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, +0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, +0x0f, 0x00, 0x10, 0x00, 0x0b, 0x01, 0x0c, 0x01, 0x0f, 0x00, 0x0d, 0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, +0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, +0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, +0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, +0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, +0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, +0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, +0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, +0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, +0x62, 0x00, 0x02, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x67, 0x00, 0x66, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, +0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x0e, 0x01, +0x0f, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, +0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, 0x01, 0x1f, 0x01, 0x20, 0x01, 0x6d, 0x00, 0xe0, 0x08, +0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x21, 0x01, 0x22, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, +0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, +0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, +0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, +0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x9b, 0x00, 0x9c, 0x00, +0x9d, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, +0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0x39, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, +0x3d, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0x40, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0x43, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, +0xbb, 0x00, 0x48, 0x00, 0x49, 0x00, 0xbe, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0x50, 0x00, +0xc5, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, +0x5b, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x85, 0x00, +0x86, 0x00, 0x65, 0x00, 0x66, 0x00, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, +0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x26, 0x01, 0x27, 0x01, 0x72, 0x00, 0x73, 0x00, +0x74, 0x00, 0x28, 0x01, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x6d, 0x00, 0x12, 0x02, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, +0x21, 0x01, 0x22, 0x01, 0x7b, 0x00, 0x02, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, +0x04, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x62, 0x00, 0x02, 0x00, 0x85, 0x00, 0x86, 0x00, 0x65, 0x00, 0x87, 0x00, +0x6a, 0x00, 0x02, 0x00, 0x88, 0x00, 0x6d, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x21, 0x01, 0x22, 0x01, +0x6a, 0x00, 0x02, 0x00, 0x6d, 0x00, 0xc0, 0x0a, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x21, 0x01, 0x22, 0x01, 0x7b, 0x00, +0x02, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x04, 0x00, 0x89, 0x00, 0x8a, 0x00, +0x8b, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, +0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x9b, 0x00, 0x9c, 0x00, +0x9d, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, +0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0x39, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, +0x3d, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0x40, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0x43, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, +0xbb, 0x00, 0x48, 0x00, 0x49, 0x00, 0xbe, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0x50, 0x00, +0xc5, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, +0x5b, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x85, 0x00, +0x86, 0x00, 0x65, 0x00, 0x29, 0x01, 0x2a, 0x01, 0x87, 0x00, 0x2b, 0x01, 0x02, 0x00, 0x2c, 0x01, 0xd9, 0x00, 0x02, 0x00, +0xda, 0x00, 0x6d, 0x00, 0x2d, 0x01, 0x2e, 0x01, 0xdd, 0x00, 0x02, 0x00, 0xde, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, +0xdf, 0x00, 0x6d, 0x00, 0x2f, 0x01, 0xe3, 0x00, 0xe4, 0x00, 0x02, 0x00, 0x30, 0x01, 0x31, 0x01, 0x6d, 0x00, 0x6e, 0x00, +0x02, 0x00, 0xe9, 0x00, 0x6d, 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0x02, 0x00, 0x32, 0x01, 0x6d, 0x00, 0x6e, 0x00, +0x02, 0x00, 0xf2, 0x00, 0x6d, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xda, 0x00, 0x6d, 0x00, +0x6a, 0x00, 0x02, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0x33, 0x01, 0xfb, 0x00, 0xfc, 0x00, 0x6d, 0x00, 0xcc, 0x02, 0x00, 0x00, +0x1c, 0x00, 0x00, 0x00, 0x21, 0x01, 0x22, 0x01, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, +0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x04, 0x01, 0x14, 0x00, +0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x34, 0x01, 0x35, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x07, 0x01, 0x08, 0x01, 0x6d, 0x00, +0x92, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x21, 0x01, 0x22, 0x01, 0x87, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x09, 0x01, +0x6d, 0x00, 0x55, 0x0b, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x21, 0x01, 0x22, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, +0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, +0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0b, 0x01, 0x0c, 0x01, 0x0f, 0x00, 0x0d, 0x01, 0x11, 0x00, +0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, +0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, +0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, +0x2d, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, +0xab, 0x00, 0xac, 0x00, 0x39, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0x3d, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0x40, 0x00, +0xb5, 0x00, 0xb6, 0x00, 0x43, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0x48, 0x00, 0x49, 0x00, 0xbe, 0x00, +0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0x50, 0x00, 0xc5, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, +0x55, 0x00, 0x56, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0x5b, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, +0xd3, 0x00, 0xd4, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x85, 0x00, 0x86, 0x00, 0x65, 0x00, 0x23, 0x01, 0x66, 0x00, +0x24, 0x01, 0x25, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, +0x6f, 0x00, 0x6d, 0x00, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, +0x3e, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, 0x01, +0x48, 0x01, 0x6d, 0x00, 0x4c, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x41, 0x4d, 0x1a, 0x09, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x9e, 0x01, 0x00, 0x00, 0x01, 0x10, +0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xd4, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xee, 0x01, 0x00, 0x00, 0x01, +0x30, 0x01, 0x56, 0x03, 0x00, 0x00, 0x01, 0x44, 0x01, 0xba, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0xe4, 0x03, 0x00, 0x00, +0x01, 0x90, 0x00, 0xe4, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x26, 0x05, 0x00, 0x00, 0x02, 0x00, 0x01, 0x3e, 0x06, 0x00, +0x00, 0x02, 0x10, 0x00, 0x26, 0x05, 0x00, 0x00, 0x02, 0x10, 0x01, 0xd4, 0x01, 0x00, 0x00, 0x02, 0x20, 0x01, 0x74, 0x06, +0x00, 0x00, 0x02, 0x30, 0x01, 0x56, 0x03, 0x00, 0x00, 0x02, 0x44, 0x01, 0xba, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0xd8, +0x07, 0x00, 0x00, 0x02, 0x90, 0x00, 0xd8, 0x07, 0x00, 0x00, 0x09, 0x0e, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x49, 0x01, +0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4b, 0x01, 0x05, 0x00, 0x02, 0x00, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, +0x51, 0x01, 0x52, 0x01, 0x53, 0x01, 0x04, 0x00, 0x4b, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x54, 0x01, 0x4b, 0x01, +0x55, 0x01, 0x02, 0x00, 0x56, 0x01, 0x04, 0x00, 0x4b, 0x01, 0x57, 0x01, 0x02, 0x00, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, +0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, +0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, +0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, +0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, +0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, +0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, +0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, +0x04, 0x00, 0x4b, 0x01, 0xa1, 0x01, 0x02, 0x00, 0xa2, 0x01, 0xa3, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa4, 0x01, 0x02, 0x00, +0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa9, 0x01, 0x02, 0x00, 0xaa, 0x01, 0x04, 0x00, +0x4b, 0x01, 0xab, 0x01, 0x02, 0x00, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, +0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0x6d, 0x00, 0x4b, 0x01, 0x9a, 0x01, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x49, 0x01, +0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4b, 0x01, 0xa1, 0x01, 0x02, 0x00, 0xa2, 0x01, 0xa3, 0x01, 0x04, 0x00, 0x4b, 0x01, +0xa4, 0x01, 0x02, 0x00, 0xb6, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xb7, 0x01, 0x02, 0x00, 0xac, 0x01, 0xb8, 0x01, 0xb5, 0x01, +0x6d, 0x00, 0x4b, 0x01, 0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x49, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, +0x4b, 0x01, 0xb9, 0x01, 0x02, 0x00, 0x6d, 0x00, 0x4b, 0x01, 0x72, 0x16, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x49, 0x01, +0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4b, 0x01, 0x57, 0x01, 0x02, 0x00, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, +0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, +0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, +0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, +0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, +0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, +0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, +0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0x04, 0x00, +0x4b, 0x01, 0xa1, 0x01, 0x02, 0x00, 0xa2, 0x01, 0xa3, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, +0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, +0xc7, 0x01, 0xc8, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa4, 0x01, 0x02, 0x00, 0xb6, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa9, 0x01, +0x02, 0x00, 0xa5, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xc9, 0x01, 0x02, 0x00, 0xac, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, +0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, +0xd7, 0x01, 0xd8, 0x01, 0xd9, 0x01, 0xd2, 0x01, 0xda, 0x01, 0xd5, 0x01, 0xdb, 0x01, 0xd2, 0x01, 0xdc, 0x01, 0xd5, 0x01, +0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xd2, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xd5, 0x01, 0xdb, 0x01, 0xd2, 0x01, +0xe3, 0x01, 0xd5, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xd2, 0x01, 0xe7, 0x01, 0xd5, 0x01, 0xdb, 0x01, 0xd2, 0x01, +0xe8, 0x01, 0xd5, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, +0xf1, 0x01, 0xf2, 0x01, 0xb5, 0x01, 0x6d, 0x00, 0x4b, 0x01, 0xbc, 0x03, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x49, 0x01, +0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4b, 0x01, 0x05, 0x00, 0x02, 0x00, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, +0x51, 0x01, 0x52, 0x01, 0x53, 0x01, 0x04, 0x00, 0x4b, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x54, 0x01, 0x4b, 0x01, +0x55, 0x01, 0x02, 0x00, 0x56, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xf3, 0x01, 0x4b, 0x01, 0xa4, 0x01, 0x02, 0x00, 0xf4, 0x01, +0x04, 0x00, 0x4b, 0x01, 0xa9, 0x01, 0x02, 0x00, 0xa6, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xf5, 0x01, 0x02, 0x00, 0xac, 0x01, +0xf6, 0x01, 0xf7, 0x01, 0xb5, 0x01, 0x6d, 0x00, 0x4b, 0x01, 0xec, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x49, 0x01, +0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4b, 0x01, 0xa4, 0x01, 0x02, 0x00, 0xb6, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xf8, 0x01, +0x02, 0x00, 0xac, 0x01, 0xf9, 0x01, 0xb5, 0x01, 0x6d, 0x00, 0x4b, 0x01, 0x07, 0x12, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, +0x49, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4b, 0x01, 0x05, 0x00, 0x02, 0x00, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, +0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, 0x01, 0x04, 0x00, 0x4b, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x54, 0x01, +0x4b, 0x01, 0x55, 0x01, 0x02, 0x00, 0x56, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0x4b, 0x01, 0x57, 0x01, +0x02, 0x00, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, +0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, +0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, +0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, +0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, +0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, +0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, +0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa1, 0x01, 0x02, 0x00, 0xa2, 0x01, 0xa3, 0x01, +0x04, 0x00, 0x4b, 0x01, 0xa4, 0x01, 0x02, 0x00, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xfc, 0x01, 0xfd, 0x01, +0xfe, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa9, 0x01, 0x02, 0x00, 0xaa, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xab, 0x01, 0x02, 0x00, +0xac, 0x01, 0xad, 0x01, 0xff, 0x01, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, +0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, +0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0xb5, 0x01, 0x6d, 0x00, 0x4b, 0x01, 0x09, 0x0e, 0x00, 0x00, 0x88, 0x00, +0x00, 0x00, 0x49, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4b, 0x01, 0x05, 0x00, 0x02, 0x00, 0x4d, 0x01, 0x4e, 0x01, +0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, 0x01, 0x04, 0x00, 0x4b, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x54, 0x01, 0x4b, 0x01, 0x55, 0x01, 0x02, 0x00, 0x56, 0x01, 0x04, 0x00, 0x4b, 0x01, 0x57, 0x01, 0x02, 0x00, 0x58, 0x01, +0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, +0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, +0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, +0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, +0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, +0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, +0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, +0x9f, 0x01, 0xa0, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa1, 0x01, 0x02, 0x00, 0xa2, 0x01, 0xa3, 0x01, 0x04, 0x00, 0x4b, 0x01, +0xa4, 0x01, 0x02, 0x00, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa9, 0x01, 0x02, 0x00, +0xaa, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xab, 0x01, 0x02, 0x00, 0xac, 0x01, 0xad, 0x01, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, +0x18, 0x02, 0x19, 0x02, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0x6d, 0x00, 0x4b, 0x01, 0xb3, 0x01, 0x00, 0x00, 0x17, 0x00, +0x00, 0x00, 0x49, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4b, 0x01, 0xa1, 0x01, 0x02, 0x00, 0xa2, 0x01, 0xa3, 0x01, +0x04, 0x00, 0x4b, 0x01, 0xa4, 0x01, 0x02, 0x00, 0xb6, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xb7, 0x01, 0x02, 0x00, 0xac, 0x01, +0x1a, 0x02, 0xb5, 0x01, 0x6d, 0x00, 0x4b, 0x01, 0x33, 0x16, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x49, 0x01, 0x4a, 0x01, +0x4b, 0x01, 0x4c, 0x01, 0x4b, 0x01, 0x57, 0x01, 0x02, 0x00, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x5c, 0x01, +0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, +0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, +0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, +0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, +0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, +0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, +0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0x04, 0x00, 0x4b, 0x01, +0xa1, 0x01, 0x02, 0x00, 0xa2, 0x01, 0xa3, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, +0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, +0xc8, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa4, 0x01, 0x02, 0x00, 0xb6, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa9, 0x01, 0x02, 0x00, +0xa5, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xc9, 0x01, 0x02, 0x00, 0xac, 0x01, 0x1a, 0x02, 0xcc, 0x01, 0x1b, 0x02, 0x1c, 0x02, +0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0x1d, 0x02, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, +0xd8, 0x01, 0xd9, 0x01, 0xd2, 0x01, 0xda, 0x01, 0xd5, 0x01, 0xdb, 0x01, 0xd2, 0x01, 0xdc, 0x01, 0xd5, 0x01, 0x1e, 0x02, +0x1f, 0x02, 0xe0, 0x01, 0xd2, 0x01, 0x20, 0x02, 0x21, 0x02, 0xd5, 0x01, 0xdb, 0x01, 0xd2, 0x01, 0x22, 0x02, 0xd5, 0x01, +0x23, 0x02, 0x24, 0x02, 0xe6, 0x01, 0xd2, 0x01, 0x25, 0x02, 0xd5, 0x01, 0xdb, 0x01, 0xd2, 0x01, 0xe8, 0x01, 0xd5, 0x01, +0x26, 0x02, 0x27, 0x02, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0x28, 0x02, 0xb5, 0x01, +0x6d, 0x00, 0x4b, 0x01, 0x2f, 0x12, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x49, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, +0x4b, 0x01, 0x05, 0x00, 0x02, 0x00, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, 0x01, +0x04, 0x00, 0x4b, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x54, 0x01, 0x4b, 0x01, 0x55, 0x01, 0x02, 0x00, 0x56, 0x01, +0x04, 0x00, 0x4b, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0x4b, 0x01, 0x57, 0x01, 0x02, 0x00, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, +0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, +0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, +0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, +0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, +0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, +0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, +0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, +0x04, 0x00, 0x4b, 0x01, 0xa1, 0x01, 0x02, 0x00, 0xa2, 0x01, 0xa3, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa4, 0x01, 0x02, 0x00, +0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xa9, 0x01, +0x02, 0x00, 0xaa, 0x01, 0x04, 0x00, 0x4b, 0x01, 0xab, 0x01, 0x02, 0x00, 0xac, 0x01, 0xad, 0x01, 0x29, 0x02, 0x2a, 0x02, +0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, +0x35, 0x02, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x13, 0x02, 0x14, 0x02, +0xb5, 0x01, 0x6d, 0x00, 0x4b, 0x01, + +}; + +int UNLIT_UNLIT_OFFSET = 0; +int UNLIT_UNLIT_SIZE = 26426; diff --git a/thermion_dart/native/include/material/unlit.h b/thermion_dart/native/include/material/unlit.h new file mode 100644 index 00000000..04e7a082 --- /dev/null +++ b/thermion_dart/native/include/material/unlit.h @@ -0,0 +1,13 @@ +#ifndef UNLIT_H_ +#define UNLIT_H_ + +#include + +extern "C" { + extern const uint8_t UNLIT_PACKAGE[]; + extern int UNLIT_UNLIT_OFFSET; + extern int UNLIT_UNLIT_SIZE; +} +#define UNLIT_UNLIT_DATA (UNLIT_PACKAGE + UNLIT_UNLIT_OFFSET) + +#endif diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 98b0ea8f..6a4a0c72 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -22,7 +22,7 @@ * limitations under the License. */ #include - +#include #include #include #ifdef __EMSCRIPTEN__ @@ -158,6 +158,7 @@ namespace thermion_filament setFrameInterval(_frameInterval); _scene = _engine->createScene(); + _highlightScene = _engine->createScene(); utils::Entity camera = EntityManager::get().create(); @@ -195,8 +196,6 @@ namespace thermion_filament const float shutterSpeed = _mainCamera->getShutterSpeed(); const float sens = _mainCamera->getSensitivity(); - Log("Camera aperture %f shutter %f sensitivity %f", aperture, shutterSpeed, sens); - EntityManager &em = EntityManager::get(); _sceneManager = new SceneManager( @@ -204,6 +203,7 @@ namespace thermion_filament _resourceLoaderWrapper, _engine, _scene, + _highlightScene, uberArchivePath); } @@ -780,7 +780,7 @@ namespace thermion_filament else { Log("Created headless swapchain."); - _swapChain = _engine->createSwapChain(width, height, filament::backend::SWAP_CHAIN_CONFIG_TRANSPARENT | filament::backend::SWAP_CHAIN_CONFIG_READABLE); + _swapChain = _engine->createSwapChain(width, height, filament::backend::SWAP_CHAIN_CONFIG_TRANSPARENT | filament::backend::SWAP_CHAIN_CONFIG_READABLE | filament::SwapChain::CONFIG_HAS_STENCIL_BUFFER); } #endif } @@ -800,7 +800,7 @@ namespace thermion_filament .width(width) .height(height) .levels(1) - .usage(filament::Texture::Usage::DEPTH_ATTACHMENT) + .usage(filament::Texture::Usage::DEPTH_ATTACHMENT | filament::Texture::Usage::SAMPLEABLE) .format(filament::Texture::InternalFormat::DEPTH32F) .build(*_engine); _rt = filament::RenderTarget::Builder() @@ -1180,24 +1180,12 @@ namespace thermion_filament void *data) { - if (!_view) - { - Log("No view"); - return; - } - else if (!_swapChain) - { - Log("No swapchain"); - return; - } - auto now = std::chrono::high_resolution_clock::now(); auto secsSinceLastFpsCheck = float(std::chrono::duration_cast(now - _fpsCounterStartTime).count()); if (secsSinceLastFpsCheck >= 1) { auto fps = _frameCount / secsSinceLastFpsCheck; - Log("%ffps (%d skipped)", fps, _skippedFrames); _frameCount = 0; _skippedFrames = 0; _fpsCounterStartTime = now; @@ -1231,6 +1219,12 @@ namespace thermion_filament _renderer->render(_view); + _view->setScene(_highlightScene); + + _renderer->render(_view); + + _view->setScene(_scene); + _frameCount++; if (_recording) @@ -1295,6 +1289,12 @@ namespace thermion_filament _renderer->render(_view); + _view->setScene(_highlightScene); + + _renderer->render(_view); + + _view->setScene(_scene); + if (_rt) { _renderer->readPixels(_rt, 0, 0, vp.width, vp.height, std::move(pbd)); diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 5897426c..16b05fa5 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -24,6 +24,9 @@ #include #include "material/FileMaterialProvider.hpp" +#include "material/UnlitMaterialProvider.hpp" +#include "material/unlit.h" + #include "StreamBufferAdapter.hpp" #include "Log.hpp" #include "SceneManager.hpp" @@ -49,11 +52,13 @@ namespace thermion_filament const ResourceLoaderWrapperImpl *const resourceLoaderWrapper, Engine *engine, Scene *scene, + Scene *highlightScene, const char *uberArchivePath) : _view(view), _resourceLoaderWrapper(resourceLoaderWrapper), _engine(engine), - _scene(scene) + _scene(scene), + _highlightScene(highlightScene) { _stbDecoder = createStbProvider(_engine); @@ -77,6 +82,8 @@ namespace thermion_filament _engine, UBERARCHIVE_DEFAULT_DATA, UBERARCHIVE_DEFAULT_SIZE); } + _unlitMaterialProvider = new UnlitMaterialProvider(_engine, UNLIT_PACKAGE, UNLIT_UNLIT_SIZE); + utils::EntityManager &em = utils::EntityManager::get(); _ncm = new NameComponentManager(em); @@ -152,7 +159,8 @@ namespace thermion_filament } EntityId SceneManager::loadGltf(const char *uri, - const char *relativeResourcePath) + const char *relativeResourcePath, + bool keepData) { ResourceBuffer rbuf = _resourceLoaderWrapper->load(uri); @@ -172,7 +180,6 @@ namespace thermion_filament for (size_t i = 0; i < resourceUriCount; i++) { std::string uri = std::string(relativeResourcePath) + std::string("/") + std::string(resourceUris[i]); - Log("Loading resource URI from relative path %s", resourceUris[i], uri.c_str()); ResourceBuffer buf = _resourceLoaderWrapper->load(uri.c_str()); resourceBuffers.push_back(buf); @@ -215,8 +222,10 @@ namespace thermion_filament FilamentInstance *inst = asset->getInstance(); inst->getAnimator()->updateBoneMatrices(); inst->recomputeBoundingBoxes(); - - asset->releaseSourceData(); + + if(!keepData) { + asset->releaseSourceData(); + } EntityId eid = Entity::smuggle(asset->getRoot()); @@ -233,11 +242,9 @@ namespace thermion_filament return eid; } - EntityId SceneManager::loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances) + EntityId SceneManager::loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances, bool keepData) { - Log("Loading GLB from buffer of length %d", length); - FilamentAsset *asset = nullptr; if (numInstances > 1) { @@ -290,7 +297,9 @@ namespace thermion_filament _instances.emplace(instanceEntityId, inst); } - asset->releaseSourceData(); + if(!keepData) { + asset->releaseSourceData(); + } EntityId eid = Entity::smuggle(asset->getRoot()); _assets.emplace(eid, asset); @@ -352,18 +361,26 @@ namespace thermion_filament if (pos == _assets.end()) { Log("Couldn't find asset under specified entity id."); - return false; + return 0; } + const auto asset = pos->second; auto instance = _assetLoader->createInstance(asset); - return Entity::smuggle(instance->getRoot()); + if(!instance) { + Log("Failed to create instance"); + return 0; + } + auto root = instance->getRoot(); + _scene->addEntities(instance->getEntities(), instance->getEntityCount()); + + return Entity::smuggle(root); } - EntityId SceneManager::loadGlb(const char *uri, int numInstances) + EntityId SceneManager::loadGlb(const char *uri, int numInstances, bool keepData) { ResourceBuffer rbuf = _resourceLoaderWrapper->load(uri); - auto entity = loadGlbFromBuffer((const uint8_t *)rbuf.data, rbuf.size, numInstances); + auto entity = loadGlbFromBuffer((const uint8_t *)rbuf.data, rbuf.size, numInstances, keepData); _resourceLoaderWrapper->free(rbuf); return entity; } @@ -2272,8 +2289,11 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v void SceneManager::setLayerEnabled(int layer, bool enabled) { - Log("Setting layer %d to %d", layer, enabled); _view->setLayerEnabled(layer, enabled); } + + + } + } // namespace thermion_filament diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 1ccf1df7..48cf4602 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -166,14 +166,14 @@ extern "C" ((FilamentViewer *)viewer)->clearLights(); } - EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances) + EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances, bool keepData) { - return ((SceneManager *)sceneManager)->loadGlb(assetPath, numInstances); + return ((SceneManager *)sceneManager)->loadGlb(assetPath, numInstances, keepData); } - EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length) + EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length, bool keepData) { - return ((SceneManager *)sceneManager)->loadGlbFromBuffer((const uint8_t *)data, length); + return ((SceneManager *)sceneManager)->loadGlbFromBuffer((const uint8_t *)data, length, keepData); } EMSCRIPTEN_KEEPALIVE EntityId create_instance(void *sceneManager, EntityId entityId) @@ -191,9 +191,9 @@ extern "C" return ((SceneManager *)sceneManager)->getInstances(entityId, out); } - EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath) + EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath, bool keepData) { - return ((SceneManager *)sceneManager)->loadGltf(assetPath, relativePath); + return ((SceneManager *)sceneManager)->loadGltf(assetPath, relativePath, keepData); } EMSCRIPTEN_KEEPALIVE void set_main_camera(const void *const viewer) @@ -892,7 +892,10 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible) { ((SceneManager*)sceneManager)->gizmo->setVisibility(visible); } - + + EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entityId) { + ((SceneManager*)sceneManager)->setStencilHighlight(entityId); + } diff --git a/thermion_dart/native/src/ThermionDartFFIApi.cpp b/thermion_dart/native/src/ThermionDartFFIApi.cpp index d6bf72d2..3312f7e7 100644 --- a/thermion_dart/native/src/ThermionDartFFIApi.cpp +++ b/thermion_dart/native/src/ThermionDartFFIApi.cpp @@ -392,11 +392,12 @@ extern "C" EMSCRIPTEN_KEEPALIVE void load_gltf_ffi(void *const sceneManager, const char *path, const char *relativeResourcePath, + bool keepData, void (*callback)(EntityId)) { std::packaged_task lambda([=]() mutable { - auto entity = load_gltf(sceneManager, path, relativeResourcePath); + auto entity = load_gltf(sceneManager, path, relativeResourcePath, keepData); #ifdef __EMSCRIPTEN__ MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0, $1); @@ -409,12 +410,15 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void load_glb_ffi(void *const sceneManager, - const char *path, int numInstances, void (*callback)(EntityId)) + const char *path, + int numInstances, + bool keepData, + void (*callback)(EntityId)) { std::packaged_task lambda( [=]() mutable { - auto entity = load_glb(sceneManager, path, numInstances); + auto entity = load_glb(sceneManager, path, numInstances, keepData); #ifdef __EMSCRIPTEN__ MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0, $1); @@ -428,12 +432,16 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, - const void *const data, size_t length, int numInstances, void (*callback)(EntityId)) + const void *const data, + size_t length, + int numInstances, + bool keepData, + void (*callback)(EntityId)) { std::packaged_task lambda( [=]() mutable { - auto entity = load_glb_from_buffer(sceneManager, data, length); + auto entity = load_glb_from_buffer(sceneManager, data, length, keepData); callback(entity); return entity; }); diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index eaab19fb..fafdb5b5 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -1,10 +1,16 @@ import 'dart:io'; +import 'dart:math'; + +import 'dart:typed_data'; +import 'package:thermion_dart/thermion_dart.dart'; import 'package:thermion_dart/thermion_dart/swift/swift_bindings.g.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.dart'; import 'package:thermion_dart/thermion_dart/utils/dart_resources.dart'; import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; import 'package:test/test.dart'; import 'package:animation_tools_dart/animation_tools_dart.dart'; +import 'package:path/path.dart' as p; +import 'package:vector_math/vector_math_64.dart'; /// Test files are run in a variety of ways, find this package root in all. /// @@ -46,13 +52,69 @@ extension on Uri { } late String testDir; + +Future pixelBufferToBmp( + Uint8List pixelBuffer, int width, int height, String outputPath) async { + // BMP file header (14 bytes) + final fileHeader = ByteData(14); + fileHeader.setUint16(0, 0x4D42, Endian.little); // 'BM' + final fileSize = 54 + width * height * 3; // 54 bytes header + RGB data + fileHeader.setUint32(2, fileSize, Endian.little); + fileHeader.setUint32(10, 54, Endian.little); // Offset to pixel data + + // BMP info header (40 bytes) + final infoHeader = ByteData(40); + infoHeader.setUint32(0, 40, Endian.little); // Info header size + infoHeader.setInt32(4, width, Endian.little); + infoHeader.setInt32(8, -height, Endian.little); // Negative for top-down + infoHeader.setUint16(12, 1, Endian.little); // Number of color planes + infoHeader.setUint16(14, 24, Endian.little); // Bits per pixel (RGB) + infoHeader.setUint32(16, 0, Endian.little); // No compression + infoHeader.setUint32(20, width * height * 3, Endian.little); // Image size + infoHeader.setInt32(24, 2835, Endian.little); // X pixels per meter + infoHeader.setInt32(28, 2835, Endian.little); // Y pixels per meter + + // Calculate row size and padding + final rowSize = (width * 3 + 3) & ~3; + final padding = rowSize - (width * 3); + + // Pixel data (BMP stores in BGR format) + final bmpData = Uint8List(rowSize * height); + for (var y = 0; y < height; y++) { + for (var x = 0; x < width; x++) { + final srcIndex = (y * width + x) * 4; // RGBA format + final dstIndex = y * rowSize + x * 3; // BGR format + bmpData[dstIndex] = pixelBuffer[srcIndex + 2]; // Blue + bmpData[dstIndex + 1] = pixelBuffer[srcIndex + 1]; // Green + bmpData[dstIndex + 2] = pixelBuffer[srcIndex]; // Red + // Alpha channel is discarded + } + // Add padding to the end of each row + for (var p = 0; p < padding; p++) { + bmpData[y * rowSize + width * 3 + p] = 0; + } + } + + // Write BMP file + final file = File(outputPath); + final sink = file.openWrite(); + sink.add(fileHeader.buffer.asUint8List()); + sink.add(infoHeader.buffer.asUint8List()); + sink.add(bmpData); + await sink.close(); + + print('BMP image saved to: $outputPath'); +} + +final viewportDimensions = (width: 500, height: 500); void main() async { final packageUri = findPackageRoot('thermion_dart'); testDir = Directory("${packageUri.toFilePath()}/test").path; final lib = ThermionDartTexture1(DynamicLibrary.open( - '${packageUri.toFilePath()}/native/lib/macos/swift/libdartfilamenttexture.dylib')); + '${packageUri.toFilePath()}/native/lib/macos/swift/libthermion_swift.dylib')); final object = ThermionDartTexture.new1(lib); - object.initWithWidth_height_(500, 500); + object.initWithWidth_height_( + viewportDimensions.width, viewportDimensions.height); final resourceLoader = calloc(1); var loadToOut = NativeCallable< @@ -67,32 +129,82 @@ void main() async { var viewer = ThermionViewerFFI(resourceLoader: resourceLoader.cast()); await viewer.initialized; - await viewer.createSwapChain(500, 500); - await viewer.createRenderTarget(500, 500, object.metalTextureAddress); - await viewer.updateViewportAndCameraProjection(500, 500); + await viewer.createSwapChain(viewportDimensions.width.toDouble(), + viewportDimensions.height.toDouble()); + await viewer.createRenderTarget(viewportDimensions.width.toDouble(), + viewportDimensions.height.toDouble(), object.metalTextureAddress); + await viewer.updateViewportAndCameraProjection( + viewportDimensions.width.toDouble(), + viewportDimensions.height.toDouble()); + + var outDir = Directory("$testDir/output"); + + // outDir.deleteSync(recursive: true); + outDir.createSync(); + + Future _capture(String outputFilename) async { + var outPath = p.join(outDir.path, "$outputFilename.bmp"); + var pixelBuffer = await viewer.capture(); + await pixelBufferToBmp(pixelBuffer, viewportDimensions.width, + viewportDimensions.height, outPath); + } group('background', () { - test('set background color', () async { - var outDir = Directory("$testDir/bgcolor"); - outDir.createSync(); - await viewer.setRecordingOutputDirectory(outDir.path); + test('set background color to solid green', () async { + await viewer.setRendering(true); await viewer.setBackgroundColor(0.0, 1.0, 0.0, 1.0); - await viewer.setRecording(true); - await viewer.render(); - await viewer.render(); - await viewer.render(); + await _capture("bgcolor"); + await viewer.setRendering(false); }); test('load skybox', () async { var outDir = Directory("$testDir/skybox"); outDir.createSync(); - await viewer.setRecordingOutputDirectory(outDir.path); - await viewer.setRecording(true); + await viewer.setRendering(true); await viewer.loadSkybox( "file:///$testDir/../../examples/assets/default_env/default_env_skybox.ktx"); - await viewer.render(); - await viewer.render(); - await viewer.setRecording(false); + await Future.delayed(Duration(seconds: 1)); + await _capture("skybox"); + await viewer.setRendering(false); + }); + }); + + group("gltf", () { + test('load glb', () async { + var model = await viewer.loadGlb("$testDir/cube.glb"); + await viewer.transformToUnitCube(model); + await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); + await viewer.setCameraPosition(0, 1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + await viewer.setRendering(true); + await _capture("load_glb"); + await viewer.setRendering(false); + }); + + test('create instance from glb when keepData is true', () async { + var model = await viewer.loadGlb("$testDir/cube.glb", keepData: true); + await viewer.transformToUnitCube(model); + var instance = await viewer.createInstance(model); + await viewer.setPosition(instance, 0.5, 0.5, -0.5); + await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); + await viewer.setCameraPosition(0, 1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + await viewer.setRendering(true); + await _capture("glb_create_instance"); + await viewer.setRendering(false); + }); + + test('create instance from glb fails when keepData is false', () async { + var model = await viewer.loadGlb("$testDir/cube.glb", keepData: false); + bool thrown = false; + try { + await viewer.createInstance(model); + } catch (err) { + thrown = true; + } + expect(thrown, true); }); }); @@ -124,5 +236,218 @@ void main() async { fadeInInSecs: 0.5, fadeOutInSecs: 0.5); await Future.delayed(Duration(seconds: 1)); }); + + test('create geometry', () async { + // Define the vertices of the cube + List vertices = [ + // Front face + -1, -1, 1, + 1, -1, 1, + 1, 1, 1, + -1, 1, 1, + + // Back face + -1, -1, -1, + -1, 1, -1, + 1, 1, -1, + 1, -1, -1, + + // Top face + -1, 1, -1, + -1, 1, 1, + 1, 1, 1, + 1, 1, -1, + + // Bottom face + -1, -1, -1, + 1, -1, -1, + 1, -1, 1, + -1, -1, 1, + + // Right face + 1, -1, -1, + 1, 1, -1, + 1, 1, 1, + 1, -1, 1, + + // Left face + -1, -1, -1, + -1, -1, 1, + -1, 1, 1, + -1, 1, -1, + ]; + + // Define the indices for the cube + List indices = [ + 0, 1, 2, 0, 2, 3, // Front face + 4, 5, 6, 4, 6, 7, // Back face + 8, 9, 10, 8, 10, 11, // Top face + 12, 13, 14, 12, 14, 15, // Bottom face + 16, 17, 18, 16, 18, 19, // Right face + 20, 21, 22, 20, 22, 23 // Left face + ]; + await viewer.createIbl(1.0, 1.0, 1.0, 1000); + await viewer.setCameraPosition(0, 0.5, 6); + await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); + await viewer.setRendering(true); + + // Create the cube geometry + await viewer.createGeometry(vertices, indices, + primitiveType: PrimitiveType.TRIANGLES); + + await _capture("geometry_cube"); + await viewer.setRendering(false); + }); + + test('create sphere', () async { + // Define the parameters for the sphere + int latitudeBands = 30; + int longitudeBands = 30; + double radius = 1.0; + + List vertices = []; + List indices = []; + + // Generate vertices + for (int latNumber = 0; latNumber <= latitudeBands; latNumber++) { + double theta = latNumber * pi / latitudeBands; + double sinTheta = sin(theta); + double cosTheta = cos(theta); + + for (int longNumber = 0; longNumber <= longitudeBands; longNumber++) { + double phi = longNumber * 2 * pi / longitudeBands; + double sinPhi = sin(phi); + double cosPhi = cos(phi); + + double x = cosPhi * sinTheta; + double y = cosTheta; + double z = sinPhi * sinTheta; + + vertices.addAll([radius * x, radius * y, radius * z]); + } + } + + // Generate indices + for (int latNumber = 0; latNumber < latitudeBands; latNumber++) { + for (int longNumber = 0; longNumber < longitudeBands; longNumber++) { + int first = (latNumber * (longitudeBands + 1)) + longNumber; + int second = first + longitudeBands + 1; + + indices.addAll( + [first, second, first + 1, second, second + 1, first + 1]); + } + } + + await viewer.createIbl(1.0, 1.0, 1.0, 1000); + await viewer.setCameraPosition(0, 0.5, 10); + await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); + await viewer.setRendering(true); + + // Create the sphere geometry + // final sphere = await viewer.createGeometry(vertices, indices, + // primitiveType: PrimitiveType.TRIANGLES); + + // await viewer.gizmo!.attach(sphere); + // await viewer.setPosition(sphere, -1.0, 0.0, -10.0); + // await viewer.setRotationQuat( + // sphere, Quaternion.axisAngle(Vector3(1, 0, 0), pi / 8)); + await _capture("geometry_sphere"); + await viewer.setRendering(false); + }); + + test('enable grid overlay', () async { + await viewer.setBackgroundColor(0, 0, 0, 1); + await viewer.setCameraPosition(0, 0.5, 0); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.1)); + await viewer.setRendering(true); + await viewer.setLayerEnabled(2, true); + await _capture("grid"); + await viewer.setRendering(false); + }); + + test('point light', () async { + var model = await viewer.loadGlb("$testDir/cube.glb"); + await viewer.transformToUnitCube(model); + var light = await viewer.addLight( + LightType.POINT, 6500, 1000000, 0, 2, 0, 0, -1, 0, + falloffRadius: 10.0); + await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); + await viewer.setCameraPosition(0, 1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + await viewer.setRendering(true); + await _capture("point_light"); + await viewer.setRendering(false); + }); + + test('set point light position', () async { + var model = await viewer.loadGlb("$testDir/cube.glb"); + await viewer.transformToUnitCube(model); + var light = await viewer.addLight( + LightType.POINT, 6500, 1000000, 0, 2, 0, 0, -1, 0, + falloffRadius: 10.0); + await viewer.setLightPosition(light, 0.5, 2, 0); + await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); + await viewer.setCameraPosition(0, 1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + await viewer.setRendering(true); + await _capture("move_point_light"); + await viewer.setRendering(false); + }); + + test('directional light', () async { + var model = await viewer.loadGlb("$testDir/cube.glb"); + await viewer.transformToUnitCube(model); + var light = await viewer.addLight( + LightType.SUN, 6500, 1000000, 0, 0, 0, 0, -1, 0); + await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); + await viewer.setCameraPosition(0, 1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + await viewer.setRendering(true); + await _capture("directional_light"); + await viewer.setRendering(false); + }); + + test('set directional light direction', () async { + var model = await viewer.loadGlb("$testDir/cube.glb"); + await viewer.transformToUnitCube(model); + var light = await viewer.addLight( + LightType.SUN, 6500, 1000000, 0, 0, 0, 0, -1, 0); + await viewer.setLightDirection(light, Vector3(-1, -1, -1)); + await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); + await viewer.setCameraPosition(0, 1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + await viewer.setRendering(true); + await _capture("set_directional_light_direction"); + await viewer.setRendering(false); + }); + + test('set stencil highlight', () async { + var model = await viewer.loadGlb("$testDir/cube.glb"); + await viewer.transformToUnitCube(model); + await viewer.setPostProcessing(true); + + var light = await viewer.addLight( + LightType.SUN, 6500, 1000000, 0, 0, 0, 0, -1, 0); + await viewer.setLightDirection(light, Vector3(-1, -1, -1)); + + await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); + await viewer.setCameraPosition(0, 1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + await viewer.setStencilHighlight(model); + await viewer.setRendering(true); + await Future.delayed(Duration(milliseconds: 500)); + await _capture("stencil_highlight"); + await viewer.setRendering(false); + }); }); } From 00755fd417c7184cad205b552f46c5f12657e201 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 6 Sep 2024 12:44:40 +0800 Subject: [PATCH 073/232] chore: remove old materials Makefile --- materials/Makefile | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 materials/Makefile diff --git a/materials/Makefile b/materials/Makefile deleted file mode 100644 index 1fd88cde..00000000 --- a/materials/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14a484a441dacbc49ce6b8b189a8900a7bb2ab2072731a3a493676aa046b5888 -size 1009 From 29b6a48816c3f9db035a583e2c275fa59c5e0f86 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 6 Sep 2024 12:44:54 +0800 Subject: [PATCH 074/232] test: add test cube.glb --- thermion_dart/test/cube.glb | Bin 0 -> 1932 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 thermion_dart/test/cube.glb diff --git a/thermion_dart/test/cube.glb b/thermion_dart/test/cube.glb new file mode 100644 index 0000000000000000000000000000000000000000..4182579232948e2eb284ff662dd6beb1092cdc0c GIT binary patch literal 1932 zcmb7ES#R1v5S}z?leFoP^m;}6)CZT^=8PXo6Pl>B39bM|m7=IIunLjYwbP&fIrIs@0I|*HtqU|Ibp~nW{p^%`&>9tAehCz zoru5>!b~4SGTR>ayIf>yAMDIoE}PF5bf&R0E%EY^<@cg8Z5s1~E+>P2G(MW1Mr^>t6B(NLSBGuR$YtO}T)2)mLF)#?w#S=pmv@;Ji6KXf zNrL^vFRSYY7I)ef`#f?y&+RmVVgJPEAtH=e+X;C!@B*>xbY!Q8dbX^~RWb@@p-{?| zG+ooPX3;3>dHj@%hGA}&ikd;yB$z51dld@)QkN}^W#!nC?DcX8)Rd}ExC1wG&k_eG ziiF!9Msysp?{>4+s@Zipkk-zRs%nRv!QDdE8=;K2$^Mv*rFUipGLtVRg z%ZKj`O@2`k$tZTPQ_bPU<5W}VSmSNz({OVx+`Lcte0H3~e0Hgnz2&gYBzv>EwYSxf zZ){qAdRTH$?emE5alaqo>om({jgi9c_2f?mZ$ENGpME{L{ALlaM2%uD*4V_x(yKr}S$qiF*wR}#9oMJBuQxlXR6 zFs_po2HCHYm5%sLva;XAD@i>Hht9LIIupM_&Qx$nNVEL!$BBNHlV6OsSx$bWpXKED zDZwXxj08j}e9}`K@eJ8;5s#6MiIXo9aq^=@oa|~*Z?vQ?PT5eVCGD{k<)&saIi&On z=AChLSP1?zp=;ir8{{?skuV4Xb86LwU s*uZ@Q-oRUU32V5o!3%f}i?E9OD!hh=@BmhDUx6pE4o?wq9cc;v0b9k@{r~^~ literal 0 HcmV?d00001 From 6ec84b6249e1eef4aa4fb39f4ce8be6d7bcd2076 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 6 Sep 2024 13:03:51 +0800 Subject: [PATCH 075/232] fix: add Fence to capture() and set stencil buffer by default --- thermion_dart/native/src/FilamentViewer.cpp | 24 +++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 6a4a0c72..d264ff95 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -35,6 +35,7 @@ #endif #include #include +#include #include #include @@ -165,6 +166,7 @@ namespace thermion_filament _mainCamera = _engine->createCamera(camera); _view = _engine->createView(); + _view->setStencilBufferEnabled(true); setToneMapping(ToneMapping::ACES); @@ -1261,6 +1263,12 @@ namespace thermion_filament #endif } + class CaptureCallbackHandler : public filament::backend::CallbackHandler { + void post(void* user, Callback callback) { + callback(user); + } + }; + void FilamentViewer::capture(uint8_t *out, void (*onComplete)()) { @@ -1279,22 +1287,24 @@ namespace thermion_filament callback(); }; + // Create a fence + #ifndef __EMSCRIPTEN__ + Fence* fence = _engine->createFence(); + #endif + auto userData = new std::vector{out, (void *)onComplete}; + auto dispatcher = new CaptureCallbackHandler(); + auto pbd = Texture::PixelBufferDescriptor( pixelBuffer, pixelBufferSize, Texture::Format::RGBA, - Texture::Type::UBYTE, nullptr, callback, userData); + Texture::Type::UBYTE, dispatcher, callback, userData); _renderer->beginFrame(_swapChain, 0); - _renderer->render(_view); - _view->setScene(_highlightScene); - _renderer->render(_view); - _view->setScene(_scene); - if (_rt) { _renderer->readPixels(_rt, 0, 0, vp.width, vp.height, std::move(pbd)); @@ -1308,6 +1318,8 @@ namespace thermion_filament #ifdef __EMSCRIPTEN__ _engine->execute(); emscripten_webgl_commit_frame(); +#else + Fence::waitAndDestroy(fence); #endif } From 433f03161cbc6e22f0b50d1bdafa8984a0bd95a4 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 7 Sep 2024 17:53:41 +0800 Subject: [PATCH 076/232] feat: add scale parameter to unlit material --- materials/unlit.mat | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/materials/unlit.mat b/materials/unlit.mat index 4d1d4c3e..3d75dff5 100644 --- a/materials/unlit.mat +++ b/materials/unlit.mat @@ -14,14 +14,15 @@ material { depthCulling : false, shadingModel : unlit, blending: opaque, - variantFilter : [ skinning, shadowReceiver, vsm ], culling: none, instanced: false, vertexDomain: object } vertex { void materialVertex(inout MaterialVertexInputs material) { - material.worldPosition = materialParams.scale * getWorldFromModelMatrix() * getPosition(); + float4 position = getPosition(); + position.xyz *= materialParams.scale; + material.worldPosition = getWorldFromModelMatrix() * position; } } From 63e2b74bb18ca7161c81d3042be08ecbfd7fa4b7 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 7 Sep 2024 17:53:55 +0800 Subject: [PATCH 077/232] chore: rebuild unlit material --- thermion_dart/native/include/material/unlit.S | 2 +- .../native/include/material/unlit.apple.S | 2 +- .../native/include/material/unlit.bin | Bin 26426 -> 63643 bytes thermion_dart/native/include/material/unlit.c | 4147 ++++++++++++----- 4 files changed, 3006 insertions(+), 1145 deletions(-) diff --git a/thermion_dart/native/include/material/unlit.S b/thermion_dart/native/include/material/unlit.S index c17de370..4989d923 100644 --- a/thermion_dart/native/include/material/unlit.S +++ b/thermion_dart/native/include/material/unlit.S @@ -8,5 +8,5 @@ UNLIT_PACKAGE: UNLIT_UNLIT_OFFSET: .int 0 UNLIT_UNLIT_SIZE: - .int 26426 + .int 63643 diff --git a/thermion_dart/native/include/material/unlit.apple.S b/thermion_dart/native/include/material/unlit.apple.S index 95391011..68ed9bfa 100644 --- a/thermion_dart/native/include/material/unlit.apple.S +++ b/thermion_dart/native/include/material/unlit.apple.S @@ -8,5 +8,5 @@ _UNLIT_PACKAGE: _UNLIT_UNLIT_OFFSET: .int 0 _UNLIT_UNLIT_SIZE: - .int 26426 + .int 63643 diff --git a/thermion_dart/native/include/material/unlit.bin b/thermion_dart/native/include/material/unlit.bin index 15ab3fa6e0ab02e0da6c00c05fcf141edb9aed4d..a07f00e04dcc216cdaa9e98ddfb428fb0bb344d7 100644 GIT binary patch literal 63643 zcmeHw2bd(a(YDmxL?;{p$FZ^TF5E3UVZ(5MeG$&S#O;xMK9A>i=k5kJv9o&#W8;jo zjT6Q>=bSUnIp>^n&e{Ins*<|Zn(p4&h424<`|&;;(_NBErBbORRaHx4+t;7p*s*$Z zq?D@S-;UMmH_*GrvtGY>^%iLv#TAOHpIA)rZ#Nc zavmjKjpt)F%r&Q4=S{cw%*;)7l-j!c;@0?l{H`~(_wJkT#P8AAzUIWtf%yH14RbRG zTa(*c<1=#;G4x1*CdH0gGc(;vUW3gubF=%}(|h9*;pXOiYp&g#+|~p=9d-1!&8xXV z9|Mh%3XVET2ge+xj?wy9HAy5jI!wss=B&~JXz!j}x8ZCR#BXD>t?`A)=9~&miB5Ay zMfQ149bq2l=N8827v@^(NCE7b*{hD4A_{jj=k~Vd*DUPW)0%6{&UD)I?U`v1*PS@u zoZj1-p6{q*c2i4Dk@oaNd%V?IJw0(ji}|QZYc?|LN6;*<$pJw0H$F2tGbfMu|B+#5 zygAv5-=h#Hm@~%%=Ap2;#m=|=DbCVjX6TI(S6yne$$#*oYrmLz9W9w zv|;`B_+{hv3%Fhu(yCZ9I=TOR&C|Jonlsf96{cTDSTfZZqfEwAp#t?2^61ec8TsV_cD5eXg{Q zMj;_ty?R@MaQo`>`Gpd%dD@9*Z9iv6{QilLZ#rx1IvK)T`}Q49GqIX&H)>;1(2rmw>QSlS-lQV7i`^r&(+(vp0{OP5m7^{)MWF}%))$MXMUnw z8|*JFh_Wtus=BMMOU<2G3;@3`FG=rM^_yEodU9adK?m~hZu2{Ce$mkkZ|$t127cUQ ze)pO_-^ag|QrpVJ#rEM6lVj5SPMMt3=642|S`+Pssac2`Nz<$kxHJJ^NK{I57B$3C zia=D2B-)4lNf}8w-~(t>r0PB70}dwu9*Ru|umDK4wA+D@P>wtAOzMOK5IS02kUb8B zvF<&*vkpG<^FAk05VRc#veZf!`+!RT;Mymh6dvHtyC9pEthLgNlSEl(op;H4sbmHF zyOKIxkohjif&*Eg8ukOgO+0`Hsp6oMM<9m);oOJgOwHtRH$B=;WL)DeL{Lm5`CHwo zdy>?>$>ToGNIJ7^o`}s<8L8My_$ehjlii@HZqRf$Xof)CjkAXj%kVOYiAR@q7nth? zb-F?GE{M@D5c)w@5PRHZVXl7IoL;r1*i4Ed)qZG<%S&L6v(AeVPtJ@tX>kSZ3=P+w zE-^h*t8u?O{gXq3;>D1ER$;L*LuyI{~X=SO57Awq%t?mM;yry>>)k+1p zyjG)8)l#E6IEp07F>vtE;nFD{BL~1-ZhfO#tC@_e6uk@_XoN;K1Sn^ioazl9;Siq-~YKDpOD$qP9^( zx_eNXft=Kg%naNt%7A8NX5eO0hPauPGBqI1EvgS(jADrR1T#|jHki85dt{y#wY z`pnZQ9+vjN!G1`DBp(32bS3S9L;b51WWcf_#ymUM8gKLRFEw~psqO>}{&=BhyUMH! zSrm3RJFT^}nV@!H4rooaJDv9amer)=ldb05TFj2_yker{%# zc?)?=0PEVIn1-&Y1+p`25#o7-!6d-dQS%7JAX*nPYnC?Y;UAAxFm11CLHr0#r5oGl zy;58Irc!EVpt+({9vJLjL1YZ`|3|w1KiWSKbFAl#aR<-_*DkQD2WzGIx#o0-_SBf0 znET^1SPtc^&|v~`vFfh={(fY$tQ2)fxkqYUI05o;0+hxH zfRFPKY9I>w8eou*lt3O*0;P}=z(;yGL0TE@LJE+N6reOx0DPneAO~|T7@43Ytvrkl z(d1LyGdZF(I!fz=;-WdCR3EG_TGSIIURyUR!$dAU_w}u`y?TIGIT#>j1>UHP3?dh2 zM$gb_IDmCfbpaVL%rJn;gTt5y_y-wT%D{*&J_F?Q8K5+u0r2@8OBp!Sg%cnjCqQYO z0Qfi)DFg3(qy+Mi5-5d~06x;gUu1rygG z_jwD})(x%s@qMCt@^tfx5+?fb3Y6Y_A2EBRbeB?Pur|7YIWU2pW?%pg_G9gp2xq-I z40`ee2xK><`@8$V_XTXmbe+Gp1O)GEA#E?1*~I8 zQ*nK(6dPI^Lqnuv7hj{M>{X?cOGD*Kf9a0U^(>|}LON7~9Shq5!pVIg&?=y@Bx8L~ z)su2&U>{a==Zk%AoniP2+7-kwVK{M{OAgVxw|lwIH4Ud~q9qlH3;K?UBUylO5S z%A$+%F0&mKWy0x~mPEkBt8lzl<+XC^sWKh<>jlhnT=6a}%86+-K^msihe^FKZnO|@ zyh`TW!YdLhg3Ft!5j8_wVAp14+acFqJAgJ6Cl+FMDWJ?q4A)0Z^(y37mKJV#^6GVm zk*i^1_|oMH>o+S`B1^*+mL({{p&D=KNYG^0lUl4$@(K|RcOB${?25$^Sy^n0ph99| zK^+oy4^iJNPf&@C9%nELL{Mp<#6tp`qm-c1q+tYgXxW0wgp*JWiDcSNt;y@qB7!=U zC8#5;aKV1!O?_k}7F62aQB@$E;PS?MYGfW>nxKwgn^7dFM41s(uFsHz>f;JUGA*&_ zRgzbF&FPLIyUl70b2iSNC1FT*#mTI+U63zf^$|0;hlne9lTA4gv2B3>hlpzgz+A#P zc+*V)Y`TdQ7JB4#-l#oxc`z*23(80|(-2SZA>` zVgQIO0QF&7uWUAT7(LCtmBj~po}mM@~on^9UWmtZn*-XH_c8ypbM8{81in>ZsJ0QTU{8ypkz#>Buq5x=pMLf*ty0au0l z3Wr6Uw^o`=y7gLmTHOI4w8x74a`DvGw=hs z7vijy5;+;Dsww&WfE@?|fRGzE zLi}!=3C=sa6a+cD66BFx2=d6T19@bZft2O`u#N-bF*^(-8#@Z*ksSo`$c_On7CQv2 zfyi2vjEQLN!tPcnj+&r8E;*HEDJLTzh_OfvGPM%NJgi8{R!jTatpok3E@_lUNqbJV zruWY8>*I7(NGo(oILp&+=&ydW3T5Q(OcM>P=wH?nTftw+E+N+V;a96 z%Dve5(k$=uXfJlZ+3*U(*=j~Ih?Q6y{Rip?4q=^3zXw;8#wTH%?Th-8 zD=OP4!}4g|Q;t^#n^*Fh#6>Igx~)A9#|jqDnbW=9L$FKUWM!d5J!{(YogFh9D1@hb ze?>Ix8nCSZr<1C9Uuk;N;>YBATFHme0@#sfTEz6p_&*6Myfw|9)w4G>)?c`zF+SPG zthX>Z*_dccEJ5jXaOTnlcr+IcNgG`>5Nxzm!D#bB(Z+VH-@blpWBoXzm#v{AnjU8g8N#e0)}mjMBEY+d=@l(byh54qsdVyOFMQBkCLrL6zpk z3)B}07eG4NkXfD^h4i>l<-zV1W6O(vfYCRnV>qUuUWqHSQVd4HEJ7wU9)&z{d!3z& zGhU*V2gxABGn@@y@dbkv7e~&aHkxuOSj%CFiIPb|nYxYBG28JN#mg{C;>X01$OBX> z&1X_RBb}XceJjc3PBSW_gz1}BoOo}P$=Z%p1|cKQ7%b##F&5XEQAi#G;R@6Sp^~|C z(PHo_oLR!+S7=NMO8st=fR*Ooga+FN>U2TSJ>$nA9ZWXLdQ(nTNC&b~&$^LH)HE`5 z&~!m=;mRm=N4}?}z@scNLB&OL+!o%_Za*7zy=>Dfjpc9O5r4ck2CT0fk9nJ0rHUoltv1Gk2LWpgLPd<0rHUoltv1G zkCetu+#~FCEtZ2EPja5{8&PHq5xb2pK#dN)phe4GHKaRT7uOk@k3^9d!8hm=4m zqy+GhdVb_ul^q3O8hnHF0xvQcnRt@A^{F80S!>p z?L($sH7;ae>0(xQbO7Z_Gs}q%;5yia41&pn%zk5*ADMM4BtxE>E?8oTPq192MM%bq zrd+A*8c40uGd;}Yk`(h*wHo_R%e3E>MO3*)@(lpdMn;t-dY9Rg;w=HKpRUFW5%%BJ zuhw&yV`J}gRVA=y_fGuF0=3u zR${`CS!9-L>;S9DLS+b~BZv5bP$Tq2&pu?Jgk^x10GU2yrioVtrY@l)u8S%*?sMrT ze(|_%3>U}VkqgAP1+NvV*(2Z`RRM&UcgFCNW$1=o9gz>$QN0%4< zW!ZKtL+-M+9&s($)EMa=MaMdF#}Q2|cX(Qo+!;si2>j(lJH!`1Wqv7+U>GHXTbJC` zX}mSieCpzQSvEK2Q4AOW*;oT8y|7i0Yh04t)j?Xm+%Zioccw0(Bd&{y5@)bX90&5JcPdNVw1Vi& zU2COEE)m+bR(RFn&7X_!S}Ro=PCf2gD^=Qcm|ZJM#=F)^jcoyx9&hnL5RD;FD3U1; z$*vXUGtz0th}gz>*GedzT`MZ$9U~#j-?d6rgv#t%7b}KUAMaZIg0TF1O>%avLW6CC z>{Fb5fNxfj5bZN~&_$ zEIz;C0Zglg9J^UnmI%lQ0mO?4Ad0g}A^?wK0+31~0IMVd#G@7;DL^QCQ%UJzmv2i$ zO?k@6etrY}Nwb4Y(8b@zKyh<6`%!`Q4=?%Cfw({q9}U?3?g)p@74JNA_PZk^v|21K znzP>>l>l7&t^cP+uAJy=_EO(tlqzX2kUw_7AoY6C<7f43NKYr%#toB;Va z0ZQWpz{iMFNq=w_o?0S$}1}|^i0GBsYBWhmC1`@@KHjqLY?;y=LC59aQ#1(S= z#=ycKIuHX$8oafS4SvryVEAnI1;saI3?-(FAvQyDtyw!#B=@`{O~k~ol~nA~rA-z+ zU=l<*C2X-hjDo*23==*VvV~2|67iQ7vV%|J*%uMEECX5H7zhR_d>6tdVY}k%)(X^xVPJ%f>jMK#H^dc+u#uwnq|36LBJgFJ8}po#Pi7C0Aw46~nYiFaRNjHVFnG#Lyhr@8&^Y@?mgJm}usX&K~-Zy`kfZv!g~?b|hZZy0|kUMNN{}meQoB<33GBj`*~N zyb#FVqT7-vOFt;g1{(cm1}DOS4*vW8@w_Nb=$DN6MPAokhk(2#h6nl`l#bf#t-GCI zMvm=cvHV{MQ0pE%P|(I4k`B-6&Iu!kH_Q?nh`7S)q{h>88jN5$K`mA%RqGjx2X23( zDyD1XSVTM4Dr^%*MyNi#7{dugy&3>3N8n@SNIArC0zj-BYaGJTn{tHt8naiPEf@H6 zRAPlUaSc>u%_Vu!N61OUXDKvmn8y5*lYtvY7~;lN_;i@G>RO^L7evR^*`BBA4XCXx zw?b}C@rsM)+SAZl z-yT6AZ+A_g)b5%9c6Z$sf&?~n;RMLX2~Zj*06xyda56g5Wd59#6_$+4%^dC^~7G)IKw8_?pSo(M?@Qe}i}5{rc(Rm8PS znV|$SLXhBdr`d{rXxQQpwwtcl9s>FN1t`s50DS(&W;t-EtIq)PaRQXa34o6?kuLDA z3n@T8Qh?G(0q~LfX1TH$Q@}Smp@81lEH{#bA&EQ13D)R642ki1aYziyH_Mgrl@|IZ zUrwxDE+Z0&`_|ay2#?P*hIve5Sc+>5v225F4$dFmHG?;aZH|SBS79~zQa>FxTCfTe zJI!!~)@~UANkG?2KoZB=uo(}S;v+9`r8MZz|_KJnW zumrEh+K2q26WA|J`Q%khKvelsEHG5Q$OI$Q8DWwdZ71>6%q*8alfV}4PlD2`*AYgJ zB&4#-Ff0sS%*r=hmE%$nb~0SCZ8p|}bi@*pmuSub)o?*W7AZ`rT!Vxpg2`4d#D^_g zFo}5{KWt4yFlod!4PmM53MQ{vMKJNWM8OoJS$T+q=FlS0fR+t$_!2_tiUqTl8Nej= zapI2{0*CMogP^6TKf*52bH*x-%1r9g4q<@}45KOEHVEpiZP3I-}YgmQg)lh^uCfXEJ2H8jgsi6oEp@?Fg;;}Nggn$AW z=6U;KsxxO}TpKYOuNnsuoLC>d{!hxiNg2BpVaV-Q4&9~6pQ$V0LZ^EPrb(RXJPZ#fo8x#9L#(U|(00oUO6YVA~*DV}ccgIdPHRw#LXxJ?n3cv5cT| z;HSqY7baSzGp1Ve&B+GNUY~65KFfi3+EWv!(f|h1g-_hJF4E`+29^Wtq4ubRP-D5+k zv$u`ANr-2_Ha|x9lsL6?W!SoBPp38SG;vqYAzTNueqwLSe(spgy9T$&$hdde zQY#(a#uwvAW(uloO*ClRS}pByQ)saA2^Gm@95I;{cMXmeC@!e(KgUBwR^6)oe1(p6k~!~nNKvcuC%{1 zwH|Ue4OwuSOyG5`+4+4wR!Z1Jc-Krq5VyA`aGwz$$W7d0gO~8i%HfVfv!<8R9R~O6 zI{HLD#rP7SWAn|q6eWOdZXVo<;&EoKhv4mLByDcbx|9Qc4xh}tp*cA@vj?Ye#T`lb z*DlOssHgegMH-8SUy#IwROQCqu3Qq%jnn8jNX8rlEsOqCIt~!=FhkmlbOkCP^-_?9 zrgP*f(BoJVbUL`7XLfFe?%axdES}krdft9QkU1?;;T`*M6oVYpo-h<}U#kL?=B~&Y zz+;#%C)~zEgGgI;GMdFSl-bV(pEJ`YAbt>D<6+Z4T#)U;O9Gm9M{Md!YaOWrr zzIejB>`2BlXHUxmA7kR+DWS7z_A%w@I)}jqoT6?`S$??E&Yd*n_Tk8j>019T9JcO| zW(vfPGAHjyoR`?+Eh3$Kqj5gzRXPoJo4Ke7bz9U_af$&#sh51(B zAmbN85tD9OEl)TEpWfl{#eX|@Vx5b4{Py&&T{uOE&ZVHmU20u*ayp~~Wp?w`XMJUA zu2U+#syo>`e%2{R&3DRS<>VYTak3XgpOnLyT2ziz3K)i=%2$1Cq?u^gxRBP9E&!E2A97g{;{d zc_Wf3wCrgk?1D-@C_qhwjCRD7nSpF*AfTB98OS?(0%GS&IgLy;D(toQ40gP#?rwj+ z%bUMhAhc8{Yp@sxYn`nRg&BonbE{p(tt@wxWw{LI{#y;iYOx=fkV)hZK> zCfyuy24gwP-RSyWPm@H*8pyo2bHoedtmeu&e0uDjaeCjIce^zf)*xs}OBFYz9?M?&4ep)tafP;!QExIBMNEY6*@i&7#gU_5XHKq(K%ByOU+8*{fa>8q4)G zjhnsUhso4~BxNgJ`-4Yb0@Eqjmte(K@{j^jFGT9^%&((Pz-eX9(ss;BlJ#x{K~UE^r~4KIBo4WAA!il z379=nY2tMzM@R~x`64!J`9M`B#F0alAoLd#XI9z-b39E$Y{X|z6Fqi$nsRy8WigDK zOihQQggQe)()rkVdgUV^CStMDUOT~?UyUt0{Z29;#>eda|h89CXY4t8Ub`*(((i`bw}KG$smcT+H9_Z z^)7i_hsga#R9&YL8-EreBbM;-aFB6nHirbAm{Ig&|EN++AkSEayUs05Hmm)WVMeEH zmCO98SY8MSPoL0MGG5*J(7(;eqPD+o6&wY-j4Hh7CX3qsI#nR>55lmFD!eEti`xFW zRTLiYRlq1O;Lf79za&0HJVi-i;GjPwl!j#wACXX0gn@H7jlk_4Q=FeeY6LD9O)=Dl z)uejQ%0?VRRW8>}ypvxc;F%Qyo>3v7g%u_NR%LWnW)lgXRU^T>Yb0o4jY(`DKF~KG z%X)1jcxH|Eq_GrJDR*IwoQa!!qR7iy6#8U*#{@mw~=u z)Uj;?!+-}gPbTK%iIuU{fz^-|WS{48c@se*XBVf&fH?vvxq+*T zd!llU{m!OB7C1;t#%X25d}i#66yTX61$c%K16n9j$v8z{W{w(yXH`h>?g|N7SfMjc z(Y@I<0-jkT;2AXnT391RNm?G$FR$!OHx6-h8;b*lOwubtCLtZe6f^0T;*w+nkPs+} z7VwudwE-4Mvyd@T0H@OhayO#8pur->-VsK1`eBs>i^D4UlCX3W5@L9cl|!|QharnP zT1MBjcsGan%@jejv6n!e-AjOH_7dP3y#%Q3C82@>F*9nWpup|~*mlg-V{Q>5RAQuY;NNuV{c26*ucg~ z#=>TjOkfh~O9-ZRc-1puP!saiA!q2>*a zP|rRnpITp6izihf&36ok94%mN^ul%el-n3*b2AG4$k>y~lQ4Qss`0_^u>MW8?DoIF zp@(AZH#-qN)cUB#zt_09FV@Hj-8r(_RkFBD`siq z?_1}*EL|q4*dk|5U{V17<#ij*7KCa0o15-n6N{U{Hje8_y6}z7ws7co)7S&W>0^z0 zF;bh!!7RqGn9j7V(loEroDo{Z6qZKYL8^mKTu6)HGgOKj$wxQmU?cO;s>G6-Zng9( zq8Nm@vUrU=bZn$V9tUYTWi9RICj6TQV^-fF)x{+}6N_EqvEip)oK-ne*=^e^gDPtu z^jufVv+XU(VkQ$d8RBu;dYNJ(W21aBB#95~(MGap|D{;@2`^pVLdx8#=o$y*1Fxe$ zx*gE;e)AehSEvbM2@p-XUY%;&Y_Fu-X5IA zN@uT8PWq!wJ!kOm?*ZlMsDSh`i0U(pt@Wk6CJu62zkFGWimh&@n&U*8xx2WQidF#6 z5X)}#sZ(}@&OfAg`lFWc<{0nYmJw z!E^`0y1rhH<2bM~BBxMpRh3 zQU-wejG9=05Y}dA{`AxNh9Z&=U+hSCP|yi~9S&cX^=x&uBnd;Y@?;PgL4K0&+5h; z$I!%HJc|>3!R9<_*(uD{T9-MqJRq|XcsL+Bz9Bjhy?70VM3l#MntkDF{naPi!TB&T-p zWl7TBc=*#TPNEEwyPQl%iy&rUkE05yL#Quu^@Gm>q2oHJr4+)His~M$32T#%V*WyM z*x@3~&YQm|mBfWV3Pq!xWPK=us!Kx z7ibKk2uB1`IoT&sCuL`*eMX!)39Vr99j1jI^=;w<=kT+F&v@gCVB6!P=K=BV*4788*VBfS_rNm;V|vES3NXv)!Q9hO_>Lz!*WRPY zb{{p&Dod6T{@80NH8=tQRAj4T!OR;#X3ZeNi?iU6pH8L5y-jq=PRtFw)?-wSI;mnO zt<2}%g75(-n-rYnkJni=r(iWyr`r#)?lPaR)v@>jW~?pkncB#~%Nd|_>mXCMeBNfc zL+{4mY4??;5%~TPwf3z<9lUk14IwUigP+XBLLd`~l7=1%kHaIV;Q!n9W}$#(8K13D z`2>fs9DL$0)#U2Ue01Avv@bdF=@waHVMd=LdDu+U8H7MDi8kqOV}j93<9iV^aA8v@ zWn`LV&SwzRqoU%^cBxIY0?nEA263<7B7r-ML4tGK%_#Gl#v-6OiHr>+ms39IJz;>`)yNhwK9jxOr$ZA6H;J0u_?pas~I-q%9%D_JU}f z3RH1&$ptmW{Ua6vs|o&b8E4X=DLW{vlV zNTP-RB0)FYcB5!AiOy~?AEV(*ocT0AErtxt78@%caZvRVhett_OttKYoNbrX$8Nac zWqPX%eCN7m2}u-Hox&qQDJQAj$4U2`jpm)F= z6Xh}-dzNeX;N8Z!0BSszfW{FnfEs@#peDWrFzcY>N&;HYN!I7=MXSpg|jp%;%rpx(n#5CXL5EG6p+P`!9C3Q3xYMWNs#`S6IO z$M!!#yE}!Tey0%3b_%}Tf?LXycO%+-SE20~hRNiT9tSe+@zq#a0)6RNBwL7pvX4T^ zl(~-*cn3`huDOpAc*{%)uDK5@84?GiyZFuW&sJ(jYL(Z&`S;~yej7)t3MwM_@q~kS z1mu1jhqHGq(Ap>{r_fyK`Zli0r&(p1DR})IJ2*GbOtdE9=*9UFFtJkYLI-V)G7S(y zTQ#nPTKqk6gDQ&fo7&YF^QzDryP)*8i zftnZ!>p)_;KqfX_RAWy}JnrPs`j}O~XUE)-*%Vm@@Uec0?ILax352(K_ly_SA^J?C zO6Pjem5h;4Wl4yYs7dcjB%j-|~PIrv=j1saw}i)YrPJ)pI2#GGNvk)7eJTsghS zQ#xxcz7qxE2VECyWhx3be4>b;!cfH+B%Oe3qOFo+AP+nOCW-=M%jWb3S%vLmS&D*K zn{IBtc@wlGJjz!asLWEDs||#DWb8?85Jta6OZeY`!u&KF22j#12WxmYHGxuakQTCTv)F3oWj;D;j--$oeTA~FA#PwhTG8a7%JCi2brqXv$#tncj z$;<$1nQCOrDsMl~qSjnDQxH*-{sIe>^7e83H23k1n^Z-yyql%Y~dle*$WUn{)Va7eJ8$QicK%+3KQc? zy28Z#;#Rnr0Vdgg;`5YvtCOmc;AXRvs*&K`O(dw@@Ys=&vSTGCAL={1xk}dvcxH`& zXVeI2VU78gAK1A`0WU*93x=69imQc(*I!rL4{oKWp!;P|UogDH_=C?;Ncfj+{Xuz| z*$59Nfs`cl`mvG|g-LpalqR*;eyrqtBjOB5^k}y1*t7FlZQB7!xeH|{HUyQ?mzly! z@GM~^c(FK%#rIYqW>VOH*QahWdBjr_3^UgcvY zKH!~t#r=yHRB{&X^|V0R_WQkL z&+bnNB4M#|K_4sOTCnW(OKs5qSP6KH#|q;kS+&HSF=U)vP_aoW3RO%@2o<**6zWY$ z;vESmnJr0@#Jeg^a&1NchzAgeQ}tM|t)2LV& z286a90_8Rk)HFe$Og=%qEmWO9%DJwaLLx_+pS#)P{VQs-#O7uc`jOGlpPNydgp6L3 zminEM5g#i$HC|g$t??dFnr1V^UjkSyU;_nFGLZq!jgSY96gR=(h!-bg&q|JdU)hJq z!evB?X9WB@G2$KpkhoNwH<3)ylN7ei*F5pd^%k}*Qtkz`(w7c&j3JqqOa>0%EDGBG z50C3+Hc*f&B2lrmb6yY9E5{CxPvTV7|E(}@4k{Kq1)_R6*4fj%BsZ8pihDFe+ESt4 zX^XBK^-UJ&bkMid1i5shzFGe!QO2~Y@}w&xblWJ_bmdw34vVSR>U$SEG0XB?x1a)PV5AFziv(bch1OKC(%25CL1jcw=U zQ4$x*l(r}8)ba6h=B_Pi` zsKL%VoRjAm0(x^ymBUxFrcK-pIht=hMMXkK?ySc1B+&OZPg2I7=1I!vwIS=K(CZ~a z6m@kq(sn2b4l0&(7Mx1Co-H`NIbCpk2#T{5^%f;s;Y}J1JcNm&w2;CG@Lr`IpkM=? zb=QiER9V%5e$VM5_84}$P$D^9Pz{to5-f_E2wFwRTjF#HpIr2quu86D zWbWBjh9SAeZqdZ)5;uuNtk~&-qLwDISkrTjqVUihLrxYB&*{QQ5{{*vE;;yIrwd=% zNP0d)caWKQ)L6(_SZeGP%gEWImMIV00Jr>bHPq2lG$*&2jGe>QB|@z*mh|DO>!mK^ z6@5o(*V6%PsFM*cdH~yS)o8vHan5GNG4l_z{e#W?^q3RX$^6MO>`NoTk1B_93W@Ye zjy!OQubd|`?B61xohZ?RVPEVcRE@)NTLW#h%!M&TfQ)sUNWV-i4J*o+oh&CtP;0K6 zVV@{*4f{-44~BhVgSR|O)1K3IaGsl%5>V=i0&u|$%(8AbdP^KX1>v5cr{2wZ8C~oa zsIWa|85X|+dnNJDt%AR1Sw4cz2BiEv&J?Eg<15%aEReVde}mS>P`N zeZdfO(APK?V;SfRhL?2<@W{OmZUOnE9o{XTLQ=xsn_FPm|1^P=IQbgHEr6cOmYpPG zGc_P7e}?QV7PXlSNc3fPg@9)YE8rOw0$M1n&VWSsX4XjXtQra4T_ZsYYbAM98wgk68t%ta8;}!tri-(P}Alfs`fIPdG zk|5=jAX5H}UUCAJ@tF$6Z)UH4DmcV9y>g&#p_z)uN0KCZf}mm!KrUxh%wRDJP;tBS zHcKpP8sH?e*G`heEkLEr?%E_7i#_T~s6agyY^!I&C^TY_Hwc`gXWIr^BmPF9m0GAJ zh`VA20HbY*fZ4!76fR#^$v*OGj;#Tum%7y;(YH zb@Ch=O9x5|DU1LH295?4Y`9^OE>a}XHK{{`#IgqH_beSl{8rOh2V2wigrHBQ=;Aqd2Bx_)=l*ru}^J63Q0^i7qzwUR%r)VuJc zmHsLo_0j4U0e+4X;Bk6Igtrp}SkiZ=w?Td75%^iBKT1DWsPEFxmFl)f;pg%4b~V2N z(e`7M3Y4Bb7C%R;m(b5~0z6K?_l9^oL4YOwd3qbv$KDt}>-0V7=L&US`nghFa})eL zUf!kxsb|ZCTbrW@*x~aMues8XBfjqZV zw^GOB_XKq!cyJqaTXj2idvym@Qg>8$QYWc9tGlR^)m>Ge>Q|?zQ`HK!QVpon)SxP> zimIxb8dAe*M2)JtI$f<&XQ(sPS?X@;?rODKqt>c*YQ5T^&Q|BBjp`oio@$fYthT7F zYMVM&ZC7JzhdNK4uP#s*s*BXU)J}D8wM*ScHPn4oQ|$&_<7z^+)E>20?Ne=aF(8-V z-=vyS)A*gi@2t91&8d!>R|{&tI-m}!L+Y@)Ox;giuI`WYn}Y8rGH)KBu22s|sRyYC ztB0tEs)wnEgDY36M}T)!*Q3;iPXio`Z(lyym|sK{=4w^ zDp34H^(6IV{60lJ)#3Nm>S^HlHR|bx@6SMvXX4+p)U(xd)N|GI)bqig7pNDi7pWJk zm#CMjm#LQ{{T1q!>Q(C1>NQAxE&gTo*Xz{l)fn#pZ>#T^)bHZ=d+Ph@2kM9FN9xDw zC+er_XX@wb7wVVlSL)YDJr@#jWGqqC#wqm_jMwMHux=^)jry(n9gno%t3Rkesz0ee ztG}qfs=ukftAD6}s((Sqv<`HrBYlKEQXi#{*2m~$^$qk5^^Nq6^-c6~`lkA3`sVr; z`j+}u`gnbUK2hIV-$vh7-%j6N-$9r39rc~`N&3$EF8XABSKX)k^(p#Py+W_l1Nt=R zsj{xkIUS`XZBdFZ}M*_tv}geRM+; zZsOj3byM%w<9Y(`KgVdjUCc+)VlBN#@74QsTVJd%(TNtD)K-5@>1j=PX7nsDJOQPT zjxoq+z7+76qKBTw@HySfc<$(VeG|2y|6N9NqAmAg?B;39{rZ4Ds1NDG`Z9e#eYw8B zet^D0KTtnNKUhCRKU6%PfufT>U)# zeEkCCexZJmezAUueyM($emUM>fq$>muhOs9uR&QFd#}~6!_$;{y?K8Fe&49ygnVz- zZ^83h8PD7F+x0v2JN3KtyY;n5dk_A-SHDlcUw^=q`=I_1o~G1?&HG32`%%X8G5vA< z3H?d^Dg9~v8I$^1{C-Yu>09>Tl_9>+k6A>hJ0A>mTSJ z>L2MJ>z^S1J+an#6vo?6_0M`5Z%ZF%qATsHBwJV3mFUVd73s>mE7Fx~mDQEBDmhup zs)TgqHnmbGs}id#cdBe%xkvq6|3d$gb&tO)`IY{){*C^v{+<54{)7IbmQ~50v|W|l z40`Sa!=3KgB7aTt^;;=*48~%wT)i%1@c)Lt?yBU^T2>`8H~mHbRm%tzzS}YQH~n}0 z5B*R5FCK#`&_NK;sw51e;D`Y0;NYm>=-`-u#^A9*_87cDaKqq6$oqPA~oh zF1RV)Z-#$24{j0MGPo5=(g-|0H~~*n>O}K?Yy93OxGnPCF1S6Ozp4n&N7NmHQt%aZ z$KY-1PIx~F|Lz>zB{(^_t0~tP^y6tt(RzdMo`Sbi8PAGfWiSw&77PaEpki`Y@mmXq zg5h8!7!B&d>4B_DRt0udvK`Wdtp`hntVyoLuHdP;GM21Jir4=CH&T$S$Il4P3?8G- z0{`w7*cHj$gVlk*B3Tp2YGiG&&hX4#iL5uU{1wQCKvp0h$H=^`;abryDp`M=9h?&+ z>yN8Y7JEPLhh+6}?G0r0(d)Qf{_5lZy1#yoF`B0pHwO0z?ip+fHV0dRt--e7++ce! z7VHSl3(gNN2rdjR3hou`4DKE53hom$g8K$d^x9gp`dBLG{?jxc@s(B|#9OQRb_e6Z zM9>QM1ho3t8|(|(!NtKP!DKKMOk>2%1hc`V!5nM84tSZh`j`(Eg8jh(E`_z_61+5cS@81U6~QZmR|T&QUK6}FcwO-N;0?hWgEs|l4&D;HHF#U__TU}J zziG$%&1BnoN~Ue+yO=>?+c^P4J+bW^Ew&v7mh_#(w)04`=B(4dq@OF)3E1|*wzEfU zJN$MvzX8z|V%vEE8Fh|UU!|Yp1bCb#)UfR^u%tgKwjDwZ+YX_IZD&AiJNFaY4!>Qk z=EJWLXM@iLpAWted@=Y^@a5nu!B>N?1z!)o5qvZFR`BiMJHdB@?*-ov zeh~aH_)+lV;3vUPgP#RI4}KB+GWb>S>)1#H)#KVhtKc;w?BWPD}DS23k7E-CfQ5ZXJ;Pa}95TnIGt~I@~E?ggO2+t1B2{(rK2=5tg3O9#a!mZ)9 z@Z4~FI2P^*&kN7T+Xdl;c)BROSGY60H%jcn?|s4sp6(kqQDQgpjE56pE8G+A4fi2$ zJG?l&B%BPV!s&1(oJIPj;au1W=fef0?hg-y2g5_*;qbEXe&OW?>;3Wjfbfd&f#HL~ z2Zs*{9~wR^e0X?e_=xb4roSi9*BGRZlspP8A^DlZs`@pllz)$r^XTv~;bX(cg^v%P z5MC8NF?>?^!P`sm`!f8#JbXp?%J5Zqdv*941Ai@kUl+bUd;_3wG_W_}_s!v3 z!ncNR3*R2TBYbE0uJGOAwWbH&5h_@Z-5%(D#JwkccR+IaUTy=m=GOf5K5otX!w;A` zeh&Ol`c5xXDdE8fIq!!|&Z};wV8?WG_D;=*!;gTTe-9~fNApL+kA)wPIhfY6p9nu0 zek%NQ_?hst;pf87hhGT47=9`Ia`=_-tKrweuZQ0VzZrfj{C4=A@Vnvn!taMa2!9y< zDEzVE<~L4~o#}GsssG=(d420tzZZPX`jhad;mrJDZMK_Ob5#2HpjeRTp9v__$ofzFZx=nQ3=yuWV zqdP>U=#J5yqLZRKM|X)%j_w-uMg7q!(W%jjXk|1IC6e*q70eyO)1tws995!fREvh9 z;b#|NcJ$hC+6U|1+I^|MuFK?YP7j+_9rOZbQk*r?!jS&@x;(mn^nmD!=z-CLq6bG0i5?m~EP8l!W%P*Xk#LU-&GJ(GzASn<%Dy7jSFem-6}>uo zP4rsUSFej+AH5-ZWAvuz&Cy$;w*uqaqPIuyh~CNi>Rqg_-W^>Vy(fBa^ge_2{rLSr z^ug#u(TAgtL?4Yl7JWSWMD)q%Q_-iR&qSY%J{NsH`a<-@=u6R;qpw6?jlLFr-I0v{ E0X*vGvj6}9 delta 5869 zcmc&$33yaR60W}|AtZ#5KsXXe9IlXan0b@TVE|>la0x3%#B13xKu}zg5Xf@5I=CwC zin{`>AUCKWii$X(aw!r7MMOLRQ4m4A@jylK0Jpl|%VZ{?!pgV4@5@wob#+yD)n9*S z_F>!VZJ2U7@|Rz6P&7UsnAKusb%$%@1-3^T_3B5|U4)L>j>o|zCnl!Jn=<_EE6Qrh zM-49<(YI_=S;c6_;2e9dy`p^dwSkdUqlecFud0+IOIjzm{D!@|J>Yf~$$c4i8&Bo_ zt24E1*DW)d=Z*=*G^Tt=p*>(Y3uV8|v^+Les!=uNz(hR}d z?4>y@LfPY1oLWGB$HL zi&S8>o@>{-Y~Gr~H}!iR7n3fLmY&SUMZtBRJR<~(g&r0T=2 zWl(rKr?4{Xl z%#4h#DXSb(9vEIZv|QiH>y^`c>=Q1JyeYBGsUs>aj3|#|-1vsrvAJEI(AtuM4g&JA?%CS_xvQYiXBG{uP7bJAU z5RqszyhUd#>zXE=E)URsWv{Me0o`HxocIXUdN0qE!(foYQ^>{`F8$v*D!&& z{2rOSq;tG;kbWSaSMzW4$%d@GIW<%~c~b%k ztphZY>!!DDcmUxolpJ3P4lk!pZy}p4xlBztNQxo@brjwCKCivIOxc(!kFmYaC!LOt zvT{R{px?=8vbxyki#R(srYf}6{XQ=jP&u<0!mkO!SL7HQt>!59VHIWBOj?d{`Rv1) zujdxY_x@2P)o4d$q#fuZnPfQdI zQJ_s!NM))*vTO)L!|7%iUMASWS$$TD+svUxhT-Hy*FnQ(xC{#$i9wgDriBgGN9Elx z+^W>-y-=^7FS2-ybGLrEIBElc7=;RN8X;;?LBw!*qcFmel-6($sfUTSGReWMs3tO- zZu6C7ccwnT3X6scnYO~Fnlq!oqV8&;C7tQfj2Z?4-$7{#<-FRwE_%8Cw$YHOvvg|E z*f_pIO)%i{^1E9ypyZ-JY0o}e8WS}q^8?W&9)U2Ohe$SO$=I%Db{tf~iF_N2^HHh9 zM4F_;6fFeNiWnk6*c8hm*_fJRg&km`HP!n4-mF@kFig0SvHZ~vm(X)?8D+dJsr^q(NzNmFPlO(RKn(cLtiX3#w}lV;IunnQDG z9?fTW3+Z0EkM5^Mw3r^CCG;RYL`&&mdW0UOW%L*=r^hKoD`+J>K~K_Cw2D^K8d^*1 z=xKU}*3+}Jfof?ZJx7~pGd)i)&=z`;w$e)!+(s|cc6x@!LGEWVw&!JG7q;(7SYy=kL+`^Z|Wnt$xJvWBP;+@ye(48GTM) z&|z!sOO{{J*Fic$-_W<(xk}(s`i{P*ALvJ3KE#E|2&XcZSC7$g`iW5h2-pxqO(}_* zQ8L9Kl~-F*D~d%UC_iy%j0(;x5u=VjRUor)@vQf8k)+m(1jxfXI>j|XBAQWCx&B?Z zT(xJ6T(>hp9(k*s+`Kz0iLb~`Ze{!S=%CC82F>E+QXb_~!Os-OZxyGzF3!2SIOm0n z(~BZ6O(my6S%22d$oN&~IpY@@4AUYmFtMjg=!ogt_0O$}zD3r5jss-bL* zp|LcMlh>S+*Ty>Xi75PeO!wzK+(r7TCZg9T5QEaxoal-1ENHT{AL#gdCnZQZ$i;1x z2SNF$Lu>&YXo%RZFwyFSi@~699EnuJ(pd;S2|(R20lJlQ+|J5OEXjVm($B6(Vj+qm zkT{Lan16Iy>v4E#6BCCPuA*T0d#5v=5jKp%81ujjAN)8Q#ps6a=z()^E_&h*IFBj% z0$hlT(2FxyQhGrj#rEk;u_vTw zJ(;r9EE#G)(|wInI-&M6+pGOzBE4ap>|hUIu1A*{ekPJVCpN&L7(-j#g@qntjWojj?X zJY{Vg%3HW#5h+^5>&oG%R>TiX{lLiAWSpMUrSH zl7k{eG#4#IsxW)!Oz_01H$@c^|4%&8QnV7SMH`VO>Ukn`dOVSCrO3@}@Msj)&J-Xf z;Cjf6Jz4(~D1Hkuq>HU+E82+&V#p9bPYjvjETL$@F4_x|E;_L6C^`v63!N>UqJ=Ec zMMRQ9ww1%K^<8+9CLH?9@6nm*!ZY$H{ZjYkh+L5;@ Date: Sat, 7 Sep 2024 17:54:12 +0800 Subject: [PATCH 078/232] chore: delete old unlit_opaque material --- materials/unlit_opaque.mat | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 materials/unlit_opaque.mat diff --git a/materials/unlit_opaque.mat b/materials/unlit_opaque.mat deleted file mode 100644 index a322a468..00000000 --- a/materials/unlit_opaque.mat +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4abb9e737d20956cced366af6a54dd31ab17cc8d0d1773f02c57a5712760fe10 -size 7385 From aecde97200b8edb0061d37dac4b32426b56774bf Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 7 Sep 2024 17:54:42 +0800 Subject: [PATCH 079/232] feat: add removeStencilHighlight, queuePositionUpdateFromViewportCoords to ThermionViewer --- .../lib/thermion_dart/thermion_viewer.dart | 27 ++++++++++---- .../thermion_dart/thermion_viewer_ffi.dart | 36 ++++++++++++++++--- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index fbde2d28..1cb115a2 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -203,10 +203,11 @@ abstract class ThermionViewer { /// If you want to be able to call [createInstance] at a later time, you must pass true for [keepData]. /// If [keepData] is false, the source glTF data will be released and [createInstance] will throw an exception. /// - Future loadGlb(String path, {int numInstances = 1, bool keepData = false}); + Future loadGlb(String path, + {int numInstances = 1, bool keepData = false}); /// - /// Create a new instance of [entity]. + /// Create a new instance of [entity]. /// Future createInstance(ThermionEntity entity); @@ -224,7 +225,7 @@ abstract class ThermionViewer { /// Load the .gltf asset at the given path and insert into the scene. /// [relativeResourcePath] is the folder path where the glTF resources are stored; /// this is usually the parent directory of the .gltf file itself. - /// + /// /// See [loadGlb] for an explanation of [keepData]. /// Future loadGltf(String path, String relativeResourcePath, @@ -609,12 +610,20 @@ abstract class ThermionViewer { ThermionEntity entity, double x, double y, double z, {bool relative = false}); + /// + /// TODO + /// + Future queuePositionUpdateFromViewportCoords( + ThermionEntity entity, double x, double y); + /// /// TODO /// Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, double viewportX, double viewportY, double x, double y, double z); + + /// /// Queues an update to the worldspace rotation for [entity]. /// The actual update will occur on the next frame, and will be subject to collision detection. @@ -818,7 +827,13 @@ abstract class ThermionViewer { Future setGizmoVisibility(bool visible); /// - /// Outlines [entity]. - /// - Future setStencilHighlight(ThermionEntity entity); + /// Renders an outline around [entity] with the given color. + /// + Future setStencilHighlight(ThermionEntity entity, + {double r = 1.0, double g = 0.0, double b = 0.0}); + + /// + /// Removes the outline around [entity]. Noop if there was no highlight. + /// + Future removeStencilHighlight(ThermionEntity entity); } diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index ed48c139..47f0a526 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -444,8 +444,8 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("Not yet implemented"); } final pathPtr = path.toNativeUtf8(allocator: allocator).cast(); - var entity = await withIntCallback((callback) => - load_glb_ffi(_sceneManager!, pathPtr, numInstances, keepData, callback)); + var entity = await withIntCallback((callback) => load_glb_ffi( + _sceneManager!, pathPtr, numInstances, keepData, callback)); allocator.free(pathPtr); if (entity == _FILAMENT_ASSET_ERROR) { throw Exception("An error occurred loading the asset at $path"); @@ -1334,6 +1334,9 @@ class ThermionViewerFFI extends ThermionViewer { set_scale(_sceneManager!, entity, scale); } + /// + /// + /// Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion rotation, {bool relative = false}) async { queue_rotation_update(_sceneManager!, entity, rotation.radians, rotation.x, @@ -1361,6 +1364,18 @@ class ThermionViewerFFI extends ThermionViewer { queue_position_update(_sceneManager!, entity, x, y, z, relative); } + /// + /// Queues an update to the worldspace position for [entity] to the viewport coordinates {x,y}. + /// The actual update will occur on the next frame, and will be subject to collision detection. + /// + Future queuePositionUpdateFromViewportCoords( + ThermionEntity entity, double x, double y) async { + queue_position_update_from_viewport_coords(_sceneManager!, entity, x, y); + } + + /// + /// + /// Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, double viewportX, double viewportY, double x, double y, double z) async { queue_relative_position_update_world_axis( @@ -1742,7 +1757,7 @@ class ThermionViewerFFI extends ThermionViewer { } var entity = await withIntCallback((callback) => create_geometry_ffi( - _viewer!, + _sceneManager!, vertexPtr, vertices.length, indicesPtr, @@ -1830,7 +1845,18 @@ class ThermionViewerFFI extends ThermionViewer { set_gizmo_visibility(_sceneManager!, visible); } - Future setStencilHighlight(ThermionEntity entity) async { - set_stencil_highlight(_sceneManager!, entity); + /// + /// + /// + Future setStencilHighlight(ThermionEntity entity, + {double r = 1.0, double g = 0.0, double b = 0.0}) async { + set_stencil_highlight(_sceneManager!, entity, r, g, b); + } + + /// + /// + /// + Future removeStencilHighlight(ThermionEntity entity) async { + remove_stencil_highlight(_sceneManager!, entity); } } From b2ae8135c6f390da2467f4fa1a8222b3e3f686cf Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 7 Sep 2024 17:55:40 +0800 Subject: [PATCH 080/232] feat: add removeStencilHighlight, accept color param for setStencilHighlight, queuePositionUpdateFromViewportCoords to ThermionDartApi --- thermion_dart/native/include/ThermionDartApi.h | 6 ++++-- thermion_dart/native/include/ThermionDartFFIApi.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 6e2044fe..7189694b 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -198,6 +198,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void transform_to_unit_cube(void *sceneManager, EntityId asset); EMSCRIPTEN_KEEPALIVE void queue_position_update(void *sceneManager, EntityId entity, float x, float y, float z, bool relative); EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(void *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z); + EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(void *sceneManager, EntityId entity, float viewportX, float viewportY); EMSCRIPTEN_KEEPALIVE void queue_rotation_update(void *sceneManager, EntityId entity, float rads, float x, float y, float z, float w, bool relative); EMSCRIPTEN_KEEPALIVE void set_position(void *sceneManager, EntityId entity, float x, float y, float z); EMSCRIPTEN_KEEPALIVE void set_rotation(void *sceneManager, EntityId entity, float rads, float x, float y, float z, float w); @@ -248,7 +249,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE bool add_animation_component(void *const sceneManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE void remove_animation_component(void *const sceneManager, EntityId entityId); - EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const viewer, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath); + EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath); EMSCRIPTEN_KEEPALIVE EntityId get_parent(void *const sceneManager, EntityId child); EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling); EMSCRIPTEN_KEEPALIVE void test_collisions(void *const sceneManager, EntityId entity); @@ -259,7 +260,8 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled); EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)); EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible); - EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entity); + EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entity, float r, float g, float b); + EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entity); #ifdef __cplusplus } diff --git a/thermion_dart/native/include/ThermionDartFFIApi.h b/thermion_dart/native/include/ThermionDartFFIApi.h index a61cd6c9..c851a7eb 100644 --- a/thermion_dart/native/include/ThermionDartFFIApi.h +++ b/thermion_dart/native/include/ThermionDartFFIApi.h @@ -102,7 +102,7 @@ extern "C" void (*callback)(bool)); EMSCRIPTEN_KEEPALIVE void set_post_processing_ffi(void *const viewer, bool enabled); EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_ffi(void *const sceneManager, EntityId entityId, void(*callback)()); - EMSCRIPTEN_KEEPALIVE void create_geometry_ffi(void *const viewer, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void create_geometry_ffi(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath, void (*callback)(EntityId)); #ifdef __cplusplus } From 4c6c20f3de17ae69e0ed74a4fe649d2b49849ccd Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 7 Sep 2024 17:57:38 +0800 Subject: [PATCH 081/232] feat: move HighlightOverlay to nested class, move createGeometry to SceneManager, add queueRelativePositionUpdateFromViewportVector --- .../native/include/CustomGeometry.hpp | 46 +++++ thermion_dart/native/include/SceneManager.hpp | 92 ++++++++- thermion_dart/native/src/CustomGeometry.cpp | 92 +++++++++ thermion_dart/native/src/HighlightOverlay.cpp | 183 ++++++++++++++++++ thermion_dart/native/src/SceneManager.cpp | 130 +++++++++++-- 5 files changed, 523 insertions(+), 20 deletions(-) create mode 100644 thermion_dart/native/include/CustomGeometry.hpp create mode 100644 thermion_dart/native/src/CustomGeometry.cpp create mode 100644 thermion_dart/native/src/HighlightOverlay.cpp diff --git a/thermion_dart/native/include/CustomGeometry.hpp b/thermion_dart/native/include/CustomGeometry.hpp new file mode 100644 index 00000000..4fac5264 --- /dev/null +++ b/thermion_dart/native/include/CustomGeometry.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace thermion_filament +{ + + using namespace filament; + +// CustomGeometry.h +class CustomGeometry { +public: + CustomGeometry(float* vertices, uint32_t numVertices, uint16_t* indices, uint32_t numIndices, RenderableManager::PrimitiveType primitiveType, Engine* engine); + ~CustomGeometry(); + + void computeBoundingBox(); + VertexBuffer* vertexBuffer(); + IndexBuffer* indexBuffer(); + Box getBoundingBox() const; + + float* vertices; + uint32_t numVertices; + uint16_t* indices; + uint32_t numIndices; + Box boundingBox; + RenderableManager::PrimitiveType primitiveType; + +private: + Engine* _engine; + bool _vertexBufferFreed = false; + bool _indexBufferFreed = false; + +}; + + + +} \ No newline at end of file diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 14742178..9626f543 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -16,10 +16,13 @@ #include #include +#include #include "material/gizmo.h" -#include "utils/NameComponentManager.h" + +#include "CustomGeometry.hpp" #include "Gizmo.hpp" + #include "GridOverlay.hpp" #include "ResourceBuffer.hpp" #include "components/CollisionComponentManager.hpp" @@ -46,10 +49,33 @@ namespace thermion_filament const ResourceLoaderWrapperImpl *const loader, Engine *engine, Scene *scene, - Scene *highlightScene, const char *uberArchivePath); ~SceneManager(); + class HighlightOverlay { + public: + HighlightOverlay(EntityId id, SceneManager* const sceneManager, Engine* const engine, float r, float g, float b); + ~HighlightOverlay(); + + bool isValid() { + return !_entity.isNull(); + } + + private: + MaterialInstance* _highlightMaterialInstance; + CustomGeometry* _newGeometry; + FilamentInstance* _newInstance; + Entity _entity; + Engine* const _engine; + SceneManager* const _sceneManager; + }; + + //// + /// @brief Load the glTF file from the specified path and adds all entities to the scene. + /// @param uri the path to the asset. Should be either asset:// (representing a Flutter asset), or file:// (representing a filesystem file). + /// @param relativeResourcePath the (relative) path to the asset's resources. + /// @return the glTF entity. + /// EntityId loadGltf(const char *uri, const char *relativeResourcePath, bool keepData = false); //// @@ -77,6 +103,7 @@ namespace thermion_filament void queuePositionUpdate(EntityId e, float x, float y, float z, bool relative); void queueRotationUpdate(EntityId e, float rads, float x, float y, float z, float w, bool relative); void queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z); + void queueRelativePositionUpdateFromViewportVector(EntityId entityId, float viewportCoordX, float viewportCoordY); const utils::Entity *getCameraEntities(EntityId e); size_t getCameraEntityCount(EntityId e); const utils::Entity *getLightEntities(EntityId e) noexcept; @@ -158,7 +185,15 @@ namespace thermion_filament bool addAnimationComponent(EntityId entity); void removeAnimationComponent(EntityId entity); - void setStencilHighlight(EntityId entity); + /// @brief renders an outline around the specified entity. + /// + /// + void setStencilHighlight(EntityId entity, float r, float g, float b); + + /// @brief removes the outline around the specified entity. + /// + /// + void removeStencilHighlight(EntityId entity); /// @brief returns the number of instances of the FilamentAsset represented by the given entity. /// @param entityId @@ -188,16 +223,56 @@ namespace thermion_filament /// void setLayerEnabled(int layer, bool enabled); + /// + /// Creates an entity with the specified geometry/material and adds to the scene. + /// If [keepData] is true, stores + /// + EntityId createGeometry( + float *vertices, + uint32_t numVertices, + uint16_t *indices, + uint32_t numIndices, + filament::RenderableManager::PrimitiveType primitiveType = RenderableManager::PrimitiveType::TRIANGLES, + const char *materialPath = nullptr, + bool keepData = false + ); + friend class FilamentViewer; Gizmo* gizmo = nullptr; + gltfio::MaterialProvider * const unlitMaterialProvider() { + return _unlitMaterialProvider; + } + + bool isGeometryEntity(EntityId entity) { + return _geometry.find(entity) != _geometry.end(); + } + + CustomGeometry* const getGeometry(EntityId entityId) { + return _geometry[entityId]; + } + + Scene* const getScene() { + return _scene; + } + + bool isGltfAsset(EntityId entity) { + return getAssetByEntityId(entity) != nullptr; + } + + gltfio::FilamentInstance *getInstanceByEntityId(EntityId entityId); + gltfio::FilamentAsset *getAssetByEntityId(EntityId entityId); + + gltfio::FilamentInstance *createGltfAssetInstance(FilamentAsset* asset) { + return _assetLoader->createInstance(asset); + } + private: gltfio::AssetLoader *_assetLoader = nullptr; const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; Engine *_engine = nullptr; Scene *_scene = nullptr; - Scene *_highlightScene = nullptr; View* _view = nullptr; gltfio::MaterialProvider *_ubershaderProvider = nullptr; @@ -214,19 +289,20 @@ namespace thermion_filament gltfio::FilamentInstance *> _instances; tsl::robin_map _assets; + tsl::robin_map _geometry; + tsl::robin_map _highlighted; + tsl::robin_map> _transformUpdates; AnimationComponentManager *_animationComponentManager = nullptr; CollisionComponentManager *_collisionComponentManager = nullptr; - gltfio::FilamentInstance *getInstanceByEntityId(EntityId entityId); - gltfio::FilamentAsset *getAssetByEntityId(EntityId entityId); - utils::Entity findEntityByName( const gltfio::FilamentInstance *instance, const char *entityName); - GridOverlay* _gridOverlay = nullptr; + GridOverlay* _gridOverlay = nullptr; + }; } diff --git a/thermion_dart/native/src/CustomGeometry.cpp b/thermion_dart/native/src/CustomGeometry.cpp new file mode 100644 index 00000000..a8799de5 --- /dev/null +++ b/thermion_dart/native/src/CustomGeometry.cpp @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include +#include + +#include "CustomGeometry.hpp" + +namespace thermion_filament { + +using namespace filament; + +CustomGeometry::CustomGeometry( + float* vertices, + uint32_t numVertices, + uint16_t* indices, + uint32_t numIndices, + RenderableManager::PrimitiveType primitiveType, + Engine* engine) + : numVertices(numVertices), numIndices(numIndices), _engine(engine) { + this->primitiveType = primitiveType; + this->vertices = new float[numVertices]; + std::memcpy(this->vertices, vertices, numVertices * sizeof(float)); + + this->indices = new uint16_t[numIndices]; + std::memcpy(this->indices, indices, numIndices * sizeof(uint16_t)); + + computeBoundingBox(); +} + +IndexBuffer* CustomGeometry::indexBuffer() { + IndexBuffer::BufferDescriptor::Callback indexCallback = [](void *buf, size_t, + void *data) + { + // free((void *)buf); + }; + + auto indexBuffer = IndexBuffer::Builder() + .indexCount(numIndices) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(*_engine); + + indexBuffer->setBuffer(*_engine, IndexBuffer::BufferDescriptor( + this->indices, indexBuffer->getIndexCount() * sizeof(uint16_t), indexCallback)); + return indexBuffer; +} + +VertexBuffer* CustomGeometry::vertexBuffer() { + VertexBuffer::BufferDescriptor::Callback vertexCallback = [](void *buf, size_t, + void *data) + { + // free((void *)buf); + }; + + auto vertexBuffer = VertexBuffer::Builder() + .vertexCount(numVertices) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) + .build(*_engine); + + vertexBuffer->setBufferAt(*_engine, 0, VertexBuffer::BufferDescriptor( + this->vertices, vertexBuffer->getVertexCount() * sizeof(math::float3), vertexCallback)); + return vertexBuffer; +} + +CustomGeometry::~CustomGeometry() { + delete[] vertices; + delete[] indices; +} + +void CustomGeometry::computeBoundingBox() { + float minX = FLT_MAX, minY = FLT_MAX, minZ = FLT_MAX; + float maxX = -FLT_MAX, maxY = -FLT_MAX, maxZ = -FLT_MAX; + + for (uint32_t i = 0; i < numVertices; i += 3) { + minX = std::min(vertices[i], minX); + minY = std::min(vertices[i + 1], minY); + minZ = std::min(vertices[i + 2], minZ); + maxX = std::max(vertices[i], maxX); + maxY = std::max(vertices[i + 1], maxY); + maxZ = std::max(vertices[i + 2], maxZ); + } + + boundingBox = Box{{minX, minY, minZ}, {maxX, maxY, maxZ}}; +} + +Box CustomGeometry::getBoundingBox() const { + return boundingBox; +} + +} \ No newline at end of file diff --git a/thermion_dart/native/src/HighlightOverlay.cpp b/thermion_dart/native/src/HighlightOverlay.cpp new file mode 100644 index 00000000..2d6ffe6b --- /dev/null +++ b/thermion_dart/native/src/HighlightOverlay.cpp @@ -0,0 +1,183 @@ +#include +#include + +#include "SceneManager.hpp" + +namespace thermion_filament { + + SceneManager::HighlightOverlay::HighlightOverlay( + EntityId entityId, + SceneManager* const sceneManager, + Engine* engine, + float r, + float g, + float b) : _sceneManager(sceneManager), _engine(engine) { + + auto& rm = engine->getRenderableManager(); + + auto& tm = engine->getTransformManager(); + + // Create the outline/highlight material instance + filament::gltfio::MaterialKey dummyKey; // We're not using the key for this simple material + filament::gltfio::UvMap dummyUvMap; // We're not using UV mapping for this simple material + + auto materialProvider = sceneManager->unlitMaterialProvider(); + + _highlightMaterialInstance = materialProvider->createMaterialInstance(&dummyKey, &dummyUvMap); + + _highlightMaterialInstance->setStencilOpStencilFail(filament::backend::StencilOperation::KEEP); + _highlightMaterialInstance->setStencilOpDepthFail(filament::backend::StencilOperation::KEEP); + _highlightMaterialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::KEEP); + _highlightMaterialInstance->setStencilCompareFunction(filament::backend::SamplerCompareFunc::NE); + _highlightMaterialInstance->setStencilReferenceValue(1); + _highlightMaterialInstance->setParameter("color", filament::math::float3 { r, g, b }); + _highlightMaterialInstance->setParameter("scale", 1.05f); + + auto scene = sceneManager->getScene(); + + if(sceneManager->isGeometryEntity(entityId)) { + + auto geometryEntity = Entity::import(entityId); + auto renderable = rm.getInstance(geometryEntity); + + auto materialInstance = rm.getMaterialInstanceAt(renderable, 0); + + // set stencil write on the existing material + materialInstance->setStencilWrite(true); + materialInstance->setDepthWrite(true); + materialInstance->setStencilReferenceValue(1); + materialInstance->setStencilOpStencilFail(filament::backend::StencilOperation::KEEP); + materialInstance->setStencilOpDepthFail(filament::backend::StencilOperation::REPLACE); + materialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::REPLACE); + materialInstance->setStencilCompareFunction(filament::backend::SamplerCompareFunc::A); + + auto geometry = sceneManager->getGeometry(entityId); + + _entity = utils::EntityManager::get().create(); + RenderableManager::Builder builder(1); + builder.boundingBox(geometry->getBoundingBox()) + .geometry(0, geometry->primitiveType, geometry->vertexBuffer(), geometry->indexBuffer(), 0, geometry->numIndices) + .culling(true) + .material(0, _highlightMaterialInstance) + .receiveShadows(false) + .castShadows(false); + + builder.build(*engine, _entity); + + scene->addEntity(_entity); + auto outlineTransformInstance = tm.getInstance(_entity); + auto entityTransformInstance = tm.getInstance(geometryEntity); + tm.setParent(outlineTransformInstance, entityTransformInstance); + return; + } + + Log("Not geometry"); + + if(sceneManager->isGltfAsset(entityId)) { + + auto *asset = sceneManager->getAssetByEntityId(entityId); + + if (asset) + { + + Log("Found glTF FilamentAsset with %d material instances", asset->getInstance()->getMaterialInstanceCount()); + + + auto materialInstance = asset->getInstance()->getMaterialInstances()[0]; + + // set stencil write on the existing material + materialInstance->setStencilWrite(true); + materialInstance->setDepthWrite(true); + materialInstance->setStencilReferenceValue(1); + materialInstance->setStencilOpStencilFail(filament::backend::StencilOperation::KEEP); + materialInstance->setStencilOpDepthFail(filament::backend::StencilOperation::REPLACE); + materialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::REPLACE); + materialInstance->setStencilCompareFunction(filament::backend::SamplerCompareFunc::A); + + auto newInstance = sceneManager->createGltfAssetInstance(asset); + + _entity = newInstance->getRoot(); + + if(!newInstance) { + Log("Couldn't create new instance"); + } else { + auto& tm = engine->getTransformManager(); + for(int i = 0; i < newInstance->getEntityCount(); i++) { + auto entity = newInstance->getEntities()[i]; + auto renderableInstance = rm.getInstance(entity); + rm.setPriority(renderableInstance, 7); + if(renderableInstance.isValid()) { + for(int primitiveIndex = 0; primitiveIndex < rm.getPrimitiveCount(renderableInstance); primitiveIndex++) { + rm.setMaterialInstanceAt(renderableInstance, primitiveIndex, _highlightMaterialInstance); + } + } else { + Log("Not renderable, ignoring"); + } + } + scene->addEntities(newInstance->getEntities(), newInstance->getEntityCount()); + } + return; + } else { + Log("Not FilamentAsset"); + } + } + + Log("Looking for parent"); + + auto renderable = rm.getInstance(Entity::import(entityId)); + auto transformInstance = tm.getInstance(Entity::import(entityId)); + if(!transformInstance.isValid()) { + Log("Unknown entity type"); + return; + } + + Entity parent; + while(true) { + auto newParent = tm.getParent(transformInstance); + if(newParent.isNull()) { + break; + } + parent = newParent; + transformInstance = tm.getInstance(parent); + } + if(parent.isNull()) { + Log("Unknown entity type"); + return; + } + + sceneManager->setStencilHighlight(Entity::smuggle(parent), r, g, b); +} + +SceneManager::HighlightOverlay::~HighlightOverlay() { + Log("DEsturctor called!"); + if (_entity.isNull()) { + return; + } + + auto& rm = _engine->getRenderableManager(); + auto& tm = _engine->getTransformManager(); + + _sceneManager->getScene()->remove(_entity); + + + // If this was a glTF asset instance, we need to destroy it + if (_newInstance) { + for(int i =0 ; i < _newInstance->getEntityCount(); i++) { + auto entity =_newInstance->getEntities()[i]; + _sceneManager->getScene()->remove(entity); + rm.destroy(entity); + } + } + + tm.destroy(_entity); + + _engine->destroy(_highlightMaterialInstance); + + // Destroy the entity + utils::EntityManager::get().destroy(_entity); + + + } + + +} \ No newline at end of file diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 16b05fa5..ec9a7e1b 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -20,7 +20,7 @@ #include #include #include - +#include #include #include "material/FileMaterialProvider.hpp" @@ -30,8 +30,7 @@ #include "StreamBufferAdapter.hpp" #include "Log.hpp" #include "SceneManager.hpp" - -#include "gltfio/materials/uberarchive.h" +#include "CustomGeometry.hpp" extern "C" { @@ -52,13 +51,11 @@ namespace thermion_filament const ResourceLoaderWrapperImpl *const resourceLoaderWrapper, Engine *engine, Scene *scene, - Scene *highlightScene, const char *uberArchivePath) : _view(view), _resourceLoaderWrapper(resourceLoaderWrapper), _engine(engine), - _scene(scene), - _highlightScene(highlightScene) + _scene(scene) { _stbDecoder = createStbProvider(_engine); @@ -112,11 +109,9 @@ namespace thermion_filament SceneManager::~SceneManager() { - - destroyAll(); - - gizmo->destroy(); + delete gizmo; _gridOverlay->destroy(); + destroyAll(); _gltfResourceLoader->asyncCancelLoad(); _ubershaderProvider->destroyMaterials(); @@ -1830,6 +1825,55 @@ namespace thermion_filament tm.setTransform(transformInstance, newTransform); } +void SceneManager::queueRelativePositionUpdateFromViewportVector(EntityId entityId, float viewportCoordX, float viewportCoordY) +{ + // Get the camera and viewport + const auto &camera = _view->getCamera(); + const auto &vp = _view->getViewport(); + + // Convert viewport coordinates to NDC space + float ndcX = (2.0f * viewportCoordX) / vp.width - 1.0f; + float ndcY = 1.0f - (2.0f * viewportCoordY) / vp.height; + + Log("ndc X ndcY %f %f", ndcX, ndcY ); + // Get the current position of the entity + auto &tm = _engine->getTransformManager(); + auto entity = Entity::import(entityId); + auto transformInstance = tm.getInstance(entity); + auto currentTransform = tm.getTransform(transformInstance); + + // get entity model origin in camera space + auto entityPositionInCameraSpace = camera.getViewMatrix() * currentTransform * filament::math::float4 { 0.0f, 0.0f, 0.0f, 1.0f }; + // get entity model origin in clip space + auto entityPositionInClipSpace = camera.getProjectionMatrix() * entityPositionInCameraSpace; + auto entityPositionInNdcSpace = entityPositionInClipSpace / entityPositionInClipSpace.w; + + Log("entityPositionInCameraSpace %f %f %f %f", entityPositionInCameraSpace.x, entityPositionInCameraSpace.y, entityPositionInCameraSpace.z, entityPositionInCameraSpace.w); + Log("entityPositionInClipSpace %f %f %f %f", entityPositionInClipSpace.x, entityPositionInClipSpace.y, entityPositionInClipSpace.z, entityPositionInClipSpace.w); + Log("entityPositionInNdcSpace %f %f %f %f", entityPositionInNdcSpace.x, entityPositionInNdcSpace.y, entityPositionInNdcSpace.z, entityPositionInNdcSpace.w); + + // Viewport coords in NDC space (use entity position in camera space Z to project onto near plane) + math::float4 ndcNearPlanePos = {ndcX, ndcY, -1.0f, 1.0f}; + math::float4 ndcFarPlanePos = {ndcX, ndcY, 0.99f, 1.0f}; + math::float4 ndcEntityPlanePos = {ndcX, ndcY, entityPositionInNdcSpace.z, 1.0f}; + + // Get viewport coords in clip space + math::float4 nearPlaneInClipSpace = Camera::inverseProjection(camera.getProjectionMatrix()) * ndcNearPlanePos; + auto nearPlaneInCameraSpace = nearPlaneInClipSpace / nearPlaneInClipSpace.w; + math::float4 farPlaneInClipSpace = Camera::inverseProjection(camera.getProjectionMatrix()) * ndcFarPlanePos; + auto farPlaneInCameraSpace = farPlaneInClipSpace / farPlaneInClipSpace.w; + math::float4 entityPlaneInClipSpace = Camera::inverseProjection(camera.getProjectionMatrix()) * ndcEntityPlanePos; + auto entityPlaneInCameraSpace = entityPlaneInClipSpace / entityPlaneInClipSpace.w; + auto entityPlaneInWorldSpace = camera.getModelMatrix() * entityPlaneInCameraSpace; + + Log("nearPlaneInClipSpace %f %f %f %f",nearPlaneInClipSpace.x, nearPlaneInClipSpace.y, nearPlaneInClipSpace.z, nearPlaneInClipSpace.w); + Log("nearPlaneInCameraSpace %f %f %f %f",nearPlaneInCameraSpace.x, nearPlaneInCameraSpace.y, nearPlaneInCameraSpace.z, nearPlaneInCameraSpace.w); + Log("entityPlaneInCameraSpace %f %f %f %f",entityPlaneInCameraSpace.x, entityPlaneInCameraSpace.y, entityPlaneInCameraSpace.z, entityPlaneInCameraSpace.w); + Log("entityPlaneInWorldSpace %f %f %f %f",entityPlaneInWorldSpace.x, entityPlaneInWorldSpace.y, entityPlaneInWorldSpace.z, entityPlaneInWorldSpace.w); + + // Queue the position update (as a relative movement) + queuePositionUpdate(entityId, entityPlaneInWorldSpace.x, entityPlaneInWorldSpace.y, entityPlaneInWorldSpace.z, false); +} void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z) { auto worldAxis = math::float3{x, y, z}; @@ -2212,7 +2256,6 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v return; } rm.setPriority(renderableInstance, priority); - Log("Set instance renderable priority to %d", priority); } Aabb2 SceneManager::getBoundingBox(EntityId entityId) @@ -2292,8 +2335,71 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v _view->setLayerEnabled(layer, enabled); } - + void SceneManager::removeStencilHighlight(EntityId entityId) { + auto found = _highlighted.find(entityId); + if(found == _highlighted.end()) { + return; + } + delete found->second; + _highlighted.erase(entityId); + } + + void SceneManager::setStencilHighlight(EntityId entityId, float r, float g, float b) { + + auto highlightEntity = new HighlightOverlay(entityId, this, _engine, r, g, b); + + if(!highlightEntity->isValid()) { + delete highlightEntity; + } else { + _highlighted.emplace(entityId, highlightEntity); + } } + EntityId SceneManager::createGeometry( + float *vertices, + uint32_t numVertices, + uint16_t *indices, + uint32_t numIndices, + RenderableManager::PrimitiveType primitiveType, + const char *materialPath, + bool keepData + ) { + + auto geometry = new CustomGeometry(vertices, numVertices, indices, numIndices, primitiveType, _engine); + + filament::Material* mat = nullptr; + if (materialPath) { + auto matData = _resourceLoaderWrapper->load(materialPath); + mat = Material::Builder().package(matData.data, matData.size).build(*_engine); + _resourceLoaderWrapper->free(matData); + } + + auto renderable = utils::EntityManager::get().create(); + RenderableManager::Builder builder(1); + + builder.boundingBox(geometry->getBoundingBox()) + .geometry(0, primitiveType, geometry->vertexBuffer(), geometry->indexBuffer(), 0, numIndices) + .culling(true) + .receiveShadows(false) + .castShadows(false); + + if (mat) { + builder.material(0, mat->getDefaultInstance()); + } + + builder.build(*_engine, renderable); + + _scene->addEntity(renderable); + + auto entityId = Entity::smuggle(renderable); + + _geometry.emplace(entityId, geometry); + + return entityId; + } + } // namespace thermion_filament + + + \ No newline at end of file From c2eb28a8f59de7b59a43f9eed93796bd12ce223b Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 7 Sep 2024 17:59:03 +0800 Subject: [PATCH 082/232] fix: properly destroy entities/material/etc in Gizmo on destruction, remove custom scene creation logic --- thermion_dart/native/include/Gizmo.hpp | 1 - thermion_dart/native/src/Gizmo.cpp | 53 ++++++-------------------- 2 files changed, 12 insertions(+), 42 deletions(-) diff --git a/thermion_dart/native/include/Gizmo.hpp b/thermion_dart/native/include/Gizmo.hpp index 21b5127b..ec3c9376 100644 --- a/thermion_dart/native/include/Gizmo.hpp +++ b/thermion_dart/native/include/Gizmo.hpp @@ -62,7 +62,6 @@ class Gizmo { Gizmo(Engine& engine, View *view, Scene *scene); ~Gizmo(); - void destroy(); Entity x() { return _entities[0]; }; diff --git a/thermion_dart/native/src/Gizmo.cpp b/thermion_dart/native/src/Gizmo.cpp index 260659e3..65080fa3 100644 --- a/thermion_dart/native/src/Gizmo.cpp +++ b/thermion_dart/native/src/Gizmo.cpp @@ -16,23 +16,11 @@ using namespace filament::gltfio; Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) { - if(scene) { - _scene = scene; - _view = view; - _camera = &(_view->getCamera()); - } else { - _scene = _engine.createScene(); - _view = _engine.createView(); - _view->setBlendMode(BlendMode::TRANSLUCENT); - - utils::Entity camera = EntityManager::get().create(); - _camera = engine.createCamera(camera); - _camera->setProjection(Camera::Projection::ORTHO, -1.0, 1.0, -1.0, 1.0, 1.0, 5.0); - _view->setScene(_scene); - _view->setCamera(_camera); - - } - + + _scene = scene; + _view = view; + _camera = &(_view->getCamera()); + auto &entityManager = EntityManager::get(); auto &transformManager = engine.getTransformManager(); @@ -208,18 +196,17 @@ Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) Gizmo::~Gizmo() { _scene->removeEntities(_entities, 7); - for(int i = 0; i < 7; i++) { - _engine.destroy(_materialInstances[i]); - } - _engine.destroy(_material); + for(int i = 0; i < 7; i++) { _engine.destroy(_entities[i]); } - _view->setScene(nullptr); - _engine.destroy(_scene); - _engine.destroy(_view); - + for(int i = 0; i < 7; i++) { + _engine.destroy(_materialInstances[i]); + } + + _engine.destroy(_material); + } void Gizmo::createTransparentRectangles() @@ -343,22 +330,6 @@ void Gizmo::unhighlight() { } } -void Gizmo::destroy() -{ - auto& rm = _engine.getRenderableManager(); - auto& tm = _engine.getTransformManager(); - - for (int i = 0; i < 4; i++) - { - rm.destroy(_entities[i]); - tm.destroy(_entities[i]); - _engine.destroy(_entities[i]); - _engine.destroy(_materialInstances[i]); - } - - _engine.destroy(_material); -} - void Gizmo::pick(uint32_t x, uint32_t y, void (*callback)(EntityId entityId, int x, int y)) { auto handler = new Gizmo::PickCallbackHandler(this, callback); From a00fdbe042a4ee97f022951e5380a6c119d54bee Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 7 Sep 2024 17:59:55 +0800 Subject: [PATCH 083/232] chore: remove createGeometry method from FilamentViewer, set default view blend mode --- .../native/include/FilamentViewer.hpp | 4 +- thermion_dart/native/src/FilamentViewer.cpp | 90 ++----------------- 2 files changed, 10 insertions(+), 84 deletions(-) diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index 1065e836..461f975b 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -163,8 +163,6 @@ namespace thermion_filament void setShadowType(ShadowType shadowType); void setSoftShadowOptions( float penumbraScale, float penumbraRatioScale); - EntityId createGeometry(float *vertices, uint32_t numVertices, uint16_t *indices, uint32_t numIndices, filament::RenderableManager::PrimitiveType primitiveType = RenderableManager::PrimitiveType::TRIANGLES, const char *materialPath = nullptr); - SceneManager *const getSceneManager() { return (SceneManager *const)_sceneManager; @@ -174,7 +172,7 @@ namespace thermion_filament const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; void* _context = nullptr; Scene *_scene = nullptr; - Scene *_highlightScene = nullptr; + View *_view = nullptr; Engine *_engine = nullptr; diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index d264ff95..b8ec4f93 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -159,13 +159,13 @@ namespace thermion_filament setFrameInterval(_frameInterval); _scene = _engine->createScene(); - _highlightScene = _engine->createScene(); utils::Entity camera = EntityManager::get().create(); _mainCamera = _engine->createCamera(camera); _view = _engine->createView(); + _view->setBlendMode(filament::View::BlendMode::TRANSLUCENT); _view->setStencilBufferEnabled(true); setToneMapping(ToneMapping::ACES); @@ -205,7 +205,6 @@ namespace thermion_filament _resourceLoaderWrapper, _engine, _scene, - _highlightScene, uberArchivePath); } @@ -624,8 +623,6 @@ namespace thermion_filament string resourcePathString(resourcePath); - Log("Setting background image to %s", resourcePath); - clearBackgroundImage(); loadTextureFromPath(resourcePathString); @@ -1132,8 +1129,6 @@ namespace thermion_filament removeIbl(); if (iblPath) { - Log("Loading IBL from %s", iblPath); - // Load IBL. ResourceBuffer iblBuffer = _resourceLoaderWrapper->load(iblPath); // because this will go out of scope before the texture callback is invoked, we need to make a copy to the heap @@ -1182,6 +1177,11 @@ namespace thermion_filament void *data) { + if (!_view || !_swapChain) + { + return; + } + auto now = std::chrono::high_resolution_clock::now(); auto secsSinceLastFpsCheck = float(std::chrono::duration_cast(now - _fpsCounterStartTime).count()); @@ -1221,12 +1221,6 @@ namespace thermion_filament _renderer->render(_view); - _view->setScene(_highlightScene); - - _renderer->render(_view); - - _view->setScene(_scene); - _frameCount++; if (_recording) @@ -1301,10 +1295,9 @@ namespace thermion_filament Texture::Format::RGBA, Texture::Type::UBYTE, dispatcher, callback, userData); _renderer->beginFrame(_swapChain, 0); + _renderer->render(_view); - _view->setScene(_highlightScene); - _renderer->render(_view); - _view->setScene(_scene); + if (_rt) { _renderer->readPixels(_rt, 0, 0, vp.width, vp.height, std::move(pbd)); @@ -1673,71 +1666,6 @@ namespace thermion_filament }); } - EntityId FilamentViewer::createGeometry(float *vertices, uint32_t numVertices, uint16_t *indices, uint32_t numIndices, RenderableManager::PrimitiveType primitiveType, const char *materialPath) - { - - float *verticesCopy = (float *)malloc(numVertices * sizeof(float)); - memcpy(verticesCopy, vertices, numVertices * sizeof(float)); - VertexBuffer::BufferDescriptor::Callback vertexCallback = [](void *buf, size_t, - void *data) - { - free((void *)buf); - }; - - uint16_t *indicesCopy = (uint16_t *)malloc(numIndices * sizeof(uint16_t)); - memcpy(indicesCopy, indices, numIndices * sizeof(uint16_t)); - IndexBuffer::BufferDescriptor::Callback indexCallback = [](void *buf, size_t, - void *data) - { - free((void *)buf); - }; - - auto vb = VertexBuffer::Builder().vertexCount(numVertices).bufferCount(1).attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3).build(*_engine); - - vb->setBufferAt(*_engine, 0, VertexBuffer::BufferDescriptor(verticesCopy, vb->getVertexCount() * sizeof(filament::math::float3), 0, vertexCallback)); - - auto ib = IndexBuffer::Builder().indexCount(numIndices).bufferType(IndexBuffer::IndexType::USHORT).build(*_engine); - ib->setBuffer(*_engine, IndexBuffer::BufferDescriptor(indicesCopy, ib->getIndexCount() * sizeof(uint16_t), 0, indexCallback)); - - filament::Material *mat = nullptr; - if (materialPath) - { - auto matData = _resourceLoaderWrapper->load(materialPath); - mat = Material::Builder().package(matData.data, matData.size).build(*_engine); - _resourceLoaderWrapper->free(matData); - } - - float minX, minY, minZ = 0.0f; - float maxX, maxY, maxZ = 0.0f; - - for (int i = 0; i < numVertices; i += 3) - { - minX = std::min(vertices[i], minX); - minY = std::min(vertices[i + 1], minY); - minZ = std::min(vertices[i + 2], minZ); - maxX = std::max(vertices[i], maxX); - maxY = std::max(vertices[i + 1], maxY); - maxZ = std::max(vertices[i + 2], maxZ); - } - - auto renderable = utils::EntityManager::get().create(); - RenderableManager::Builder builder = RenderableManager::Builder(1); - builder - .boundingBox({{minX, minY, minZ}, {maxX, maxY, maxZ}}) - .geometry(0, primitiveType, - vb, ib, 0, numIndices) - .culling(false) - .receiveShadows(false) - .castShadows(false); - if (mat) - { - builder.material(0, mat->getDefaultInstance()).build(*_engine, renderable); - } - auto result = builder.build(*_engine, renderable); - - _scene->addEntity(renderable); - - return Entity::smuggle(renderable); - } + } // namespace thermion_filament From ee24fca20ed2c4b827e171abe9320df1408b40f5 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 7 Sep 2024 18:00:50 +0800 Subject: [PATCH 084/232] feat: move createGeometry to SceneManager, add queueRelativePositionUpdateFromViewportVector and removeStencilHighlight --- thermion_dart/native/src/ThermionDartApi.cpp | 22 ++++++++++++++----- .../native/src/ThermionDartFFIApi.cpp | 4 ++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 48cf4602..866d3ea5 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -745,6 +745,10 @@ extern "C" ((SceneManager *)sceneManager)->queueRotationUpdate(asset, rads, x, y, z, w, relative); } + EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(void *sceneManager, EntityId entity, float viewportX, float viewportY) { + ((SceneManager *)sceneManager)->queueRelativePositionUpdateFromViewportVector(entity, viewportX, viewportY); + } + EMSCRIPTEN_KEEPALIVE void stop_animation(void *sceneManager, EntityId asset, int index) { ((SceneManager *)sceneManager)->stopAnimation(asset, index); @@ -825,9 +829,15 @@ extern "C" ((SceneManager *)sceneManager)->removeAnimationComponent(entityId); } - EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const viewer, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) + EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) { - return ((FilamentViewer *)viewer)->createGeometry(vertices, (uint32_t)numVertices, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, materialPath); + return ((SceneManager *)sceneManager)->createGeometry( + vertices, + (uint32_t)numVertices, + indices, + numIndices, + (filament::RenderableManager::PrimitiveType)primitiveType, + materialPath); } EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(void *const sceneManager, const EntityId parent, const char *name) @@ -893,10 +903,12 @@ extern "C" ((SceneManager*)sceneManager)->gizmo->setVisibility(visible); } - EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entityId) { - ((SceneManager*)sceneManager)->setStencilHighlight(entityId); + EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entityId, float r, float g, float b) { + ((SceneManager*)sceneManager)->setStencilHighlight(entityId, r, g, b); } - + EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entityId) { + ((SceneManager*)sceneManager)->removeStencilHighlight(entityId); + } } diff --git a/thermion_dart/native/src/ThermionDartFFIApi.cpp b/thermion_dart/native/src/ThermionDartFFIApi.cpp index 3312f7e7..041b45f5 100644 --- a/thermion_dart/native/src/ThermionDartFFIApi.cpp +++ b/thermion_dart/native/src/ThermionDartFFIApi.cpp @@ -859,7 +859,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void create_geometry_ffi( - void *const viewer, + void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, @@ -871,7 +871,7 @@ extern "C" std::packaged_task lambda( [=] { - auto entity = create_geometry(viewer, vertices, numVertices, indices, numIndices, primitiveType, materialPath); + auto entity = create_geometry(sceneManager, vertices, numVertices, indices, numIndices, primitiveType, materialPath); #ifdef __EMSCRIPTEN__ MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0,$1); From 43fc7ffc65b755047d656c8bb622a072f551b720 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 7 Sep 2024 18:01:03 +0800 Subject: [PATCH 085/232] update tests --- thermion_dart/test/helpers.dart | 193 +++++++ thermion_dart/test/integration_test.dart | 622 +++++++++-------------- 2 files changed, 444 insertions(+), 371 deletions(-) create mode 100644 thermion_dart/test/helpers.dart diff --git a/thermion_dart/test/helpers.dart b/thermion_dart/test/helpers.dart new file mode 100644 index 00000000..39b8826d --- /dev/null +++ b/thermion_dart/test/helpers.dart @@ -0,0 +1,193 @@ +import 'dart:io'; + +import 'dart:typed_data'; +import 'package:thermion_dart/thermion_dart.dart'; +import 'package:thermion_dart/thermion_dart/swift/swift_bindings.g.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.dart'; +import 'package:thermion_dart/thermion_dart/utils/dart_resources.dart'; +import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; + +List cubeVertices = [ + // Front face + -1, -1, 1, + 1, -1, 1, + 1, 1, 1, + -1, 1, 1, + + // Back face + -1, -1, -1, + -1, 1, -1, + 1, 1, -1, + 1, -1, -1, + + // Top face + -1, 1, -1, + -1, 1, 1, + 1, 1, 1, + 1, 1, -1, + + // Bottom face + -1, -1, -1, + 1, -1, -1, + 1, -1, 1, + -1, -1, 1, + + // Right face + 1, -1, -1, + 1, 1, -1, + 1, 1, 1, + 1, -1, 1, + + // Left face + -1, -1, -1, + -1, -1, 1, + -1, 1, 1, + -1, 1, -1, +]; + +// Define the indices for the cube +List cubeIndices = [ + // Front face + 0, 3, 2, 0, 2, 1, + // Back face + 4, 7, 6, 4, 6, 5, + // Top face + 8, 11, 10, 8, 10, 9, + // Bottom face + 12, 15, 14, 12, 14, 13, + // Right face + 16, 19, 18, 16, 18, 17, + // Left face + 20, 23, 22, 20, 22, 21 +]; + +final viewportDimensions = (width: 500, height: 500); + + +/// Test files are run in a variety of ways, find this package root in all. +/// +/// Test files can be run from source from any working directory. The Dart SDK +/// `tools/test.py` runs them from the root of the SDK for example. +/// +/// Test files can be run from dill from the root of package. `package:test` +/// does this. +Uri findPackageRoot(String packageName) { + final script = Platform.script; + final fileName = script.name; + if (fileName.endsWith('_test.dart')) { + // We're likely running from source. + var directory = script.resolve('.'); + while (true) { + final dirName = directory.name; + if (dirName == packageName) { + return directory; + } + final parent = directory.resolve('..'); + if (parent == directory) break; + directory = parent; + } + } else if (fileName.endsWith('.dill')) { + final cwd = Directory.current.uri; + final dirName = cwd.name; + if (dirName == packageName) { + return cwd; + } + } + throw StateError("Could not find package root for package '$packageName'. " + 'Tried finding the package root via Platform.script ' + "'${Platform.script.toFilePath()}' and Directory.current " + "'${Directory.current.uri.toFilePath()}'."); +} + +extension on Uri { + String get name => pathSegments.where((e) => e != '').last; +} + +late String testDir; + +Future pixelBufferToBmp( + Uint8List pixelBuffer, int width, int height, String outputPath) async { + // BMP file header (14 bytes) + final fileHeader = ByteData(14); + fileHeader.setUint16(0, 0x4D42, Endian.little); // 'BM' + final fileSize = 54 + width * height * 3; // 54 bytes header + RGB data + fileHeader.setUint32(2, fileSize, Endian.little); + fileHeader.setUint32(10, 54, Endian.little); // Offset to pixel data + + // BMP info header (40 bytes) + final infoHeader = ByteData(40); + infoHeader.setUint32(0, 40, Endian.little); // Info header size + infoHeader.setInt32(4, width, Endian.little); + infoHeader.setInt32(8, -height, Endian.little); // Negative for top-down + infoHeader.setUint16(12, 1, Endian.little); // Number of color planes + infoHeader.setUint16(14, 24, Endian.little); // Bits per pixel (RGB) + infoHeader.setUint32(16, 0, Endian.little); // No compression + infoHeader.setUint32(20, width * height * 3, Endian.little); // Image size + infoHeader.setInt32(24, 2835, Endian.little); // X pixels per meter + infoHeader.setInt32(28, 2835, Endian.little); // Y pixels per meter + + // Calculate row size and padding + final rowSize = (width * 3 + 3) & ~3; + final padding = rowSize - (width * 3); + + // Pixel data (BMP stores in BGR format) + final bmpData = Uint8List(rowSize * height); + for (var y = 0; y < height; y++) { + for (var x = 0; x < width; x++) { + final srcIndex = (y * width + x) * 4; // RGBA format + final dstIndex = y * rowSize + x * 3; // BGR format + bmpData[dstIndex] = pixelBuffer[srcIndex + 2]; // Blue + bmpData[dstIndex + 1] = pixelBuffer[srcIndex + 1]; // Green + bmpData[dstIndex + 2] = pixelBuffer[srcIndex]; // Red + // Alpha channel is discarded + } + // Add padding to the end of each row + for (var p = 0; p < padding; p++) { + bmpData[y * rowSize + width * 3 + p] = 0; + } + } + + // Write BMP file + final file = File(outputPath); + final sink = file.openWrite(); + sink.add(fileHeader.buffer.asUint8List()); + sink.add(infoHeader.buffer.asUint8List()); + sink.add(bmpData); + await sink.close(); + + print('BMP image saved to: $outputPath'); +} + +Future createViewer() async { + + final packageUri = findPackageRoot('thermion_dart'); + + final lib = ThermionDartTexture1(DynamicLibrary.open( + '${packageUri.toFilePath()}/native/lib/macos/swift/libthermion_swift.dylib')); + final object = ThermionDartTexture.new1(lib); + object.initWithWidth_height_( + viewportDimensions.width, viewportDimensions.height); + + final resourceLoader = calloc(1); + var loadToOut = NativeCallable< + Void Function(Pointer, + Pointer)>.listener(DartResourceLoader.loadResource); + + resourceLoader.ref.loadToOut = loadToOut.nativeFunction; + var freeResource = NativeCallable.listener( + DartResourceLoader.freeResource); + resourceLoader.ref.freeResource = freeResource.nativeFunction; + + var viewer = ThermionViewerFFI(resourceLoader: resourceLoader.cast()); + + await viewer.initialized; + await viewer.createSwapChain(viewportDimensions.width.toDouble(), + viewportDimensions.height.toDouble()); + await viewer.createRenderTarget(viewportDimensions.width.toDouble(), + viewportDimensions.height.toDouble(), object.metalTextureAddress); + await viewer.updateViewportAndCameraProjection( + viewportDimensions.width.toDouble(), + viewportDimensions.height.toDouble()); + return viewer; +} diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index fafdb5b5..9889b62a 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -1,148 +1,24 @@ import 'dart:io'; import 'dart:math'; -import 'dart:typed_data'; import 'package:thermion_dart/thermion_dart.dart'; -import 'package:thermion_dart/thermion_dart/swift/swift_bindings.g.dart'; -import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.dart'; -import 'package:thermion_dart/thermion_dart/utils/dart_resources.dart'; -import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; import 'package:test/test.dart'; import 'package:animation_tools_dart/animation_tools_dart.dart'; import 'package:path/path.dart' as p; import 'package:vector_math/vector_math_64.dart'; -/// Test files are run in a variety of ways, find this package root in all. -/// -/// Test files can be run from source from any working directory. The Dart SDK -/// `tools/test.py` runs them from the root of the SDK for example. -/// -/// Test files can be run from dill from the root of package. `package:test` -/// does this. -Uri findPackageRoot(String packageName) { - final script = Platform.script; - final fileName = script.name; - if (fileName.endsWith('_test.dart')) { - // We're likely running from source. - var directory = script.resolve('.'); - while (true) { - final dirName = directory.name; - if (dirName == packageName) { - return directory; - } - final parent = directory.resolve('..'); - if (parent == directory) break; - directory = parent; - } - } else if (fileName.endsWith('.dill')) { - final cwd = Directory.current.uri; - final dirName = cwd.name; - if (dirName == packageName) { - return cwd; - } - } - throw StateError("Could not find package root for package '$packageName'. " - 'Tried finding the package root via Platform.script ' - "'${Platform.script.toFilePath()}' and Directory.current " - "'${Directory.current.uri.toFilePath()}'."); -} +import 'helpers.dart'; -extension on Uri { - String get name => pathSegments.where((e) => e != '').last; -} - -late String testDir; - -Future pixelBufferToBmp( - Uint8List pixelBuffer, int width, int height, String outputPath) async { - // BMP file header (14 bytes) - final fileHeader = ByteData(14); - fileHeader.setUint16(0, 0x4D42, Endian.little); // 'BM' - final fileSize = 54 + width * height * 3; // 54 bytes header + RGB data - fileHeader.setUint32(2, fileSize, Endian.little); - fileHeader.setUint32(10, 54, Endian.little); // Offset to pixel data - - // BMP info header (40 bytes) - final infoHeader = ByteData(40); - infoHeader.setUint32(0, 40, Endian.little); // Info header size - infoHeader.setInt32(4, width, Endian.little); - infoHeader.setInt32(8, -height, Endian.little); // Negative for top-down - infoHeader.setUint16(12, 1, Endian.little); // Number of color planes - infoHeader.setUint16(14, 24, Endian.little); // Bits per pixel (RGB) - infoHeader.setUint32(16, 0, Endian.little); // No compression - infoHeader.setUint32(20, width * height * 3, Endian.little); // Image size - infoHeader.setInt32(24, 2835, Endian.little); // X pixels per meter - infoHeader.setInt32(28, 2835, Endian.little); // Y pixels per meter - - // Calculate row size and padding - final rowSize = (width * 3 + 3) & ~3; - final padding = rowSize - (width * 3); - - // Pixel data (BMP stores in BGR format) - final bmpData = Uint8List(rowSize * height); - for (var y = 0; y < height; y++) { - for (var x = 0; x < width; x++) { - final srcIndex = (y * width + x) * 4; // RGBA format - final dstIndex = y * rowSize + x * 3; // BGR format - bmpData[dstIndex] = pixelBuffer[srcIndex + 2]; // Blue - bmpData[dstIndex + 1] = pixelBuffer[srcIndex + 1]; // Green - bmpData[dstIndex + 2] = pixelBuffer[srcIndex]; // Red - // Alpha channel is discarded - } - // Add padding to the end of each row - for (var p = 0; p < padding; p++) { - bmpData[y * rowSize + width * 3 + p] = 0; - } - } - - // Write BMP file - final file = File(outputPath); - final sink = file.openWrite(); - sink.add(fileHeader.buffer.asUint8List()); - sink.add(infoHeader.buffer.asUint8List()); - sink.add(bmpData); - await sink.close(); - - print('BMP image saved to: $outputPath'); -} - -final viewportDimensions = (width: 500, height: 500); void main() async { final packageUri = findPackageRoot('thermion_dart'); testDir = Directory("${packageUri.toFilePath()}/test").path; - final lib = ThermionDartTexture1(DynamicLibrary.open( - '${packageUri.toFilePath()}/native/lib/macos/swift/libthermion_swift.dylib')); - final object = ThermionDartTexture.new1(lib); - object.initWithWidth_height_( - viewportDimensions.width, viewportDimensions.height); - - final resourceLoader = calloc(1); - var loadToOut = NativeCallable< - Void Function(Pointer, - Pointer)>.listener(DartResourceLoader.loadResource); - - resourceLoader.ref.loadToOut = loadToOut.nativeFunction; - var freeResource = NativeCallable.listener( - DartResourceLoader.freeResource); - resourceLoader.ref.freeResource = freeResource.nativeFunction; - - var viewer = ThermionViewerFFI(resourceLoader: resourceLoader.cast()); - - await viewer.initialized; - await viewer.createSwapChain(viewportDimensions.width.toDouble(), - viewportDimensions.height.toDouble()); - await viewer.createRenderTarget(viewportDimensions.width.toDouble(), - viewportDimensions.height.toDouble(), object.metalTextureAddress); - await viewer.updateViewportAndCameraProjection( - viewportDimensions.width.toDouble(), - viewportDimensions.height.toDouble()); var outDir = Directory("$testDir/output"); // outDir.deleteSync(recursive: true); outDir.createSync(); - Future _capture(String outputFilename) async { + Future _capture(ThermionViewer viewer, String outputFilename) async { var outPath = p.join(outDir.path, "$outputFilename.bmp"); var pixelBuffer = await viewer.capture(); await pixelBufferToBmp(pixelBuffer, viewportDimensions.width, @@ -151,303 +27,307 @@ void main() async { group('background', () { test('set background color to solid green', () async { - await viewer.setRendering(true); + var viewer = await createViewer(); await viewer.setBackgroundColor(0.0, 1.0, 0.0, 1.0); - await _capture("bgcolor"); - await viewer.setRendering(false); + await _capture(viewer, "bgcolor"); + await viewer.dispose(); }); test('load skybox', () async { - var outDir = Directory("$testDir/skybox"); - outDir.createSync(); - await viewer.setRendering(true); + var viewer = await createViewer(); await viewer.loadSkybox( "file:///$testDir/../../examples/assets/default_env/default_env_skybox.ktx"); await Future.delayed(Duration(seconds: 1)); - await _capture("skybox"); - await viewer.setRendering(false); + await _capture(viewer, "skybox"); }); }); group("gltf", () { test('load glb', () async { + var viewer = await createViewer(); var model = await viewer.loadGlb("$testDir/cube.glb"); await viewer.transformToUnitCube(model); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); await viewer.setCameraPosition(0, 1, 5); await viewer .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - await viewer.setRendering(true); - await _capture("load_glb"); - await viewer.setRendering(false); - }); - - test('create instance from glb when keepData is true', () async { - var model = await viewer.loadGlb("$testDir/cube.glb", keepData: true); - await viewer.transformToUnitCube(model); - var instance = await viewer.createInstance(model); - await viewer.setPosition(instance, 0.5, 0.5, -0.5); - await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); - await viewer.setCameraPosition(0, 1, 5); - await viewer - .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - await viewer.setRendering(true); - await _capture("glb_create_instance"); - await viewer.setRendering(false); - }); - - test('create instance from glb fails when keepData is false', () async { - var model = await viewer.loadGlb("$testDir/cube.glb", keepData: false); - bool thrown = false; - try { - await viewer.createInstance(model); - } catch (err) { - thrown = true; - } - expect(thrown, true); + await _capture(viewer, "load_glb"); }); }); - group('Skinning & animations', () { - test('get bone names', () async { - var model = await viewer.loadGlb("$testDir/assets/shapes.glb"); - var names = await viewer.getBoneNames(model); - expect(names.first, "Bone"); - }); + // test('create instance from glb when keepData is true', () async { + // var model = await viewer.loadGlb("$testDir/cube.glb", keepData: true); + // await viewer.transformToUnitCube(model); + // var instance = await viewer.createInstance(model); + // await viewer.setPosition(instance, 0.5, 0.5, -0.5); + // await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); + // await viewer.setCameraPosition(0, 1, 5); + // await viewer + // .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + // await viewer.setRendering(true); + // await _capture(viewer, "glb_create_instance"); + // await viewer.setRendering(false); + // }); - test('reset bones', () async { - var model = await viewer.loadGlb("$testDir/assets/shapes.glb"); - await viewer.resetBones(model); - }); - test('set from BVH', () async { - var model = await viewer.loadGlb("$testDir/assets/shapes.glb"); - var animation = BVHParser.parse( - File("$testDir/assets/animation.bvh").readAsStringSync(), - boneRegex: RegExp(r"Bone$")); - await viewer.addBoneAnimation(model, animation); - }); + // test('create instance from glb fails when keepData is false', () async { + // var model = await viewer.loadGlb("$testDir/cube.glb", keepData: false); + // bool thrown = false; + // try { + // await viewer.createInstance(model); + // } catch (err) { + // thrown = true; + // } + // expect(thrown, true); + // }); + // }); - test('fade in/out', () async { - var model = await viewer.loadGlb("$testDir/assets/shapes.glb"); - var animation = BVHParser.parse( - File("$testDir/assets/animation.bvh").readAsStringSync(), - boneRegex: RegExp(r"Bone$")); - await viewer.addBoneAnimation(model, animation, - fadeInInSecs: 0.5, fadeOutInSecs: 0.5); - await Future.delayed(Duration(seconds: 1)); - }); + // group('Skinning & animations', () { + // test('get bone names', () async { + // var model = await viewer.loadGlb("$testDir/assets/shapes.glb"); + // var names = await viewer.getBoneNames(model); + // expect(names.first, "Bone"); + // }); - test('create geometry', () async { - // Define the vertices of the cube - List vertices = [ - // Front face - -1, -1, 1, - 1, -1, 1, - 1, 1, 1, - -1, 1, 1, + // test('reset bones', () async { + // var model = await viewer.loadGlb("$testDir/assets/shapes.glb"); + // await viewer.resetBones(model); + // }); + // test('set from BVH', () async { + // var model = await viewer.loadGlb("$testDir/assets/shapes.glb"); + // var animation = BVHParser.parse( + // File("$testDir/assets/animation.bvh").readAsStringSync(), + // boneRegex: RegExp(r"Bone$")); + // await viewer.addBoneAnimation(model, animation); + // }); - // Back face - -1, -1, -1, - -1, 1, -1, - 1, 1, -1, - 1, -1, -1, + // test('fade in/out', () async { + // var model = await viewer.loadGlb("$testDir/assets/shapes.glb"); + // var animation = BVHParser.parse( + // File("$testDir/assets/animation.bvh").readAsStringSync(), + // boneRegex: RegExp(r"Bone$")); + // await viewer.addBoneAnimation(model, animation, + // fadeInInSecs: 0.5, fadeOutInSecs: 0.5); + // await Future.delayed(Duration(seconds: 1)); + // }); - // Top face - -1, 1, -1, - -1, 1, 1, - 1, 1, 1, - 1, 1, -1, - - // Bottom face - -1, -1, -1, - 1, -1, -1, - 1, -1, 1, - -1, -1, 1, - - // Right face - 1, -1, -1, - 1, 1, -1, - 1, 1, 1, - 1, -1, 1, - - // Left face - -1, -1, -1, - -1, -1, 1, - -1, 1, 1, - -1, 1, -1, - ]; - - // Define the indices for the cube - List indices = [ - 0, 1, 2, 0, 2, 3, // Front face - 4, 5, 6, 4, 6, 7, // Back face - 8, 9, 10, 8, 10, 11, // Top face - 12, 13, 14, 12, 14, 15, // Bottom face - 16, 17, 18, 16, 18, 19, // Right face - 20, 21, 22, 20, 22, 23 // Left face - ]; + group("geometry", () { + test('create custom geometry', () async { + var viewer = await createViewer(); await viewer.createIbl(1.0, 1.0, 1.0, 1000); - await viewer.setCameraPosition(0, 0.5, 6); + await viewer.setCameraPosition(0, 0, 6); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); - await viewer - .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); - await viewer.setRendering(true); - // Create the cube geometry - await viewer.createGeometry(vertices, indices, + await viewer.createGeometry(cubeVertices, cubeIndices, primitiveType: PrimitiveType.TRIANGLES); - await _capture("geometry_cube"); - await viewer.setRendering(false); + await _capture(viewer, "geometry_cube"); }); + }); - test('create sphere', () async { - // Define the parameters for the sphere - int latitudeBands = 30; - int longitudeBands = 30; - double radius = 1.0; - - List vertices = []; - List indices = []; - - // Generate vertices - for (int latNumber = 0; latNumber <= latitudeBands; latNumber++) { - double theta = latNumber * pi / latitudeBands; - double sinTheta = sin(theta); - double cosTheta = cos(theta); - - for (int longNumber = 0; longNumber <= longitudeBands; longNumber++) { - double phi = longNumber * 2 * pi / longitudeBands; - double sinPhi = sin(phi); - double cosPhi = cos(phi); - - double x = cosPhi * sinTheta; - double y = cosTheta; - double z = sinPhi * sinTheta; - - vertices.addAll([radius * x, radius * y, radius * z]); - } - } - - // Generate indices - for (int latNumber = 0; latNumber < latitudeBands; latNumber++) { - for (int longNumber = 0; longNumber < longitudeBands; longNumber++) { - int first = (latNumber * (longitudeBands + 1)) + longNumber; - int second = first + longitudeBands + 1; - - indices.addAll( - [first, second, first + 1, second, second + 1, first + 1]); - } - } - + group("transforms", () { + test('set position based on screenspace coord', () async { + var viewer = await createViewer(); + print(await viewer.getCameraFov(true)); await viewer.createIbl(1.0, 1.0, 1.0, 1000); - await viewer.setCameraPosition(0, 0.5, 10); + await viewer.setCameraPosition(0, 0, 6); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); - await viewer - .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); - await viewer.setRendering(true); + // Create the cube geometry + final cube = await viewer.createGeometry(cubeVertices, cubeIndices, + primitiveType: PrimitiveType.TRIANGLES); + // await viewer.setPosition(cube, -0.05, 0.04, 5.9); + // await viewer.setPosition(cube, -2.54, 2.54, 0); + await viewer.queuePositionUpdateFromViewportCoords(cube, 0, 0); - // Create the sphere geometry - // final sphere = await viewer.createGeometry(vertices, indices, - // primitiveType: PrimitiveType.TRIANGLES); + // we need an explicit render call here to process the transform queue + await viewer.render(); - // await viewer.gizmo!.attach(sphere); - // await viewer.setPosition(sphere, -1.0, 0.0, -10.0); - // await viewer.setRotationQuat( - // sphere, Quaternion.axisAngle(Vector3(1, 0, 0), pi / 8)); - await _capture("geometry_sphere"); - await viewer.setRendering(false); + await _capture(viewer, "set_position_from_viewport_coords"); }); + }); - test('enable grid overlay', () async { - await viewer.setBackgroundColor(0, 0, 0, 1); - await viewer.setCameraPosition(0, 0.5, 0); - await viewer - .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.1)); - await viewer.setRendering(true); - await viewer.setLayerEnabled(2, true); - await _capture("grid"); - await viewer.setRendering(false); - }); + // test('create sphere', () async { + // // Define the parameters for the sphere + // int latitudeBands = 30; + // int longitudeBands = 30; + // double radius = 1.0; - test('point light', () async { - var model = await viewer.loadGlb("$testDir/cube.glb"); - await viewer.transformToUnitCube(model); - var light = await viewer.addLight( - LightType.POINT, 6500, 1000000, 0, 2, 0, 0, -1, 0, - falloffRadius: 10.0); - await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); - await viewer.setCameraPosition(0, 1, 5); - await viewer - .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - await viewer.setRendering(true); - await _capture("point_light"); - await viewer.setRendering(false); - }); + // List vertices = []; + // List indices = []; - test('set point light position', () async { - var model = await viewer.loadGlb("$testDir/cube.glb"); - await viewer.transformToUnitCube(model); - var light = await viewer.addLight( - LightType.POINT, 6500, 1000000, 0, 2, 0, 0, -1, 0, - falloffRadius: 10.0); - await viewer.setLightPosition(light, 0.5, 2, 0); - await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); - await viewer.setCameraPosition(0, 1, 5); - await viewer - .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - await viewer.setRendering(true); - await _capture("move_point_light"); - await viewer.setRendering(false); - }); + // // Generate vertices + // for (int latNumber = 0; latNumber <= latitudeBands; latNumber++) { + // double theta = latNumber * pi / latitudeBands; + // double sinTheta = sin(theta); + // double cosTheta = cos(theta); - test('directional light', () async { - var model = await viewer.loadGlb("$testDir/cube.glb"); - await viewer.transformToUnitCube(model); - var light = await viewer.addLight( - LightType.SUN, 6500, 1000000, 0, 0, 0, 0, -1, 0); - await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); - await viewer.setCameraPosition(0, 1, 5); - await viewer - .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - await viewer.setRendering(true); - await _capture("directional_light"); - await viewer.setRendering(false); - }); + // for (int longNumber = 0; longNumber <= longitudeBands; longNumber++) { + // double phi = longNumber * 2 * pi / longitudeBands; + // double sinPhi = sin(phi); + // double cosPhi = cos(phi); - test('set directional light direction', () async { - var model = await viewer.loadGlb("$testDir/cube.glb"); - await viewer.transformToUnitCube(model); - var light = await viewer.addLight( - LightType.SUN, 6500, 1000000, 0, 0, 0, 0, -1, 0); - await viewer.setLightDirection(light, Vector3(-1, -1, -1)); - await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); - await viewer.setCameraPosition(0, 1, 5); - await viewer - .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - await viewer.setRendering(true); - await _capture("set_directional_light_direction"); - await viewer.setRendering(false); - }); + // double x = cosPhi * sinTheta; + // double y = cosTheta; + // double z = sinPhi * sinTheta; - test('set stencil highlight', () async { - var model = await viewer.loadGlb("$testDir/cube.glb"); - await viewer.transformToUnitCube(model); + // vertices.addAll([radius * x, radius * y, radius * z]); + // } + // } + + // // Generate indices + // for (int latNumber = 0; latNumber < latitudeBands; latNumber++) { + // for (int longNumber = 0; longNumber < longitudeBands; longNumber++) { + // int first = (latNumber * (longitudeBands + 1)) + longNumber; + // int second = first + longitudeBands + 1; + + // indices.addAll( + // [first, second, first + 1, second, second + 1, first + 1]); + // } + // } + + // await viewer.createIbl(1.0, 1.0, 1.0, 1000); + // await viewer.setCameraPosition(0, 0.5, 10); + // await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); + // await viewer + // .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); + // await viewer.setRendering(true); + + // // Create the sphere geometry + // // final sphere = await viewer.createGeometry(vertices, indices, + // // primitiveType: PrimitiveType.TRIANGLES); + + // // await viewer.gizmo!.attach(sphere); + // // await viewer.setPosition(sphere, -1.0, 0.0, -10.0); + // // await viewer.setRotationQuat( + // // sphere, Quaternion.axisAngle(Vector3(1, 0, 0), pi / 8)); + // await _capture(viewer, "geometry_sphere"); + // await viewer.setRendering(false); + // }); + + // test('enable grid overlay', () async { + // await viewer.setBackgroundColor(0, 0, 0, 1); + // await viewer.setCameraPosition(0, 0.5, 0); + // await viewer + // .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.1)); + // await viewer.setRendering(true); + // await viewer.setLayerEnabled(2, true); + // await _capture(viewer, "grid"); + // await viewer.setRendering(false); + // }); + + // test('point light', () async { + // var model = await viewer.loadGlb("$testDir/cube.glb"); + // await viewer.transformToUnitCube(model); + // var light = await viewer.addLight( + // LightType.POINT, 6500, 1000000, 0, 2, 0, 0, -1, 0, + // falloffRadius: 10.0); + // await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); + // await viewer.setCameraPosition(0, 1, 5); + // await viewer + // .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + // await viewer.setRendering(true); + // await _capture(viewer, "point_light"); + // await viewer.setRendering(false); + // }); + + // test('set point light position', () async { + // var model = await viewer.loadGlb("$testDir/cube.glb"); + // await viewer.transformToUnitCube(model); + // var light = await viewer.addLight( + // LightType.POINT, 6500, 1000000, 0, 2, 0, 0, -1, 0, + // falloffRadius: 10.0); + // await viewer.setLightPosition(light, 0.5, 2, 0); + // await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); + // await viewer.setCameraPosition(0, 1, 5); + // await viewer + // .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + // await viewer.setRendering(true); + // await _capture(viewer, "move_point_light"); + // await viewer.setRendering(false); + // }); + + // test('directional light', () async { + // var model = await viewer.loadGlb("$testDir/cube.glb"); + // await viewer.transformToUnitCube(model); + // var light = await viewer.addLight( + // LightType.SUN, 6500, 1000000, 0, 0, 0, 0, -1, 0); + // await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); + // await viewer.setCameraPosition(0, 1, 5); + // await viewer + // .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + // await viewer.setRendering(true); + // await _capture(viewer, "directional_light"); + // await viewer.setRendering(false); + // }); + + // test('set directional light direction', () async { + // var model = await viewer.loadGlb("$testDir/cube.glb"); + // await viewer.transformToUnitCube(model); + // var light = await viewer.addLight( + // LightType.SUN, 6500, 1000000, 0, 0, 0, 0, -1, 0); + // await viewer.setLightDirection(light, Vector3(-1, -1, -1)); + // await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); + // await viewer.setCameraPosition(0, 1, 5); + // await viewer + // .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + // await viewer.setRendering(true); + // await _capture(viewer, "set_directional_light_direction"); + // await viewer.setRendering(false); + // }); + + group("stencil", () { + test('set stencil highlight for glb', () async { + final viewer = await createViewer(); + var model = await viewer.loadGlb("$testDir/cube.glb", keepData: true); await viewer.setPostProcessing(true); var light = await viewer.addLight( LightType.SUN, 6500, 1000000, 0, 0, 0, 0, -1, 0); - await viewer.setLightDirection(light, Vector3(-1, -1, -1)); + await viewer.setLightDirection(light, Vector3(0, 1, -1)); - await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); + await viewer.setBackgroundColor(0.0, 1.0, 0.0, 1.0); + await viewer.setCameraPosition(0, -1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), pi / 8)); + await viewer.setStencilHighlight(model); + await _capture(viewer, "stencil_highlight_glb"); + }); + + test('set stencil highlight for geometry', () async { + var viewer = await createViewer(); + await viewer.setPostProcessing(true); + await viewer.setBackgroundColor(0.0, 1.0, 0.0, 1.0); await viewer.setCameraPosition(0, 1, 5); await viewer .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - await viewer.setStencilHighlight(model); - await viewer.setRendering(true); - await Future.delayed(Duration(milliseconds: 500)); - await _capture("stencil_highlight"); - await viewer.setRendering(false); + + var cube = await viewer.createGeometry(cubeVertices, cubeIndices, + primitiveType: PrimitiveType.TRIANGLES); + await viewer.setStencilHighlight(cube); + + await _capture(viewer, "stencil_highlight_geometry"); + + await viewer.removeStencilHighlight(cube); + + await _capture(viewer, "stencil_highlight_geometry_remove"); + }); + + test('set stencil highlight for multiple geometry ', () async { + var viewer = await createViewer(); + await viewer.setPostProcessing(true); + await viewer.setBackgroundColor(0.0, 1.0, 0.0, 1.0); + await viewer.setCameraPosition(0, 1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + + var cube1 = await viewer.createGeometry(cubeVertices, cubeIndices, + primitiveType: PrimitiveType.TRIANGLES); + var cube2 = await viewer.createGeometry(cubeVertices, cubeIndices, + primitiveType: PrimitiveType.TRIANGLES); + await viewer.setPosition(cube2, 0.5, 0.5, 0); + await viewer.setStencilHighlight(cube1); + await viewer.setStencilHighlight(cube2, r: 0.0, g: 0.0, b: 1.0); + + await _capture(viewer, "stencil_highlight_multiple_geometry"); }); }); } From b0f3c8a087a00c84ca944645f857eeb09c198c95 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 7 Sep 2024 18:01:30 +0800 Subject: [PATCH 086/232] feat: set stencil highlight on gizmo attach --- thermion_dart/lib/thermion_dart/entities/gizmo.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/thermion_dart/lib/thermion_dart/entities/gizmo.dart b/thermion_dart/lib/thermion_dart/entities/gizmo.dart index f474d2df..381fd24a 100644 --- a/thermion_dart/lib/thermion_dart/entities/gizmo.dart +++ b/thermion_dart/lib/thermion_dart/entities/gizmo.dart @@ -86,6 +86,7 @@ class Gizmo extends AbstractGizmo { } Future attach(ThermionEntity entity) async { + print("Attaching"); _activeAxis = null; if (entity == _activeEntity) { return; @@ -95,10 +96,16 @@ class Gizmo extends AbstractGizmo { return; } _visible = true; + + if (_activeEntity != null) { + await _viewer.removeStencilHighlight(_activeEntity!); + } _activeEntity = entity; await _viewer.setGizmoVisibility(true); await _viewer.setParent(center, entity, preserveScaling: true); _boundingBoxController.sink.add(await _viewer.getBoundingBox(x)); + + await _viewer.setStencilHighlight(_activeEntity!); } Future detach() async { From ae5ef2c286134038c43e59b476687a2cf6df71e0 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 7 Sep 2024 18:01:39 +0800 Subject: [PATCH 087/232] update bindings --- .../compatibility/native/thermion_dart.g.dart | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart index b065bfbe..59c96823 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart @@ -671,6 +671,15 @@ external void queue_relative_position_update_world_axis( double z, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float)>() +external void queue_position_update_from_viewport_coords( + ffi.Pointer sceneManager, + int entity, + double viewportX, + double viewportY, +); + @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float, ffi.Float, ffi.Float, ffi.Bool)>() @@ -1019,7 +1028,7 @@ external void remove_animation_component( EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Int, ffi.Pointer, ffi.Int, ffi.Int, ffi.Pointer)>() external int create_geometry( - ffi.Pointer viewer, + ffi.Pointer sceneManager, ffi.Pointer vertices, int numVertices, ffi.Pointer indices, @@ -1116,10 +1125,21 @@ external void set_gizmo_visibility( bool visible, ); -@ffi.Native, EntityId)>() +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>() external void set_stencil_highlight( ffi.Pointer sceneManager, int entity, + double r, + double g, + double b, +); + +@ffi.Native, EntityId)>() +external void remove_stencil_highlight( + ffi.Pointer sceneManager, + int entity, ); @ffi.Native< @@ -1581,7 +1601,7 @@ external void reset_to_rest_pose_ffi( ffi.Pointer, ffi.Pointer>)>() external void create_geometry_ffi( - ffi.Pointer viewer, + ffi.Pointer sceneManager, ffi.Pointer vertices, int numVertices, ffi.Pointer indices, From 5c4d5d4b9d7330f082512b205005b21fb86cd403 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sun, 8 Sep 2024 13:52:04 +0800 Subject: [PATCH 088/232] feat: add getAncestor method --- thermion_dart/native/include/SceneManager.hpp | 1 + .../native/include/ThermionDartApi.h | 1 + thermion_dart/native/src/SceneManager.cpp | 21 +++++++++++++++++-- thermion_dart/native/src/ThermionDartApi.cpp | 4 ++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 9626f543..46924508 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -181,6 +181,7 @@ namespace thermion_filament void addCollisionComponent(EntityId entity, void (*onCollisionCallback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform); void removeCollisionComponent(EntityId entityId); EntityId getParent(EntityId child); + EntityId getAncestor(EntityId child); void setParent(EntityId child, EntityId parent, bool preserveScaling); bool addAnimationComponent(EntityId entity); void removeAnimationComponent(EntityId entity); diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 7189694b..baf56fd3 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -251,6 +251,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath); EMSCRIPTEN_KEEPALIVE EntityId get_parent(void *const sceneManager, EntityId child); + EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child); EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling); EMSCRIPTEN_KEEPALIVE void test_collisions(void *const sceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE void set_priority(void *const sceneManager, EntityId entityId, int priority); diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index ec9a7e1b..3fc08ef4 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -1542,6 +1542,25 @@ namespace thermion_filament return Entity::smuggle(parent); } + EntityId SceneManager::getAncestor(EntityId childEntityId) + { + auto &tm = _engine->getTransformManager(); + const auto child = Entity::import(childEntityId); + auto transformInstance = tm.getInstance(child); + Entity parent; + + while(true) { + auto newParent = tm.getParent(transformInstance); + if(newParent.isNull()) { + break; + } + parent = newParent; + transformInstance = tm.getInstance(parent); + } + + return Entity::smuggle(parent); + } + void SceneManager::setParent(EntityId childEntityId, EntityId parentEntityId, bool preserveScaling) { auto &tm = _engine->getTransformManager(); @@ -1561,8 +1580,6 @@ namespace thermion_filament return; } - Log("Parenting child entity %d to new parent entity %d", childEntityId, parentEntityId); - if (preserveScaling) { auto parentTransform = tm.getWorldTransform(parentInstance); diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 866d3ea5..34f6fa49 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -851,6 +851,10 @@ extern "C" return ((SceneManager *)sceneManager)->getParent(child); } + EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child) { + return ((SceneManager *)sceneManager)->getAncestor(child); + } + EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling) { ((SceneManager *)sceneManager)->setParent(child, parent, preserveScaling); From 476b552fd057a3eb51cd800a2030f25b822a4ce2 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sun, 8 Sep 2024 13:52:33 +0800 Subject: [PATCH 089/232] feat: add getAncestor method --- .../compatibility/native/thermion_dart.g.dart | 6 +++ .../lib/thermion_dart/thermion_viewer.dart | 9 +++- .../thermion_dart/thermion_viewer_ffi.dart | 15 ++++++ thermion_dart/test/integration_test.dart | 46 ++++++++++++++++++- 4 files changed, 73 insertions(+), 3 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart index 59c96823..e23e1663 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart @@ -1043,6 +1043,12 @@ external int get_parent( int child, ); +@ffi.Native, EntityId)>() +external int get_ancestor( + ffi.Pointer sceneManager, + int child, +); + @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, EntityId, ffi.Bool)>() external void set_parent( diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index 1cb115a2..2bb61c00 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -773,9 +773,14 @@ abstract class ThermionViewer { PrimitiveType primitiveType = PrimitiveType.TRIANGLES}); /// - /// Gets the parent transform of [child]. + /// Gets the parent entity of [entity]. Returns null if the entity has no parent. /// - Future getParent(ThermionEntity child); + Future getParent(ThermionEntity entity); + + /// + /// Gets the ancestor (ultimate parent) entity of [entity]. Returns null if the entity has no parent. + /// + Future getAncestor(ThermionEntity entity); /// /// Sets the parent transform of [child] to [parent]. diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index 47f0a526..7123f0a6 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -1805,6 +1805,21 @@ class ThermionViewerFFI extends ThermionViewer { return parent; } + /// + /// + /// + @override + Future getAncestor(ThermionEntity child) async { + if (_sceneManager == null) { + throw Exception("Asset manager must be non-null"); + } + var parent = get_ancestor(_sceneManager!, child); + if (parent == _FILAMENT_ASSET_ERROR) { + return null; + } + return parent; + } + /// /// /// diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index 9889b62a..034a481e 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -124,7 +124,51 @@ void main() async { }); }); - group("transforms", () { + group("transforms & parenting", () { + test('getParent and getAncestor both return null when entity has no parent', () async { + var viewer = await createViewer(); + + final cube = await viewer.createGeometry(cubeVertices, cubeIndices, + primitiveType: PrimitiveType.TRIANGLES); + + expect(await viewer.getParent(cube), isNull); + expect(await viewer.getAncestor(cube), isNull); + }); + + test( + 'getParent returns the parent entity after one has been set via setParent', + () async { + var viewer = await createViewer(); + + final cube1 = await viewer.createGeometry(cubeVertices, cubeIndices, + primitiveType: PrimitiveType.TRIANGLES); + final cube2 = await viewer.createGeometry(cubeVertices, cubeIndices, + primitiveType: PrimitiveType.TRIANGLES); + + await viewer.setParent(cube1, cube2); + + final parent = await viewer.getParent(cube1); + + expect(parent, cube2); + }); + + test('getAncestor returns the ultimate parent entity', () async { + var viewer = await createViewer(); + + final grandparent = await viewer.createGeometry(cubeVertices, cubeIndices, + primitiveType: PrimitiveType.TRIANGLES); + final parent = await viewer.createGeometry(cubeVertices, cubeIndices, + primitiveType: PrimitiveType.TRIANGLES); + final child = await viewer.createGeometry(cubeVertices, cubeIndices, + primitiveType: PrimitiveType.TRIANGLES); + + await viewer.setParent(child, parent); + await viewer.setParent(parent, grandparent); + + expect(await viewer.getAncestor(child), grandparent); + + }); + test('set position based on screenspace coord', () async { var viewer = await createViewer(); print(await viewer.getCameraFov(true)); From 81c27dde9fdb5b264b3d4893c8024970ad0a8e12 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sun, 8 Sep 2024 13:55:25 +0800 Subject: [PATCH 090/232] feat: parent the cloned entity instance when setting stencil highlight --- thermion_dart/native/src/HighlightOverlay.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/thermion_dart/native/src/HighlightOverlay.cpp b/thermion_dart/native/src/HighlightOverlay.cpp index 2d6ffe6b..9e4b5a96 100644 --- a/thermion_dart/native/src/HighlightOverlay.cpp +++ b/thermion_dart/native/src/HighlightOverlay.cpp @@ -71,8 +71,6 @@ namespace thermion_filament { return; } - Log("Not geometry"); - if(sceneManager->isGltfAsset(entityId)) { auto *asset = sceneManager->getAssetByEntityId(entityId); @@ -98,10 +96,13 @@ namespace thermion_filament { _entity = newInstance->getRoot(); + auto newTransformInstance = tm.getInstance(_entity); + + auto entityTransformInstance = tm.getInstance(asset->getRoot()); + tm.setParent(newTransformInstance, entityTransformInstance); if(!newInstance) { Log("Couldn't create new instance"); } else { - auto& tm = engine->getTransformManager(); for(int i = 0; i < newInstance->getEntityCount(); i++) { auto entity = newInstance->getEntities()[i]; auto renderableInstance = rm.getInstance(entity); @@ -149,7 +150,6 @@ namespace thermion_filament { } SceneManager::HighlightOverlay::~HighlightOverlay() { - Log("DEsturctor called!"); if (_entity.isNull()) { return; } From aba3ba24afcecd01beb70daead3deaa68dddbd27 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 17:54:08 +0800 Subject: [PATCH 091/232] (flutter) add CameraOrientationWidget --- .../camera/camera_orientation_widget.dart | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_orientation_widget.dart diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_orientation_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_orientation_widget.dart new file mode 100644 index 00000000..4c052b84 --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_orientation_widget.dart @@ -0,0 +1,94 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:thermion_flutter/thermion_flutter.dart'; +import 'package:vector_math/vector_math_64.dart' as v64; + +class CameraOrientationWidget extends StatefulWidget { + final ThermionViewer viewer; + + const CameraOrientationWidget({Key? key, required this.viewer}) : super(key: key); + + @override + _CameraOrientationWidgetState createState() => _CameraOrientationWidgetState(); +} + +class _CameraOrientationWidgetState extends State with SingleTickerProviderStateMixin { + late AnimationController _controller; + v64.Vector3? _position; + v64.Matrix3? _rotation; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 16), // ~60 FPS + )..repeat(); + + _controller.addListener(_updateCameraInfo); + } + + void _updateCameraInfo() async { + final position = await widget.viewer.getCameraPosition(); + final rotation = await widget.viewer.getCameraRotation(); + setState(() { + _position = position; + _rotation = rotation; + }); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(8.0), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.7), + borderRadius: BorderRadius.circular(8.0), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Position: ${_formatVector(_position)}', + style: const TextStyle(color: Colors.white), + ), + const SizedBox(height: 4), + Text( + 'Rotation: ${_formatMatrix(_rotation)}', + style: const TextStyle(color: Colors.white), + ), + ], + ), + ); + } + + String _formatVector(v64.Vector3? vector) { + if (vector == null) return 'N/A'; + return '(${vector.x.toStringAsFixed(2)}, ${vector.y.toStringAsFixed(2)}, ${vector.z.toStringAsFixed(2)})'; + } + + String _formatMatrix(v64.Matrix3? matrix) { + if (matrix == null) return 'N/A'; + return 'Yaw: ${_getYaw(matrix).toStringAsFixed(2)}°, Pitch: ${_getPitch(matrix).toStringAsFixed(2)}°, Roll: ${_getRoll(matrix).toStringAsFixed(2)}°'; + } + + double _getYaw(v64.Matrix3 matrix) { + return -atan2(matrix[2], matrix[0]) * 180 / pi; + } + + double _getPitch(v64.Matrix3 matrix) { + return -asin(matrix[5]) * 180 / pi; + } + + double _getRoll(v64.Matrix3 matrix) { + return atan2(matrix[3], matrix[4]) * 180 / pi; + } +} \ No newline at end of file From dbbd972909efcf3b103475f390f89602f2d33d4a Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 17:54:21 +0800 Subject: [PATCH 092/232] add GeometryHelper --- .../lib/thermion_dart/geometry_helper.dart | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 thermion_dart/lib/thermion_dart/geometry_helper.dart diff --git a/thermion_dart/lib/thermion_dart/geometry_helper.dart b/thermion_dart/lib/thermion_dart/geometry_helper.dart new file mode 100644 index 00000000..ff4851d7 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/geometry_helper.dart @@ -0,0 +1,145 @@ +import 'dart:math'; + +class Geometry { + final List vertices; + final List indices; + final List normals; + + Geometry(this.vertices, this.indices, this.normals); +} + +class GeometryHelper { + static Geometry sphere() { + int latitudeBands = 20; + int longitudeBands = 20; + + List vertices = []; + List normals = []; + List indices = []; + + for (int latNumber = 0; latNumber <= latitudeBands; latNumber++) { + double theta = latNumber * pi / latitudeBands; + double sinTheta = sin(theta); + double cosTheta = cos(theta); + + for (int longNumber = 0; longNumber <= longitudeBands; longNumber++) { + double phi = longNumber * 2 * pi / longitudeBands; + double sinPhi = sin(phi); + double cosPhi = cos(phi); + + double x = cosPhi * sinTheta; + double y = cosTheta; + double z = sinPhi * sinTheta; + + vertices.addAll([x, y, z]); + normals.addAll([x, y, z]); // For a sphere, normals are the same as vertex positions + } + } + + for (int latNumber = 0; latNumber < latitudeBands; latNumber++) { + for (int longNumber = 0; longNumber < longitudeBands; longNumber++) { + int first = (latNumber * (longitudeBands + 1)) + longNumber; + int second = first + longitudeBands + 1; + + indices.addAll([first, second, first + 1, second, second + 1, first + 1]); + } + } + + return Geometry(vertices, indices, normals); + } + + static Geometry cube() { + final vertices = [ + // Front face + -1, -1, 1, + 1, -1, 1, + 1, 1, 1, + -1, 1, 1, + + // Back face + -1, -1, -1, + -1, 1, -1, + 1, 1, -1, + 1, -1, -1, + + // Top face + -1, 1, -1, + -1, 1, 1, + 1, 1, 1, + 1, 1, -1, + + // Bottom face + -1, -1, -1, + 1, -1, -1, + 1, -1, 1, + -1, -1, 1, + + // Right face + 1, -1, -1, + 1, 1, -1, + 1, 1, 1, + 1, -1, 1, + + // Left face + -1, -1, -1, + -1, -1, 1, + -1, 1, 1, + -1, 1, -1, + ]; + + final normals = [ + // Front face + 0, 0, 1, + 0, 0, 1, + 0, 0, 1, + 0, 0, 1, + + // Back face + 0, 0, -1, + 0, 0, -1, + 0, 0, -1, + 0, 0, -1, + + // Top face + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + + // Bottom face + 0, -1, 0, + 0, -1, 0, + 0, -1, 0, + 0, -1, 0, + + // Right face + 1, 0, 0, + 1, 0, 0, + 1, 0, 0, + 1, 0, 0, + + // Left face + -1, 0, 0, + -1, 0, 0, + -1, 0, 0, + -1, 0, 0, + ]; + + final indices = [ + // Front face + 0, 3, 2, 0, 2, 1, + // Back face + 4, 7, 6, 4, 6, 5, + // Top face + 8, 11, 10, 8, 10, 9, + // Bottom face + 12, 15, 14, 12, 14, 13, + // Right face + 16, 19, 18, 16, 18, 17, + // Left face + 20, 23, 22, 20, 22, 21 + ]; + + return Geometry(vertices, indices, normals); + } +} \ No newline at end of file From 845d5bf2239e0eb5aea2fd2e959af275d37e81b0 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:01:33 +0800 Subject: [PATCH 093/232] (flutter) add const constructor for flutter options --- .../lib/thermion/thermion_flutter_plugin.dart | 21 ++++++++++++------- .../thermion_flutter_platform_interface.dart | 2 ++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart b/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart index 1c536de2..eba560cc 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/thermion_flutter_plugin.dart @@ -67,7 +67,6 @@ class ThermionFlutterPlugin { } _initializing = true; - _viewer = await ThermionFlutterPlatform.instance .createViewer(uberarchivePath: uberArchivePath); _appLifecycleListener = AppLifecycleListener( @@ -82,13 +81,14 @@ class ThermionFlutterPlugin { return _viewer!; } - static Future createViewerWithOptions(ThermionFlutterOptions options) async { + static Future createViewerWithOptions( + {ThermionFlutterOptions options = const ThermionFlutterOptions.empty()}) async { if (_initializing) { throw Exception("Existing call to createViewer has not completed."); } _initializing = true; - _viewer = await ThermionFlutterPlatform.instance - .createViewerWithOptions(options); + _viewer = + await ThermionFlutterPlatform.instance.createViewerWithOptions(options); _appLifecycleListener = AppLifecycleListener( onStateChange: _handleStateChange, ); @@ -102,7 +102,11 @@ class ThermionFlutterPlugin { } static Future createTexture( - double width, double height, double offsetLeft, double offsetTop, double pixelRatio) async { + double width, + double height, + double offsetLeft, + double offsetTop, + double pixelRatio) async { return ThermionFlutterPlatform.instance .createTexture(width, height, offsetLeft, offsetTop, pixelRatio); } @@ -117,8 +121,9 @@ class ThermionFlutterPlugin { int width, int height, int offsetLeft, - int offsetTop, double pixelRatio) async { - return ThermionFlutterPlatform.instance - .resizeTexture(texture, width, height, offsetLeft, offsetTop, pixelRatio); + int offsetTop, + double pixelRatio) async { + return ThermionFlutterPlatform.instance.resizeTexture( + texture, width, height, offsetLeft, offsetTop, pixelRatio); } } diff --git a/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart b/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart index deb81de2..03f81098 100644 --- a/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart +++ b/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart @@ -8,6 +8,8 @@ class ThermionFlutterOptions { final String? uberarchivePath; ThermionFlutterOptions({this.uberarchivePath}); + const ThermionFlutterOptions.empty() : uberarchivePath = null; + } abstract class ThermionFlutterPlatform extends PlatformInterface { From cfddb99a8b9a7a4c458afc91ae4cb1b4f2e1096c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:01:45 +0800 Subject: [PATCH 094/232] (flutter) add CameraOrientationWidget --- thermion_flutter/thermion_flutter/lib/thermion_flutter.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart b/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart index 8c5164ed..be4e9ea5 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart @@ -3,5 +3,6 @@ library thermion_flutter; export 'thermion/thermion_flutter_plugin.dart'; export 'thermion/widgets/thermion_widget.dart'; export 'thermion/widgets/camera/gestures/thermion_gesture_detector.dart'; +export 'thermion/widgets/camera/camera_orientation_widget.dart'; export 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; export 'package:thermion_dart/thermion_dart.dart'; From cf0dad2631a70641cede4b6eb4259f9ca4e8341b Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:03:29 +0800 Subject: [PATCH 095/232] (flutter) add const FlutterWebOptions --- .../widgets/thermion_widget_web_impl.dart | 10 +++++----- .../lib/thermion_flutter_web_options.dart | 19 +++++++++++++++---- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart index e1302aba..41de0593 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget_web_impl.dart @@ -6,12 +6,12 @@ import 'package:web/web.dart'; import 'package:flutter/widgets.dart'; class ThermionWidgetWeb extends StatelessWidget { - - late final ThermionFlutterWebOptions options; + final ThermionFlutterWebOptions options; - const ThermionWidgetWeb({super.key, ThermionFlutterWebOptions? options}) { - this.options = options ?? ThermionFlutterWebOptions(); - } + const ThermionWidgetWeb( + {super.key, + this.options = + const ThermionFlutterWebOptions.empty()}); @override Widget build(BuildContext context) { diff --git a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web_options.dart b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web_options.dart index e453233d..ade9f7d0 100644 --- a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web_options.dart +++ b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web_options.dart @@ -1,8 +1,19 @@ import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; class ThermionFlutterWebOptions extends ThermionFlutterOptions { - bool createCanvas; - bool importCanvasAsWidget; - - ThermionFlutterWebOptions({this.importCanvasAsWidget = false, this.createCanvas = true, String? uberarchivePath}) : super(uberarchivePath:uberarchivePath); + + final bool createCanvas; + final bool importCanvasAsWidget; + + ThermionFlutterWebOptions( + {this.importCanvasAsWidget = false, + this.createCanvas = true, + String? uberarchivePath}) + : super(uberarchivePath: uberarchivePath); + + const ThermionFlutterWebOptions.empty( + {this.importCanvasAsWidget = false, + this.createCanvas = true, + String? uberarchivePath}) + : super.empty(); } From 5813753ef94fd19dfeefeefe487cc734e4fb7ceb Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:03:52 +0800 Subject: [PATCH 096/232] (flutter) set enablePicking to false by default in ThermionGestureDetector --- .../widgets/camera/gestures/thermion_gesture_detector.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart index 566d828e..a6c08067 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart @@ -51,7 +51,7 @@ class ThermionGestureDetector extends StatelessWidget { this.child, this.showControlOverlay = false, this.enableCamera = true, - this.enablePicking = true, + this.enablePicking = false, this.onScaleStart, this.onScaleUpdate, this.onScaleEnd}) From a6c6cff8b6de7e9bcbc4675050387f4107233e61 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:04:36 +0800 Subject: [PATCH 097/232] add loadGlbFromBuffer method and normals param to ThermionViewer --- thermion_dart/lib/thermion_dart/thermion_viewer.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index 2bb61c00..d1e2c225 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -206,6 +206,15 @@ abstract class ThermionViewer { Future loadGlb(String path, {int numInstances = 1, bool keepData = false}); + /// + /// Load the .glb asset from the specified buffer and insert into the scene. + /// Specify [numInstances] to create multiple instances (this is more efficient than dynamically instantating at a later time). You can then retrieve the created instances with [getInstances]. + /// If you want to be able to call [createInstance] at a later time, you must pass true for [keepData]. + /// If [keepData] is false, the source glTF data will be released and [createInstance] will throw an exception. + /// + Future loadGlbFromBuffer(Uint8List data, + {int numInstances = 1, bool keepData = false}); + /// /// Create a new instance of [entity]. /// @@ -770,6 +779,7 @@ abstract class ThermionViewer { /// Future createGeometry(List vertices, List indices, {String? materialPath, + List? normals, PrimitiveType primitiveType = PrimitiveType.TRIANGLES}); /// From 4b742fea2d5693f6c232c85fba36c7c1221cb3cb Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:05:18 +0800 Subject: [PATCH 098/232] (flutter) add experimental GestureHandler widget and decouple from ThermionGestureDetectorDesktop --- .../gestures/thermion_gesture_handler.dart | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart new file mode 100644 index 00000000..a5f9ec4a --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart @@ -0,0 +1,193 @@ +import 'dart:async'; + +import 'package:flutter/gestures.dart'; +import 'package:flutter/services.dart'; +import 'package:logging/logging.dart'; +import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; + +enum ThermionGestureState { + NULL, + ENTITY_HIGHLIGHTED, + GIZMO_ATTACHED, + ROTATING, + PANNING, +} + +class ThermionGestureHandler { + final ThermionViewer viewer; + final bool enableCamera; + final bool enablePicking; + final Logger _logger = Logger("ThermionGestureHandler"); + + ThermionGestureState _currentState = ThermionGestureState.NULL; + AbstractGizmo? _gizmo; + Timer? _scrollTimer; + ThermionEntity? _highlightedEntity; + StreamSubscription? _pickResultSubscription; + + ThermionGestureHandler({ + required this.viewer, + this.enableCamera = true, + this.enablePicking = true, + }) { + try { + _gizmo = viewer.gizmo; + } catch (err) { + _logger.warning( + "Failed to get gizmo. If you are running on WASM, this is expected"); + } + + _pickResultSubscription = viewer.pickResult.listen(_onPickResult); + + // Add keyboard listener + RawKeyboard.instance.addListener(_handleKeyEvent); + } + + void _handleKeyEvent(RawKeyEvent event) { + if (event is RawKeyDownEvent && + event.logicalKey == LogicalKeyboardKey.escape) { + _resetToNullState(); + } + } + + void _resetToNullState() async { + // set current state to NULL first, so that any subsequent pointer movements + // won't attempt to translate a deleted entity + _currentState = ThermionGestureState.NULL; + if (_highlightedEntity != null) { + await viewer.removeStencilHighlight(_highlightedEntity!); + _highlightedEntity = null; + } + } + + void _onPickResult(FilamentPickResult result) async { + var targetEntity = await viewer.getAncestor(result.entity) ?? result.entity; + + if (_highlightedEntity != targetEntity) { + if (_highlightedEntity != null) { + await viewer.removeStencilHighlight(_highlightedEntity!); + } + + _highlightedEntity = targetEntity; + if (_highlightedEntity != null) { + await viewer.setStencilHighlight(_highlightedEntity!); + } + + _currentState = _highlightedEntity != null + ? ThermionGestureState.ENTITY_HIGHLIGHTED + : ThermionGestureState.NULL; + } + } + + Future onPointerHover(Offset localPosition) async { + if (_currentState == ThermionGestureState.GIZMO_ATTACHED) { + _gizmo?.checkHover(localPosition.dx, localPosition.dy); + } + + // Update highlighted entity position + if (_highlightedEntity != null) { + await viewer.queuePositionUpdateFromViewportCoords( + _highlightedEntity!, + localPosition.dx, + localPosition.dy, + ); + } + } + + Future onPointerScroll(Offset localPosition, double scrollDelta) async { + if (_currentState == ThermionGestureState.NULL && enableCamera) { + await _zoom(localPosition, scrollDelta); + } + } + + Future onPointerDown(Offset localPosition, int buttons) async { + if (_currentState == ThermionGestureState.ENTITY_HIGHLIGHTED) { + _resetToNullState(); + return; + } + + if (enablePicking && buttons != kMiddleMouseButton) { + viewer.pick(localPosition.dx.toInt(), localPosition.dy.toInt()); + } + + if (buttons == kMiddleMouseButton && enableCamera) { + await viewer.rotateStart(localPosition.dx, localPosition.dy); + _currentState = ThermionGestureState.ROTATING; + } else if (buttons == kPrimaryMouseButton && enableCamera) { + await viewer.panStart(localPosition.dx, localPosition.dy); + _currentState = ThermionGestureState.PANNING; + } + } + + Future onPointerMove( + Offset localPosition, Offset delta, int buttons) async { + switch (_currentState) { + case ThermionGestureState.NULL: + // This case should not occur now, as we set the state on pointer down + break; + case ThermionGestureState.ENTITY_HIGHLIGHTED: + await _handleEntityHighlightedMove(localPosition); + break; + case ThermionGestureState.GIZMO_ATTACHED: + // Do nothing + break; + case ThermionGestureState.ROTATING: + if (enableCamera) { + await viewer.rotateUpdate(localPosition.dx, localPosition.dy); + } + break; + case ThermionGestureState.PANNING: + if (enableCamera) { + await viewer.panUpdate(localPosition.dx, localPosition.dy); + } + break; + } + } + + Future onPointerUp(int buttons) async { + switch (_currentState) { + case ThermionGestureState.ROTATING: + await viewer.rotateEnd(); + _currentState = ThermionGestureState.NULL; + break; + case ThermionGestureState.PANNING: + await viewer.panEnd(); + _currentState = ThermionGestureState.NULL; + break; + default: + // For other states, no action needed + break; + } + } + + Future _handleEntityHighlightedMove(Offset localPosition) async { + if (_highlightedEntity != null) { + await viewer.queuePositionUpdateFromViewportCoords( + _highlightedEntity!, + localPosition.dx, + localPosition.dy, + ); + } + } + + Future _zoom(Offset localPosition, double scrollDelta) async { + _scrollTimer?.cancel(); + await viewer.zoomBegin(); + await viewer.zoomUpdate( + localPosition.dx, localPosition.dy, scrollDelta > 0 ? 1 : -1); + + _scrollTimer = Timer(const Duration(milliseconds: 100), () async { + await viewer.zoomEnd(); + }); + } + + void dispose() { + _pickResultSubscription?.cancel(); + if (_highlightedEntity != null) { + viewer.removeStencilHighlight(_highlightedEntity!); + } + // Remove keyboard listener + RawKeyboard.instance.removeListener(_handleKeyEvent); + } +} From 7554af5d41969502790e6cd39438b3a1bf681011 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:05:24 +0800 Subject: [PATCH 099/232] (flutter) add experimental GestureHandler widget and decouple from ThermionGestureDetectorDesktop --- .../thermion_gesture_detector_desktop.dart | 182 ++++-------------- 1 file changed, 39 insertions(+), 143 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart index 4ab1e711..45dbc6b5 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart @@ -5,49 +5,24 @@ import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; import 'package:vector_math/vector_math_64.dart' as v64; -/// -/// A widget that translates finger/mouse gestures to zoom/pan/rotate actions. -/// class ThermionGestureDetectorDesktop extends StatefulWidget { - /// - /// The content to display below the gesture detector/listener widget. - /// This will usually be a ThermionWidget (so you can navigate by directly interacting with the viewport), but this is not necessary. - /// It is equally possible to render the viewport/gesture controls elsewhere in the widget hierarchy. The only requirement is that they share the same [FilamentController]. - /// final Widget? child; - - /// - /// The [controller] attached to the [ThermionWidget] you wish to control. - /// final ThermionViewer controller; - - /// - /// If true, an overlay will be shown with buttons to toggle whether pointer movements are interpreted as: - /// 1) rotate or a pan (mobile only), - /// 2) moving the camera or the background image (TODO). - /// final bool showControlOverlay; - - /// - /// If false, gestures will not manipulate the active camera. - /// final bool enableCamera; - - /// - /// If false, pointer down events will not trigger hit-testing (picking). - /// final bool enablePicking; - const ThermionGestureDetectorDesktop( - {Key? key, - required this.controller, - this.child, - this.showControlOverlay = false, - this.enableCamera = true, - this.enablePicking = true}) - : super(key: key); + const ThermionGestureDetectorDesktop({ + Key? key, + required this.controller, + this.child, + this.showControlOverlay = false, + this.enableCamera = true, + this.enablePicking = true, + }) : super(key: key); @override State createState() => _ThermionGestureDetectorDesktopState(); @@ -55,129 +30,50 @@ class ThermionGestureDetectorDesktop extends StatefulWidget { class _ThermionGestureDetectorDesktopState extends State { - final _logger = Logger("_ThermionGestureDetectorDesktopState"); - - /// - /// - // ignore: unused_field - final bool _scaling = false; - - bool _pointerMoving = false; - - AbstractGizmo? _gizmo; + late ThermionGestureHandler _gestureHandler; @override void initState() { super.initState(); - try { - _gizmo = widget.controller.gizmo; - } catch (err) { - _logger.warning( - "Failed to get gizmo. If you are running on WASM, this is expected"); - } + _gestureHandler = ThermionGestureHandler( + enableCamera: widget.enableCamera, + enablePicking: widget.enablePicking, viewer: widget.controller, + ); } @override void didUpdateWidget(ThermionGestureDetectorDesktop oldWidget) { - if (widget.showControlOverlay != oldWidget.showControlOverlay || - widget.enableCamera != oldWidget.enableCamera || + if (widget.enableCamera != oldWidget.enableCamera || widget.enablePicking != oldWidget.enablePicking) { - setState(() {}); + _gestureHandler = ThermionGestureHandler( + viewer: widget.controller, + enableCamera: widget.enableCamera, + enablePicking: widget.enablePicking, + ); } - super.didUpdateWidget(oldWidget); } - Timer? _scrollTimer; - - /// - /// Scroll-wheel on desktop, interpreted as zoom - /// - void _zoom(PointerScrollEvent pointerSignal) async { - _scrollTimer?.cancel(); - await widget.controller.zoomBegin(); - await widget.controller.zoomUpdate( - pointerSignal.localPosition.dx, - pointerSignal.localPosition.dy, - pointerSignal.scrollDelta.dy > 0 ? 1 : -1); - - // we don't want to end the zoom in the same frame, because this will destroy the camera manipulator (and cancel the zoom update). - // here, we just defer calling [zoomEnd] for 100ms to ensure the update is propagated through. - _scrollTimer = Timer(const Duration(milliseconds: 100), () async { - await widget.controller.zoomEnd(); - }); - } - - Timer? _pickTimer; - @override Widget build(BuildContext context) { return Listener( - onPointerHover: (event) async { - _gizmo?.checkHover(event.localPosition.dx, event.localPosition.dy); - }, - onPointerSignal: (PointerSignalEvent pointerSignal) async { - if (pointerSignal is PointerScrollEvent) { - if (widget.enableCamera) { - _zoom(pointerSignal); - } - } else { - throw Exception("TODO"); - } - }, - onPointerPanZoomStart: (pzs) { - throw Exception("TODO - is this a pinch zoom on laptop trackpad?"); - }, - onPointerDown: (d) async { - if (d.buttons != kTertiaryButton && widget.enablePicking) { - widget.controller - .pick(d.localPosition.dx.toInt(), d.localPosition.dy.toInt()); - } - _pointerMoving = false; - }, - // holding/moving the left mouse button is interpreted as a pan, middle mouse button as a rotate - onPointerMove: (PointerMoveEvent d) async { - if (_gizmo?.isHovered == true) { - _gizmo!.translate(d.delta.dx, d.delta.dy); - return; - } - // if this is the first move event, we need to call rotateStart/panStart to set the first coordinates - if (!_pointerMoving) { - if (d.buttons == kTertiaryButton && widget.enableCamera) { - widget.controller - .rotateStart(d.localPosition.dx, d.localPosition.dy); - } else if (widget.enableCamera) { - widget.controller - .panStart(d.localPosition.dx, d.localPosition.dy); - } - } - // set the _pointerMoving flag so we don't call rotateStart/panStart on future move events - _pointerMoving = true; - if (d.buttons == kTertiaryButton && widget.enableCamera) { - widget.controller - .rotateUpdate(d.localPosition.dx, d.localPosition.dy); - } else if (widget.enableCamera) { - widget.controller.panUpdate(d.localPosition.dx, d.localPosition.dy); - } - }, - // when the left mouse button is released: - // 1) if _pointerMoving is true, this completes the pan - // 2) if _pointerMoving is false, this is interpreted as a pick - // same applies to middle mouse button, but this is ignored as a pick - onPointerUp: (PointerUpEvent d) async { - if (_gizmo?.isHovered == true) { - return; - } - - if (d.buttons == kTertiaryButton && widget.enableCamera) { - widget.controller.rotateEnd(); - } else { - if (_pointerMoving && widget.enableCamera) { - widget.controller.panEnd(); - } - } - _pointerMoving = false; - }, - child: widget.child); + onPointerHover: (event) => + _gestureHandler.onPointerHover(event.localPosition), + onPointerSignal: (PointerSignalEvent pointerSignal) { + if (pointerSignal is PointerScrollEvent) { + _gestureHandler.onPointerScroll( + pointerSignal.localPosition, pointerSignal.scrollDelta.dy); + } + }, + onPointerPanZoomStart: (pzs) { + throw Exception("TODO - is this a pinch zoom on laptop trackpad?"); + }, + onPointerDown: (d) => + _gestureHandler.onPointerDown(d.localPosition, d.buttons), + onPointerMove: (d) => _gestureHandler.onPointerMove( + d.localPosition, d.delta, d.buttons), + onPointerUp: (d) => _gestureHandler.onPointerUp(d.buttons), + child: widget.child, + ); } -} +} \ No newline at end of file From 89a660144e556d15c7083159bf3f8161aa48eb6e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:05:36 +0800 Subject: [PATCH 100/232] update test helpers --- thermion_dart/test/helpers.dart | 52 --------------------------------- 1 file changed, 52 deletions(-) diff --git a/thermion_dart/test/helpers.dart b/thermion_dart/test/helpers.dart index 39b8826d..bf69b9e7 100644 --- a/thermion_dart/test/helpers.dart +++ b/thermion_dart/test/helpers.dart @@ -8,59 +8,7 @@ import 'package:thermion_dart/thermion_dart/utils/dart_resources.dart'; import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; -List cubeVertices = [ - // Front face - -1, -1, 1, - 1, -1, 1, - 1, 1, 1, - -1, 1, 1, - // Back face - -1, -1, -1, - -1, 1, -1, - 1, 1, -1, - 1, -1, -1, - - // Top face - -1, 1, -1, - -1, 1, 1, - 1, 1, 1, - 1, 1, -1, - - // Bottom face - -1, -1, -1, - 1, -1, -1, - 1, -1, 1, - -1, -1, 1, - - // Right face - 1, -1, -1, - 1, 1, -1, - 1, 1, 1, - 1, -1, 1, - - // Left face - -1, -1, -1, - -1, -1, 1, - -1, 1, 1, - -1, 1, -1, -]; - -// Define the indices for the cube -List cubeIndices = [ - // Front face - 0, 3, 2, 0, 2, 1, - // Back face - 4, 7, 6, 4, 6, 5, - // Top face - 8, 11, 10, 8, 10, 9, - // Bottom face - 12, 15, 14, 12, 14, 13, - // Right face - 16, 19, 18, 16, 18, 17, - // Left face - 20, 23, 22, 20, 22, 21 -]; final viewportDimensions = (width: 500, height: 500); From 77dbb574c772d7f484757fc8e294e3d2ae8eb7e8 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:06:31 +0800 Subject: [PATCH 101/232] add create_geometry_with_normals_ffi method, switch load_glb_from_buffer type to uint8_t for Dart leaf compat and add keepData param --- .../native/src/ThermionDartFFIApi.cpp | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/thermion_dart/native/src/ThermionDartFFIApi.cpp b/thermion_dart/native/src/ThermionDartFFIApi.cpp index 041b45f5..a9ca6517 100644 --- a/thermion_dart/native/src/ThermionDartFFIApi.cpp +++ b/thermion_dart/native/src/ThermionDartFFIApi.cpp @@ -432,7 +432,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, - const void *const data, + const uint8_t *const data, size_t length, int numInstances, bool keepData, @@ -866,6 +866,7 @@ extern "C" int numIndices, int primitiveType, const char *materialPath, + bool keepData, void (*callback)(EntityId)) { std::packaged_task lambda( @@ -884,4 +885,33 @@ extern "C" auto fut = _rl->add_task(lambda); } + EMSCRIPTEN_KEEPALIVE void create_geometry_with_normals_ffi( + void *const sceneManager, + float *vertices, + int numVertices, + float *normals, + int numNormals, + uint16_t *indices, + int numIndices, + int primitiveType, + const char *materialPath, + bool keepData, + void (*callback)(EntityId)) + { + std::packaged_task lambda( + [=] + { + auto entity = create_geometry_with_normals(sceneManager, vertices, numVertices, normals, numNormals, indices, numIndices, primitiveType, materialPath); + #ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ + moduleArg.dartFilamentResolveCallback($0,$1); + }, callback, entity); + #else + callback(entity); + #endif + return entity; + }); + auto fut = _rl->add_task(lambda); + } + } From d40261ae29661a0bdcfe02089e0bdf8ba4c2c0aa Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:06:50 +0800 Subject: [PATCH 102/232] add create_geometry_with_normals_ffi method, switch load_glb_from_buffer type to uint8_t for Dart leaf compat and add keepData param --- thermion_dart/native/include/ThermionDartFFIApi.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/thermion_dart/native/include/ThermionDartFFIApi.h b/thermion_dart/native/include/ThermionDartFFIApi.h index c851a7eb..8a0cac21 100644 --- a/thermion_dart/native/include/ThermionDartFFIApi.h +++ b/thermion_dart/native/include/ThermionDartFFIApi.h @@ -67,7 +67,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void remove_light_ffi(void *const viewer, EntityId entityId); EMSCRIPTEN_KEEPALIVE void clear_lights_ffi(void *const viewer); EMSCRIPTEN_KEEPALIVE void load_glb_ffi(void *const sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, const void *const data, size_t length, int numInstances, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void load_gltf_ffi(void *const sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void create_instance_ffi(void *const sceneManager, EntityId entityId, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void remove_entity_ffi(void *const viewer, EntityId asset, void (*callback)()); @@ -102,7 +102,8 @@ extern "C" void (*callback)(bool)); EMSCRIPTEN_KEEPALIVE void set_post_processing_ffi(void *const viewer, bool enabled); EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_ffi(void *const sceneManager, EntityId entityId, void(*callback)()); - EMSCRIPTEN_KEEPALIVE void create_geometry_ffi(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void create_geometry_ffi(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void create_geometry_with_normals_ffi(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath, bool keepData, void (*callback)(EntityId)); #ifdef __cplusplus } From 9077632d1b58222b607e47d81bbf503adf2d88c6 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:07:07 +0800 Subject: [PATCH 103/232] add create_geometry_with_normals method --- thermion_dart/native/src/ThermionDartApi.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 34f6fa49..70981112 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -840,6 +840,19 @@ extern "C" materialPath); } + EMSCRIPTEN_KEEPALIVE EntityId create_geometry_with_normals(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) + { + return ((SceneManager *)sceneManager)->createGeometryWithNormals( + vertices, + (uint32_t)numVertices, + normals, + (uint32_t)numNormals, + indices, + numIndices, + (filament::RenderableManager::PrimitiveType)primitiveType, + materialPath); + } + EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(void *const sceneManager, const EntityId parent, const char *name) { auto entity = ((SceneManager *)sceneManager)->findChildEntityByName(parent, name); From 3684eb248ce600d6e04575699b9661e619ae712f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:07:17 +0800 Subject: [PATCH 104/232] add create_geometry_with_normals method --- thermion_dart/native/include/ThermionDartApi.h | 1 + 1 file changed, 1 insertion(+) diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index baf56fd3..489dedb2 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -250,6 +250,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void remove_animation_component(void *const sceneManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath); + EMSCRIPTEN_KEEPALIVE EntityId create_geometry_with_normals(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath); EMSCRIPTEN_KEEPALIVE EntityId get_parent(void *const sceneManager, EntityId child); EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child); EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling); From 8bd2416bad4b32a49bd687616d76b86b45800a30 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:07:38 +0800 Subject: [PATCH 105/232] don't set stencil highlight in Gizmo --- thermion_dart/lib/thermion_dart/entities/gizmo.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/thermion_dart/lib/thermion_dart/entities/gizmo.dart b/thermion_dart/lib/thermion_dart/entities/gizmo.dart index 381fd24a..87ccf082 100644 --- a/thermion_dart/lib/thermion_dart/entities/gizmo.dart +++ b/thermion_dart/lib/thermion_dart/entities/gizmo.dart @@ -105,7 +105,6 @@ class Gizmo extends AbstractGizmo { await _viewer.setParent(center, entity, preserveScaling: true); _boundingBoxController.sink.add(await _viewer.getBoundingBox(x)); - await _viewer.setStencilHighlight(_activeEntity!); } Future detach() async { From b827a2142b78288aa6842acc7351bdab1a76015f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:08:13 +0800 Subject: [PATCH 106/232] HighlightOverlay fixes --- thermion_dart/native/src/HighlightOverlay.cpp | 106 +++++++----------- 1 file changed, 43 insertions(+), 63 deletions(-) diff --git a/thermion_dart/native/src/HighlightOverlay.cpp b/thermion_dart/native/src/HighlightOverlay.cpp index 9e4b5a96..b7a313c1 100644 --- a/thermion_dart/native/src/HighlightOverlay.cpp +++ b/thermion_dart/native/src/HighlightOverlay.cpp @@ -1,5 +1,6 @@ -#include -#include +#include +#include +#include #include "SceneManager.hpp" @@ -35,7 +36,19 @@ namespace thermion_filament { auto scene = sceneManager->getScene(); - if(sceneManager->isGeometryEntity(entityId)) { + _isGeometryEntity = sceneManager->isGeometryEntity(entityId); + _isGltfAsset = sceneManager->isGltfAsset(entityId); + + if(!(_isGeometryEntity || _isGltfAsset)) { + Log("Failed to set stencil outline for entity %d: the entity is a child of another entity. " + "Currently, we only support outlining top-level entities." + "Call getAncestor() to get the ancestor of this entity, then set on that", entityId); + return; + } + + if(_isGeometryEntity) { + + Log("Entity %d is geometry", entityId); auto geometryEntity = Entity::import(entityId); auto renderable = rm.getInstance(geometryEntity); @@ -68,11 +81,8 @@ namespace thermion_filament { auto outlineTransformInstance = tm.getInstance(_entity); auto entityTransformInstance = tm.getInstance(geometryEntity); tm.setParent(outlineTransformInstance, entityTransformInstance); - return; - } - - if(sceneManager->isGltfAsset(entityId)) { - + } else if(_isGltfAsset) { + Log("Entity %d is gltf", entityId); auto *asset = sceneManager->getAssetByEntityId(entityId); if (asset) @@ -92,19 +102,19 @@ namespace thermion_filament { materialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::REPLACE); materialInstance->setStencilCompareFunction(filament::backend::SamplerCompareFunc::A); - auto newInstance = sceneManager->createGltfAssetInstance(asset); + _newInstance = sceneManager->createGltfAssetInstance(asset); - _entity = newInstance->getRoot(); + _entity = _newInstance->getRoot(); auto newTransformInstance = tm.getInstance(_entity); auto entityTransformInstance = tm.getInstance(asset->getRoot()); tm.setParent(newTransformInstance, entityTransformInstance); - if(!newInstance) { + if(!_newInstance) { Log("Couldn't create new instance"); } else { - for(int i = 0; i < newInstance->getEntityCount(); i++) { - auto entity = newInstance->getEntities()[i]; + for(int i = 0; i < _newInstance->getEntityCount(); i++) { + auto entity = _newInstance->getEntities()[i]; auto renderableInstance = rm.getInstance(entity); rm.setPriority(renderableInstance, 7); if(renderableInstance.isValid()) { @@ -115,69 +125,39 @@ namespace thermion_filament { Log("Not renderable, ignoring"); } } - scene->addEntities(newInstance->getEntities(), newInstance->getEntityCount()); + scene->addEntities(_newInstance->getEntities(), _newInstance->getEntityCount()); } - return; } else { Log("Not FilamentAsset"); } } - Log("Looking for parent"); - auto renderable = rm.getInstance(Entity::import(entityId)); - auto transformInstance = tm.getInstance(Entity::import(entityId)); - if(!transformInstance.isValid()) { - Log("Unknown entity type"); - return; - } - - Entity parent; - while(true) { - auto newParent = tm.getParent(transformInstance); - if(newParent.isNull()) { - break; - } - parent = newParent; - transformInstance = tm.getInstance(parent); - } - if(parent.isNull()) { - Log("Unknown entity type"); - return; - } - - sceneManager->setStencilHighlight(Entity::smuggle(parent), r, g, b); } SceneManager::HighlightOverlay::~HighlightOverlay() { + Log("Destructor"); if (_entity.isNull()) { + Log("Null entity"); return; } - - auto& rm = _engine->getRenderableManager(); - auto& tm = _engine->getTransformManager(); - - _sceneManager->getScene()->remove(_entity); - - - // If this was a glTF asset instance, we need to destroy it - if (_newInstance) { - for(int i =0 ; i < _newInstance->getEntityCount(); i++) { - auto entity =_newInstance->getEntities()[i]; - _sceneManager->getScene()->remove(entity); - rm.destroy(entity); - } - } - - tm.destroy(_entity); - - _engine->destroy(_highlightMaterialInstance); - - // Destroy the entity - utils::EntityManager::get().destroy(_entity); - + if (_isGltfAsset) + { + Log("Erasing new instance"); + _sceneManager->getScene()->removeEntities(_newInstance->getEntities(), _newInstance->getEntityCount()); + _newInstance->detachMaterialInstances(); + _engine->destroy(_highlightMaterialInstance); + } else if(_isGeometryEntity) { + Log("Erasing new geometry"); + auto& tm = _engine->getTransformManager(); + auto transformInstance = tm.getInstance(_entity); + _sceneManager->getScene()->remove(_entity); + utils::EntityManager::get().destroy(_entity); + _engine->destroy(_entity); + _engine->destroy(_highlightMaterialInstance); + } else { + Log("FATAL: Unknown highlight overlay entity type"); + } } - - } \ No newline at end of file From 6a7bde930d8cde0f9d6f7fcedf504c99d903c9a4 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:08:35 +0800 Subject: [PATCH 107/232] add normals to CustomGeometry interface --- .../native/include/CustomGeometry.hpp | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/thermion_dart/native/include/CustomGeometry.hpp b/thermion_dart/native/include/CustomGeometry.hpp index 4fac5264..93df18dc 100644 --- a/thermion_dart/native/include/CustomGeometry.hpp +++ b/thermion_dart/native/include/CustomGeometry.hpp @@ -19,18 +19,26 @@ namespace thermion_filament // CustomGeometry.h class CustomGeometry { public: - CustomGeometry(float* vertices, uint32_t numVertices, uint16_t* indices, uint32_t numIndices, RenderableManager::PrimitiveType primitiveType, Engine* engine); + CustomGeometry( + float* vertices, + uint32_t numVertices, + float* normals, + uint32_t numNormals, + uint16_t* indices, + uint32_t numIndices, + RenderableManager::PrimitiveType primitiveType, + Engine* engine); ~CustomGeometry(); - void computeBoundingBox(); - VertexBuffer* vertexBuffer(); - IndexBuffer* indexBuffer(); + VertexBuffer* vertexBuffer() const; + IndexBuffer* indexBuffer() const; Box getBoundingBox() const; - float* vertices; - uint32_t numVertices; - uint16_t* indices; - uint32_t numIndices; + float* vertices = nullptr; + float* normals = nullptr; + uint32_t numVertices = 0; + uint16_t* indices = 0; + uint32_t numIndices = 0; Box boundingBox; RenderableManager::PrimitiveType primitiveType; @@ -39,6 +47,8 @@ private: bool _vertexBufferFreed = false; bool _indexBufferFreed = false; + void computeBoundingBox(); + }; From 33f2c5fbf72daa4de698861ec8329737f87cf33c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:08:48 +0800 Subject: [PATCH 108/232] add normals to CustomGeometry implementation --- thermion_dart/native/src/CustomGeometry.cpp | 95 ++++++++++++++++++++- 1 file changed, 91 insertions(+), 4 deletions(-) diff --git a/thermion_dart/native/src/CustomGeometry.cpp b/thermion_dart/native/src/CustomGeometry.cpp index a8799de5..48d7aa91 100644 --- a/thermion_dart/native/src/CustomGeometry.cpp +++ b/thermion_dart/native/src/CustomGeometry.cpp @@ -1,10 +1,16 @@ +#include + +#include "math.h" + #include #include #include #include #include #include +#include +#include "Log.hpp" #include "CustomGeometry.hpp" namespace thermion_filament { @@ -14,6 +20,8 @@ using namespace filament; CustomGeometry::CustomGeometry( float* vertices, uint32_t numVertices, + float* normals, + uint32_t numNormals, uint16_t* indices, uint32_t numIndices, RenderableManager::PrimitiveType primitiveType, @@ -23,13 +31,19 @@ CustomGeometry::CustomGeometry( this->vertices = new float[numVertices]; std::memcpy(this->vertices, vertices, numVertices * sizeof(float)); + if(numNormals > 0) { + Log("numNormals %d", numNormals); + this->normals = new float[numNormals]; + std::memcpy(this->normals, normals, numNormals * sizeof(float)); + } + this->indices = new uint16_t[numIndices]; std::memcpy(this->indices, indices, numIndices * sizeof(uint16_t)); computeBoundingBox(); } -IndexBuffer* CustomGeometry::indexBuffer() { +IndexBuffer* CustomGeometry::indexBuffer() const { IndexBuffer::BufferDescriptor::Callback indexCallback = [](void *buf, size_t, void *data) { @@ -46,21 +60,94 @@ IndexBuffer* CustomGeometry::indexBuffer() { return indexBuffer; } -VertexBuffer* CustomGeometry::vertexBuffer() { +VertexBuffer* CustomGeometry::vertexBuffer() const { VertexBuffer::BufferDescriptor::Callback vertexCallback = [](void *buf, size_t, void *data) { // free((void *)buf); }; - auto vertexBuffer = VertexBuffer::Builder() + std::vector triangles; + for(int i=0; i < numIndices; i+=3) { + filament::math::ushort3 triangle; + triangle.x = this->indices[i]; + triangle.y = this->indices[i+1]; + triangle.z = this->indices[i+2]; + triangles.push_back(triangle); + } + + + // Create a SurfaceOrientation builder + geometry::SurfaceOrientation::Builder builder; + builder.vertexCount(numVertices) + .normals((filament::math::float3*)normals) + .positions((filament::math::float3*)this->vertices) + .triangleCount(triangles.size()) + .triangles(triangles.data()); + + // Build the SurfaceOrientation object + auto orientation = builder.build(); + + // Retrieve the quaternions + auto quats = new std::vector(numVertices); + orientation->getQuats(quats->data(), numVertices); + + // Create dummy UV data + auto dummyUVs = new std::vector(numVertices, filament::math::float2{0.0f, 0.0f}); + + // Create dummy vertex color data (white color for all vertices) + auto dummyColors = new std::vector(numVertices, filament::math::float4{1.0f, 1.0f, 1.0f, 1.0f}); + + auto vertexBufferBuilder = VertexBuffer::Builder() .vertexCount(numVertices) - .bufferCount(1) .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) + .attribute(VertexAttribute::UV0, 1, VertexBuffer::AttributeType::FLOAT2) + .attribute(VertexAttribute::UV1, 2, VertexBuffer::AttributeType::FLOAT2) + .attribute(VertexAttribute::COLOR, 3, VertexBuffer::AttributeType::FLOAT4); + + if(this->normals) { + vertexBufferBuilder + .bufferCount(5) + .attribute(VertexAttribute::TANGENTS, 4, filament::VertexBuffer::AttributeType::FLOAT4); + } else { + vertexBufferBuilder = vertexBufferBuilder.bufferCount(4); + } + auto vertexBuffer = vertexBufferBuilder .build(*_engine); vertexBuffer->setBufferAt(*_engine, 0, VertexBuffer::BufferDescriptor( this->vertices, vertexBuffer->getVertexCount() * sizeof(math::float3), vertexCallback)); + + + // Set UV0 buffer + vertexBuffer->setBufferAt(*_engine, 1, VertexBuffer::BufferDescriptor( + dummyUVs->data(), dummyUVs->size() * sizeof(math::float2), + [](void* buf, size_t, void* data) { + delete static_cast*>(data); + }, dummyUVs)); + + // Set UV1 buffer + vertexBuffer->setBufferAt(*_engine, 2, VertexBuffer::BufferDescriptor( + dummyUVs->data(), dummyUVs->size() * sizeof(math::float2), + [](void* buf, size_t, void* data) { + // Do nothing here, as we're reusing the same data as UV0 + }, nullptr)); + + // Set vertex color buffer + vertexBuffer->setBufferAt(*_engine, 3, VertexBuffer::BufferDescriptor( + dummyColors->data(), dummyColors->size() * sizeof(math::float4), + [](void* buf, size_t, void* data) { + delete static_cast*>(data); + }, dummyColors)); + + if(this->normals) { + vertexBuffer->setBufferAt(*_engine, 4, VertexBuffer::BufferDescriptor( + quats->data(), quats->size() * sizeof(math::quatf), [] (void *buf, size_t, + void *data) + { + delete (std::vector*)data; + }, (void*)quats)); + } return vertexBuffer; } From f67e1a021dd93e7b59866898d86d692d181e65dc Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:09:14 +0800 Subject: [PATCH 109/232] add createGeometryWithNormals to SceneManager --- thermion_dart/native/include/SceneManager.hpp | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 46924508..1ee3ad0d 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -62,9 +62,10 @@ namespace thermion_filament } private: - MaterialInstance* _highlightMaterialInstance; - CustomGeometry* _newGeometry; - FilamentInstance* _newInstance; + MaterialInstance* _highlightMaterialInstance = nullptr; + bool _isGeometryEntity = false; + bool _isGltfAsset = false; + FilamentInstance* _newInstance = nullptr; Entity _entity; Engine* const _engine; SceneManager* const _sceneManager; @@ -238,6 +239,23 @@ namespace thermion_filament bool keepData = false ); + + /// + /// Creates an entity with the specified geometry/material/normals and adds to the scene. + /// If [keepData] is true, stores + /// + EntityId createGeometryWithNormals( + float *vertices, + uint32_t numVertices, + float *normals, + uint32_t numNormals, + uint16_t *indices, + uint32_t numIndices, + filament::RenderableManager::PrimitiveType primitiveType = RenderableManager::PrimitiveType::TRIANGLES, + const char *materialPath = nullptr, + bool keepData = false + ); + friend class FilamentViewer; Gizmo* gizmo = nullptr; @@ -250,8 +268,8 @@ namespace thermion_filament return _geometry.find(entity) != _geometry.end(); } - CustomGeometry* const getGeometry(EntityId entityId) { - return _geometry[entityId]; + const CustomGeometry* const getGeometry(EntityId entityId) { + return _geometry[entityId].get(); } Scene* const getScene() { @@ -282,6 +300,7 @@ namespace thermion_filament gltfio::TextureProvider *_stbDecoder = nullptr; gltfio::TextureProvider *_ktxDecoder = nullptr; std::mutex _mutex; + std::mutex _stencilMutex; utils::NameComponentManager *_ncm; @@ -290,8 +309,8 @@ namespace thermion_filament gltfio::FilamentInstance *> _instances; tsl::robin_map _assets; - tsl::robin_map _geometry; - tsl::robin_map _highlighted; + tsl::robin_map> _geometry; + tsl::robin_map> _highlighted; tsl::robin_map> _transformUpdates; From f5de4349bf84a3e7ff26f110010ab72e2c97fbb8 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 18:09:42 +0800 Subject: [PATCH 110/232] add createGeometryWithNormals to SceneManager --- thermion_dart/native/src/SceneManager.cpp | 141 ++++++++++++++-------- 1 file changed, 93 insertions(+), 48 deletions(-) diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 3fc08ef4..f833b732 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -603,6 +603,7 @@ namespace thermion_filament void SceneManager::remove(EntityId entityId) { + std::lock_guard lock(_mutex); auto entity = Entity::import(entityId); @@ -1852,7 +1853,6 @@ void SceneManager::queueRelativePositionUpdateFromViewportVector(EntityId entity float ndcX = (2.0f * viewportCoordX) / vp.width - 1.0f; float ndcY = 1.0f - (2.0f * viewportCoordY) / vp.height; - Log("ndc X ndcY %f %f", ndcX, ndcY ); // Get the current position of the entity auto &tm = _engine->getTransformManager(); auto entity = Entity::import(entityId); @@ -1865,10 +1865,6 @@ void SceneManager::queueRelativePositionUpdateFromViewportVector(EntityId entity auto entityPositionInClipSpace = camera.getProjectionMatrix() * entityPositionInCameraSpace; auto entityPositionInNdcSpace = entityPositionInClipSpace / entityPositionInClipSpace.w; - Log("entityPositionInCameraSpace %f %f %f %f", entityPositionInCameraSpace.x, entityPositionInCameraSpace.y, entityPositionInCameraSpace.z, entityPositionInCameraSpace.w); - Log("entityPositionInClipSpace %f %f %f %f", entityPositionInClipSpace.x, entityPositionInClipSpace.y, entityPositionInClipSpace.z, entityPositionInClipSpace.w); - Log("entityPositionInNdcSpace %f %f %f %f", entityPositionInNdcSpace.x, entityPositionInNdcSpace.y, entityPositionInNdcSpace.z, entityPositionInNdcSpace.w); - // Viewport coords in NDC space (use entity position in camera space Z to project onto near plane) math::float4 ndcNearPlanePos = {ndcX, ndcY, -1.0f, 1.0f}; math::float4 ndcFarPlanePos = {ndcX, ndcY, 0.99f, 1.0f}; @@ -1882,11 +1878,6 @@ void SceneManager::queueRelativePositionUpdateFromViewportVector(EntityId entity math::float4 entityPlaneInClipSpace = Camera::inverseProjection(camera.getProjectionMatrix()) * ndcEntityPlanePos; auto entityPlaneInCameraSpace = entityPlaneInClipSpace / entityPlaneInClipSpace.w; auto entityPlaneInWorldSpace = camera.getModelMatrix() * entityPlaneInCameraSpace; - - Log("nearPlaneInClipSpace %f %f %f %f",nearPlaneInClipSpace.x, nearPlaneInClipSpace.y, nearPlaneInClipSpace.z, nearPlaneInClipSpace.w); - Log("nearPlaneInCameraSpace %f %f %f %f",nearPlaneInCameraSpace.x, nearPlaneInCameraSpace.y, nearPlaneInCameraSpace.z, nearPlaneInCameraSpace.w); - Log("entityPlaneInCameraSpace %f %f %f %f",entityPlaneInCameraSpace.x, entityPlaneInCameraSpace.y, entityPlaneInCameraSpace.z, entityPlaneInCameraSpace.w); - Log("entityPlaneInWorldSpace %f %f %f %f",entityPlaneInWorldSpace.x, entityPlaneInWorldSpace.y, entityPlaneInWorldSpace.z, entityPlaneInWorldSpace.w); // Queue the position update (as a relative movement) queuePositionUpdate(entityId, entityPlaneInWorldSpace.x, entityPlaneInWorldSpace.y, entityPlaneInWorldSpace.z, false); @@ -2353,26 +2344,111 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v } void SceneManager::removeStencilHighlight(EntityId entityId) { + std::lock_guard lock(_stencilMutex); auto found = _highlighted.find(entityId); if(found == _highlighted.end()) { + Log("Entity %d has no stencil highlight, skipping removal", entityId); return; } - delete found->second; + Log("Erasing entity id %d from highlighted", entityId); + _highlighted.erase(entityId); } void SceneManager::setStencilHighlight(EntityId entityId, float r, float g, float b) { + + std::lock_guard lock(_stencilMutex); - auto highlightEntity = new HighlightOverlay(entityId, this, _engine, r, g, b); + auto highlightEntity = std::make_unique(entityId, this, _engine, r, g, b); - if(!highlightEntity->isValid()) { - delete highlightEntity; - } else { - _highlighted.emplace(entityId, highlightEntity); + if(highlightEntity->isValid()) { + _highlighted.emplace(entityId, std::move(highlightEntity)); } } + /// + /// Creates an entity with the specified geometry/material/normals and adds to the scene. + /// If [keepData] is true, stores + /// + EntityId SceneManager::createGeometryWithNormals( + float *vertices, + uint32_t numVertices, + float *normals, + uint32_t numNormals, + uint16_t *indices, + uint32_t numIndices, + filament::RenderableManager::PrimitiveType primitiveType, + const char *materialPath, + bool keepData + ) { + auto geometry = std::make_unique(vertices, numVertices, normals, numNormals, indices, numIndices, primitiveType, _engine); + + auto renderable = utils::EntityManager::get().create(); + RenderableManager::Builder builder(1); + + builder.boundingBox(geometry->getBoundingBox()) + .geometry(0, primitiveType, geometry->vertexBuffer(), geometry->indexBuffer(), 0, numIndices) + .culling(true) + .receiveShadows(false) + .castShadows(false); + + if (materialPath) { + filament::Material* mat = nullptr; + + auto matData = _resourceLoaderWrapper->load(materialPath); + mat = Material::Builder().package(matData.data, matData.size).build(*_engine); + _resourceLoaderWrapper->free(matData); + builder.material(0, mat->getDefaultInstance()); + } else { + filament::gltfio::MaterialKey config; + + config.unlit = false; + config.doubleSided = false; + config.useSpecularGlossiness = false; + config.alphaMode = filament::gltfio::AlphaMode::OPAQUE; + config.hasBaseColorTexture = false; + config.hasClearCoat = false; + config.hasClearCoatNormalTexture = false; + config.hasClearCoatRoughnessTexture = false; + config.hasEmissiveTexture = false; + config.hasIOR = false; + config.hasMetallicRoughnessTexture = false; + config.hasNormalTexture = false; + config.hasOcclusionTexture = false; + config.hasSheen = false; + config.hasSheenColorTexture = false; + config.hasSheenRoughnessTexture = false; + config.hasSpecularGlossinessTexture = false; + config.hasTextureTransforms = false; + config.hasTransmission = false; + config.hasTransmissionTexture = false; + config.hasVolume = false; + config.hasVolumeThicknessTexture = false; + + config.hasVertexColors = false; + config.hasVolume = false; + // config.enableDiagnostics = true; + + filament::gltfio::UvMap uvmap; + auto materialInstance = _ubershaderProvider->createMaterialInstance(&config, &uvmap); + materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4 { 1.0f, 0.0f, 0.0f, 1.0f }); + // auto materialInstance = _unlitMaterialProvider->createMaterialInstance(&config, &uvmap); + builder.material(0, materialInstance); + + } + + builder.build(*_engine, renderable); + + _scene->addEntity(renderable); + + auto entityId = Entity::smuggle(renderable); + + _geometry.emplace(entityId, std::move(geometry)); + + return entityId; + } + EntityId SceneManager::createGeometry( float *vertices, uint32_t numVertices, @@ -2382,38 +2458,7 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v const char *materialPath, bool keepData ) { - - auto geometry = new CustomGeometry(vertices, numVertices, indices, numIndices, primitiveType, _engine); - - filament::Material* mat = nullptr; - if (materialPath) { - auto matData = _resourceLoaderWrapper->load(materialPath); - mat = Material::Builder().package(matData.data, matData.size).build(*_engine); - _resourceLoaderWrapper->free(matData); - } - - auto renderable = utils::EntityManager::get().create(); - RenderableManager::Builder builder(1); - - builder.boundingBox(geometry->getBoundingBox()) - .geometry(0, primitiveType, geometry->vertexBuffer(), geometry->indexBuffer(), 0, numIndices) - .culling(true) - .receiveShadows(false) - .castShadows(false); - - if (mat) { - builder.material(0, mat->getDefaultInstance()); - } - - builder.build(*_engine, renderable); - - _scene->addEntity(renderable); - - auto entityId = Entity::smuggle(renderable); - - _geometry.emplace(entityId, geometry); - - return entityId; + return createGeometryWithNormals(vertices, numVertices, nullptr, 0, indices, numIndices, primitiveType, materialPath, keepData); } } // namespace thermion_filament From d43fbd8964ee317b37e6fb9eb18a0ac1ece5c853 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 19:59:25 +0800 Subject: [PATCH 111/232] add loadGlbFromBuffer implementation to ThermionViewerFFI --- .../thermion_dart/thermion_viewer_ffi.dart | 65 ++++++++++++++++--- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index 7123f0a6..3aba6d8e 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -455,6 +455,31 @@ class ThermionViewerFFI extends ThermionViewer { return entity; } + /// + /// + /// + @override + Future loadGlbFromBuffer(Uint8List data, + {bool unlit = false, int numInstances = 1, bool keepData = false}) async { + if (unlit) { + throw Exception("Not yet implemented"); + } + + var entity = await withIntCallback((callback) => load_glb_from_buffer_ffi( + _sceneManager!, + data.address, + data.length, + numInstances, + keepData, + callback)); + + if (entity == _FILAMENT_ASSET_ERROR) { + throw Exception("An error occurred loading GLB from buffer"); + } + _scene!.registerEntity(entity); + return entity; + } + /// /// /// @@ -1739,6 +1764,8 @@ class ThermionViewerFFI extends ThermionViewer { Future createGeometry( List vertices, List indices, {String? materialPath, + List? normals, + bool keepData = false, PrimitiveType primitiveType = PrimitiveType.TRIANGLES}) async { if (_viewer == null) { throw Exception("Viewer must not be null"); @@ -1749,22 +1776,36 @@ class ThermionViewerFFI extends ThermionViewer { final vertexPtr = allocator(vertices.length); final indicesPtr = allocator(indices.length); for (int i = 0; i < vertices.length; i++) { - vertexPtr.elementAt(i).value = vertices[i]; + vertexPtr[i] = vertices[i]; } for (int i = 0; i < indices.length; i++) { (indicesPtr + i).value = indices[i]; } - var entity = await withIntCallback((callback) => create_geometry_ffi( - _sceneManager!, - vertexPtr, - vertices.length, - indicesPtr, - indices.length, - primitiveType.index, - materialPathPtr.cast(), - callback)); + var normalsPtr = nullptr.cast(); + if (normals != null) { + normalsPtr = allocator(normals.length); + for (int i = 0; i < normals.length; i++) { + normalsPtr[i] = normals[i]; + } + } + + print("ALLOCATION DONE"); + + var entity = await withIntCallback((callback) => + create_geometry_with_normals_ffi( + _sceneManager!, + vertexPtr, + vertices.length, + normalsPtr, + normals?.length ?? 0, + indicesPtr, + indices.length, + primitiveType.index, + materialPathPtr.cast(), + keepData, + callback)); if (entity == _FILAMENT_ASSET_ERROR) { throw Exception("Failed to create geometry"); } @@ -1775,6 +1816,10 @@ class ThermionViewerFFI extends ThermionViewer { allocator.free(vertexPtr); allocator.free(indicesPtr); + if (normals != null) { + allocator.free(normalsPtr); + } + return entity; } From 59957650aa893879db484bf6ef36140648cfeaee Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 19:59:33 +0800 Subject: [PATCH 112/232] update bindings --- .../compatibility/native/thermion_dart.g.dart | 58 ++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart index e23e1663..1f55f8e2 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart @@ -1037,6 +1037,29 @@ external int create_geometry( ffi.Pointer materialPath, ); +@ffi.Native< + EntityId Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer)>() +external int create_geometry_with_normals( + ffi.Pointer sceneManager, + ffi.Pointer vertices, + int numVertices, + ffi.Pointer normals, + int numNormals, + ffi.Pointer indices, + int numIndices, + int primitiveType, + ffi.Pointer materialPath, +); + @ffi.Native, EntityId)>() external int get_parent( ffi.Pointer sceneManager, @@ -1401,14 +1424,14 @@ external void load_glb_ffi( @ffi.Native< ffi.Void Function( ffi.Pointer, - ffi.Pointer, + ffi.Pointer, ffi.Size, ffi.Int, ffi.Bool, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void load_glb_from_buffer_ffi( ffi.Pointer sceneManager, - ffi.Pointer data, + ffi.Pointer data, int length, int numInstances, bool keepData, @@ -1605,6 +1628,7 @@ external void reset_to_rest_pose_ffi( ffi.Int, ffi.Int, ffi.Pointer, + ffi.Bool, ffi.Pointer>)>() external void create_geometry_ffi( ffi.Pointer sceneManager, @@ -1614,6 +1638,34 @@ external void create_geometry_ffi( int numIndices, int primitiveType, ffi.Pointer materialPath, + bool keepData, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer, + ffi.Bool, + ffi.Pointer>)>() +external void create_geometry_with_normals_ffi( + ffi.Pointer sceneManager, + ffi.Pointer vertices, + int numVertices, + ffi.Pointer normals, + int numNormals, + ffi.Pointer indices, + int numIndices, + int primitiveType, + ffi.Pointer materialPath, + bool keepData, ffi.Pointer> callback, ); From 66f10b598a08eaa98bd7d61d0fdb03d14aa6a25d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 19:59:43 +0800 Subject: [PATCH 113/232] update stub ThermionViewer --- .../thermion_dart/thermion_viewer_stub.dart | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart index e6119d1e..9cba4d0c 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart @@ -803,4 +803,46 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement setGizmoVisibility throw UnimplementedError(); } + + @override + Future getAncestor(ThermionEntity entity) { + // TODO: implement getAncestor + throw UnimplementedError(); + } + + @override + Future loadGlbFromBuffer(Uint8List data, {int numInstances = 1, bool keepData = false}) { + // TODO: implement loadGlbFromBuffer + throw UnimplementedError(); + } + + @override + Future queuePositionUpdateFromViewportCoords(ThermionEntity entity, double x, double y) { + // TODO: implement queuePositionUpdateFromViewportCoords + throw UnimplementedError(); + } + + @override + Future removeStencilHighlight(ThermionEntity entity) { + // TODO: implement removeStencilHighlight + throw UnimplementedError(); + } + + @override + Future setLightDirection(ThermionEntity lightEntity, Vector3 direction) { + // TODO: implement setLightDirection + throw UnimplementedError(); + } + + @override + Future setLightPosition(ThermionEntity lightEntity, double x, double y, double z) { + // TODO: implement setLightPosition + throw UnimplementedError(); + } + + @override + Future setStencilHighlight(ThermionEntity entity, {double r = 1.0, double g = 0.0, double b = 0.0}) { + // TODO: implement setStencilHighlight + throw UnimplementedError(); + } } From f51c640d17d7f1888c03bb895878b2482104dcda Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 20:01:21 +0800 Subject: [PATCH 114/232] remove unused get_camera_position method --- thermion_dart/native/include/ThermionDartApi.h | 1 - 1 file changed, 1 deletion(-) diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 489dedb2..6fc50923 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -209,7 +209,6 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(const void *const viewer, bool enabled); EMSCRIPTEN_KEEPALIVE void set_camera_exposure(const void *const viewer, float aperture, float shutterSpeed, float sensitivity); EMSCRIPTEN_KEEPALIVE void set_camera_position(const void *const viewer, float x, float y, float z); - EMSCRIPTEN_KEEPALIVE void get_camera_position(const void *const viewer); EMSCRIPTEN_KEEPALIVE void set_camera_rotation(const void *const viewer, float w, float x, float y, float z); EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(const void *const viewer, const float *const matrix); EMSCRIPTEN_KEEPALIVE const double *const get_camera_model_matrix(const void *const viewer); From d766733489c196890e16bb93862d3065af026c48 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:03:53 +0800 Subject: [PATCH 115/232] update stubbed ThermionViewer methods --- .../thermion_dart/thermion_viewer_stub.dart | 62 +++++++++++++------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart index 9cba4d0c..118c1746 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart @@ -75,13 +75,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future createGeometry(List vertices, List indices, - {String? materialPath, - PrimitiveType primitiveType = PrimitiveType.TRIANGLES}) { - // TODO: implement createGeometry - throw UnimplementedError(); - } @override Future createInstance(ThermionEntity entity) { @@ -267,19 +260,6 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement initialized Future get initialized => throw UnimplementedError(); - @override - Future loadGlb(String path, {int numInstances = 1}) { - // TODO: implement loadGlb - throw UnimplementedError(); - } - - @override - Future loadGltf(String path, String relativeResourcePath, - {bool force = false}) { - // TODO: implement loadGltf - throw UnimplementedError(); - } - @override Future loadIbl(String lightingPath, {double intensity = 30000}) { // TODO: implement loadIbl @@ -845,4 +825,46 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement setStencilHighlight throw UnimplementedError(); } + + @override + Future getCameraNear() { + // TODO: implement getCameraNear + throw UnimplementedError(); + } + + @override + Future getViewportBoundingBox(ThermionEntity entity) { + // TODO: implement getViewportBoundingBox + throw UnimplementedError(); + } + + @override + Future setCameraLensProjection(double near, double far, double aspect, double focalLength) { + // TODO: implement setCameraLensProjection + throw UnimplementedError(); + } + + @override + Future setCameraModelMatrix4(Matrix4 matrix) { + // TODO: implement setCameraModelMatrix4 + throw UnimplementedError(); + } + + @override + Future createGeometry(List vertices, List indices, {String? materialPath, List? normals, PrimitiveType primitiveType = PrimitiveType.TRIANGLES}) { + // TODO: implement createGeometry + throw UnimplementedError(); + } + + @override + Future loadGlb(String path, {int numInstances = 1, bool keepData = false}) { + // TODO: implement loadGlb + throw UnimplementedError(); + } + + @override + Future loadGltf(String path, String relativeResourcePath, {bool keepData = false}) { + // TODO: implement loadGltf + throw UnimplementedError(); + } } From d5bc865cf40614176e6c4a6bf5e8e0711d7038de Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:04:02 +0800 Subject: [PATCH 116/232] add matrix helper --- .../lib/thermion_dart/matrix_helper.dart | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 thermion_dart/lib/thermion_dart/matrix_helper.dart diff --git a/thermion_dart/lib/thermion_dart/matrix_helper.dart b/thermion_dart/lib/thermion_dart/matrix_helper.dart new file mode 100644 index 00000000..d384fc1b --- /dev/null +++ b/thermion_dart/lib/thermion_dart/matrix_helper.dart @@ -0,0 +1,37 @@ +// Helper function to convert double4x4 to Matrix4 +import 'package:thermion_dart/thermion_dart/compatibility/native/thermion_dart.g.dart'; +import 'package:vector_math/vector_math_64.dart'; +import 'dart:ffi'; + +Matrix4 double4x4ToMatrix4(double4x4 mat) { + return Matrix4.fromList([ + mat.col1[0], + mat.col1[1], + mat.col1[2], + mat.col1[3], + mat.col2[0], + mat.col2[1], + mat.col2[2], + mat.col2[3], + mat.col3[0], + mat.col3[1], + mat.col3[2], + mat.col3[3], + mat.col4[0], + mat.col4[1], + mat.col4[2], + mat.col4[3], + ]); +} + +double4x4 matrix4ToDouble4x4(Matrix4 mat, double4x4 out) { + + for (int i = 0; i < 4; i++) { + out.col1[i] = mat.storage[i]; + out.col2[i] = mat.storage[i + 4]; + out.col3[i] = mat.storage[i + 8]; + out.col4[i] = mat.storage[i + 12]; + } + + return out; +} \ No newline at end of file From 6aadbbc3d099c0f7977ec74b0d4c620f00e75d65 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:04:27 +0800 Subject: [PATCH 117/232] remove update_viewport_and_camera_projection_ffi --- .../native/src/ThermionDartFFIApi.cpp | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/thermion_dart/native/src/ThermionDartFFIApi.cpp b/thermion_dart/native/src/ThermionDartFFIApi.cpp index a9ca6517..6f1df24c 100644 --- a/thermion_dart/native/src/ThermionDartFFIApi.cpp +++ b/thermion_dart/native/src/ThermionDartFFIApi.cpp @@ -316,26 +316,6 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void update_viewport_and_camera_projection_ffi( - void *const viewer, const uint32_t width, const uint32_t height, - const float scaleFactor, - void (*onComplete)()) - { - Log("Update viewport %dx%d", width, height); - std::packaged_task lambda([=]() mutable - { - update_viewport_and_camera_projection(viewer, width, height, scaleFactor); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, onComplete); - #else - onComplete(); - #endif - }); - auto fut = _rl->add_task(lambda); - } - EMSCRIPTEN_KEEPALIVE void set_rendering_ffi(void *const viewer, bool rendering, void (*callback)()) { From 83d9c5be30c43574af5b8177b848a3588ae58140 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:04:36 +0800 Subject: [PATCH 118/232] remove update_viewport_and_camera_projection_ffi --- thermion_dart/native/include/ThermionDartFFIApi.h | 1 - 1 file changed, 1 deletion(-) diff --git a/thermion_dart/native/include/ThermionDartFFIApi.h b/thermion_dart/native/include/ThermionDartFFIApi.h index 8a0cac21..b4ae938e 100644 --- a/thermion_dart/native/include/ThermionDartFFIApi.h +++ b/thermion_dart/native/include/ThermionDartFFIApi.h @@ -34,7 +34,6 @@ extern "C" EMSCRIPTEN_KEEPALIVE FilamentRenderCallback make_render_callback_fn_pointer(FilamentRenderCallback); EMSCRIPTEN_KEEPALIVE void set_rendering_ffi(void *const viewer, bool rendering, void(*onComplete)()); EMSCRIPTEN_KEEPALIVE void set_frame_interval_ffi(void *const viewer, float frameInterval); - EMSCRIPTEN_KEEPALIVE void update_viewport_and_camera_projection_ffi(void *const viewer, const uint32_t width, const uint32_t height, const float scaleFactor, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE void set_background_color_ffi(void *const viewer, const float r, const float g, const float b, const float a); EMSCRIPTEN_KEEPALIVE void clear_background_image_ffi(void *const viewer); EMSCRIPTEN_KEEPALIVE void set_background_image_ffi(void *const viewer, const char *path, bool fillHeight, void (*onComplete)()); From 9fbcc9edafeff06cf100373e653c2e6f2e9a3675 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:04:57 +0800 Subject: [PATCH 119/232] mark all ffigen functions as leaf --- thermion_dart/ffigen/native.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/thermion_dart/ffigen/native.yaml b/thermion_dart/ffigen/native.yaml index cb79e560..20ad4ff0 100644 --- a/thermion_dart/ffigen/native.yaml +++ b/thermion_dart/ffigen/native.yaml @@ -13,3 +13,8 @@ headers: ffi-native: assetId: package:thermion_dart/thermion_dart.dart ignore-source-errors: true +functions: + leaf: + include: + - '.*' + From 141827c59cd6e354def5d183c68fafc7d9d45c53 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:05:40 +0800 Subject: [PATCH 120/232] use opaque CameraPtr to set camera matrices/properties/etc --- thermion_dart/native/src/ThermionDartApi.cpp | 355 ++++++++++--------- 1 file changed, 185 insertions(+), 170 deletions(-) diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 70981112..e4464a00 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -4,7 +4,6 @@ #endif #include "ResourceBuffer.hpp" - #include "FilamentViewer.hpp" #include "filament/LightManager.h" #include "Log.hpp" @@ -13,21 +12,42 @@ #include #include -using namespace thermion_filament; - #ifdef __EMSCRIPTEN__ #include #endif +using namespace thermion_filament; + extern "C" { #include "ThermionDartApi.h" + // Helper function to convert filament::math::mat4 to double4x4 + static double4x4 convert_mat4_to_double4x4(const filament::math::mat4 &mat) + { + return double4x4{ + {mat[0][0], mat[0][1], mat[0][2], mat[0][3]}, + {mat[1][0], mat[1][1], mat[1][2], mat[1][3]}, + {mat[2][0], mat[2][1], mat[2][2], mat[2][3]}, + {mat[3][0], mat[3][1], mat[3][2], mat[3][3]}, + }; + } + + // Helper function to convert double4x4 to filament::math::mat4 + static filament::math::mat4 convert_double4x4_to_mat4(const double4x4& d_mat) + { + return filament::math::mat4{ + filament::math::float4{float(d_mat.col1[0]), float(d_mat.col1[1]), float(d_mat.col1[2]), float(d_mat.col1[3])}, + filament::math::float4{float(d_mat.col2[0]), float(d_mat.col2[1]), float(d_mat.col2[2]), float(d_mat.col2[3])}, + filament::math::float4{float(d_mat.col3[0]), float(d_mat.col3[1]), float(d_mat.col3[2]), float(d_mat.col3[3])}, + filament::math::float4{float(d_mat.col4[0]), float(d_mat.col4[1]), float(d_mat.col4[2]), float(d_mat.col4[3])} + }; + } EMSCRIPTEN_KEEPALIVE const void *create_filament_viewer(const void *context, const void *const loader, void *const platform, const char *uberArchivePath) { - const auto * loaderImpl = new ResourceLoaderWrapperImpl((ResourceLoaderWrapper*)loader); + const auto *loaderImpl = new ResourceLoaderWrapperImpl((ResourceLoaderWrapper *)loader); auto viewer = (const void *)new FilamentViewer(context, loaderImpl, platform, uberArchivePath); return viewer; } @@ -77,8 +97,9 @@ extern "C" ((FilamentViewer *)viewer)->loadSkybox(skyboxPath); } - EMSCRIPTEN_KEEPALIVE void create_ibl(const void *const viewer, float r, float g, float b, float intensity) { - ((FilamentViewer*)viewer)->createIbl(r, g, b, intensity); + EMSCRIPTEN_KEEPALIVE void create_ibl(const void *const viewer, float r, float g, float b, float intensity) + { + ((FilamentViewer *)viewer)->createIbl(r, g, b, intensity); } EMSCRIPTEN_KEEPALIVE void load_ibl(const void *const viewer, const char *iblPath, float intensity) @@ -111,16 +132,16 @@ extern "C" } EMSCRIPTEN_KEEPALIVE EntityId add_light( - const void *const viewer, - uint8_t type, - float colour, - float intensity, - float posX, - float posY, - float posZ, - float dirX, - float dirY, - float dirZ, + const void *const viewer, + uint8_t type, + float colour, + float intensity, + float posX, + float posY, + float posZ, + float dirX, + float dirY, + float dirZ, float falloffRadius, float spotLightConeInner, float spotLightConeOuter, @@ -129,31 +150,17 @@ extern "C" float sunHaloFallof, bool shadows) { - return ((FilamentViewer *)viewer)->addLight( - (LightManager::Type)type, - colour, - intensity, - posX, - posY, - posZ, - dirX, - dirY, - dirZ, - falloffRadius, - spotLightConeInner, - spotLightConeOuter, - sunAngularRadius, - sunHaloSize, - sunHaloFallof, - shadows); + return ((FilamentViewer *)viewer)->addLight((LightManager::Type)type, colour, intensity, posX, posY, posZ, dirX, dirY, dirZ, falloffRadius, spotLightConeInner, spotLightConeOuter, sunAngularRadius, sunHaloSize, sunHaloFallof, shadows); } - EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, int32_t entityId, float x, float y, float z) { - ((FilamentViewer*)viewer)->setLightPosition(entityId, x, y, z); + EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, int32_t entityId, float x, float y, float z) + { + ((FilamentViewer *)viewer)->setLightPosition(entityId, x, y, z); } - EMSCRIPTEN_KEEPALIVE void set_light_direction(const void *const viewer, int32_t entityId, float x, float y, float z) { - ((FilamentViewer*)viewer)->setLightDirection(entityId, x, y, z); + EMSCRIPTEN_KEEPALIVE void set_light_direction(const void *const viewer, int32_t entityId, float x, float y, float z) + { + ((FilamentViewer *)viewer)->setLightDirection(entityId, x, y, z); } EMSCRIPTEN_KEEPALIVE void remove_light(const void *const viewer, int32_t entityId) @@ -211,70 +218,82 @@ extern "C" return ((FilamentViewer *)viewer)->setCamera(asset, nodeName); } - EMSCRIPTEN_KEEPALIVE float get_camera_fov(const void *const viewer, bool horizontal) { - return ((FilamentViewer*)viewer)->getCameraFov(horizontal); + EMSCRIPTEN_KEEPALIVE float get_camera_fov(CameraPtr* camera, bool horizontal) + { + auto cam = reinterpret_cast(camera); + return cam->getFieldOfViewInDegrees(horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); } - EMSCRIPTEN_KEEPALIVE void set_camera_fov(const void *const viewer, float fovInDegrees, bool horizontal) - { - return ((FilamentViewer *)viewer)->setCameraFov(double(fovInDegrees), horizontal); + EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(CameraPtr* const camera) { + auto cam = reinterpret_cast(camera); + return cam->getFocalLength(); } - const double *const get_camera_model_matrix(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(CameraPtr* camera, double fovInDegrees, double aspect, double near, double far, bool horizontal) { - const auto &modelMatrix = ((FilamentViewer *)viewer)->getCameraModelMatrix(); - double *array = (double *)calloc(16, sizeof(double)); - memcpy(array, modelMatrix.asArray(), 16 * sizeof(double)); - return array; + auto cam = reinterpret_cast(camera); + cam->setProjection(fovInDegrees, aspect, near, far, horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); } - const double *const get_camera_view_matrix(const void *const viewer) - { - const auto &matrix = ((FilamentViewer *)viewer)->getCameraViewMatrix(); - double *array = (double *)calloc(16, sizeof(double)); - memcpy(array, matrix.asArray(), 16 * sizeof(double)); - return array; + EMSCRIPTEN_KEEPALIVE CameraPtr* get_camera(const void *const viewer, EntityId entity) { + auto filamentCamera = ((FilamentViewer*)viewer)->getCamera(entity); + return reinterpret_cast(filamentCamera); } - const double *const get_camera_projection_matrix(const void *const viewer) + double4x4 get_camera_model_matrix(CameraPtr* camera) { - const auto &matrix = ((FilamentViewer *)viewer)->getCameraProjectionMatrix(); - double *array = (double *)calloc(16, sizeof(double)); - memcpy(array, matrix.asArray(), 16 * sizeof(double)); - return array; + const auto &mat = reinterpret_cast(camera)->getModelMatrix(); + return convert_mat4_to_double4x4(mat); } - const double *const get_camera_culling_projection_matrix(const void *const viewer) + double4x4 get_camera_view_matrix(CameraPtr* camera) { - const auto &matrix = ((FilamentViewer *)viewer)->getCameraCullingProjectionMatrix(); - double *array = (double *)calloc(16, sizeof(double)); - memcpy(array, matrix.asArray(), 16 * sizeof(double)); - return array; + const auto &mat = reinterpret_cast(camera)->getViewMatrix(); + return convert_mat4_to_double4x4(mat); } - void set_camera_projection_matrix(const void *const viewer, const double *const matrix, double near, double far) + double4x4 get_camera_projection_matrix(CameraPtr* camera) { - ((FilamentViewer *)viewer)->setCameraProjectionMatrix(matrix, near, far); + const auto &mat = reinterpret_cast(camera)->getProjectionMatrix(); + return convert_mat4_to_double4x4(mat); } - void set_camera_culling(const void *const viewer, double near, double far) + double4x4 get_camera_culling_projection_matrix(CameraPtr* camera) { - ((FilamentViewer *)viewer)->setCameraCulling(near, far); + const auto &mat = reinterpret_cast(camera)->getCullingProjectionMatrix(); + return convert_mat4_to_double4x4(mat); } - double get_camera_culling_near(const void *const viewer) + void set_camera_projection_matrix(CameraPtr* camera, double4x4 matrix, double near, double far) { - return ((FilamentViewer *)viewer)->getCameraCullingNear(); + auto cam = reinterpret_cast(camera); + const auto& mat = convert_double4x4_to_mat4(matrix); + cam->setCustomProjection(mat, near, far); } - double get_camera_culling_far(const void *const viewer) + void set_camera_lens_projection(CameraPtr* camera, double near, double far, double aspect, double focalLength) { - return ((FilamentViewer *)viewer)->getCameraCullingFar(); + auto cam = reinterpret_cast(camera); + cam->setLensProjection(focalLength, aspect, near, far); } - const double *const get_camera_frustum(const void *const viewer) + double get_camera_near(CameraPtr* camera) { - const auto frustum = ((FilamentViewer *)viewer)->getCameraFrustum(); + auto cam = reinterpret_cast(camera); + return cam->getNear(); + } + + double get_camera_culling_far(CameraPtr* camera) + { + auto cam = reinterpret_cast(camera); + return cam->getCullingFar(); + } + + const double *const get_camera_frustum(CameraPtr* camera) + { + + const auto frustum = reinterpret_cast(camera)->getFrustum(); + const math::float4 *planes = frustum.getNormalizedPlanes(); double *array = (double *)calloc(24, sizeof(double)); for (int i = 0; i < 6; i++) @@ -299,39 +318,23 @@ extern "C" ((FilamentViewer *)viewer)->setViewFrustumCulling(enabled); } - EMSCRIPTEN_KEEPALIVE void move_camera_to_asset(const void *const viewer, EntityId asset) + EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(CameraPtr* camera, float distance) { - ((FilamentViewer *)viewer)->moveCameraToAsset(asset); + auto * cam = reinterpret_cast(camera); + cam->setFocusDistance(distance); } - EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(const void *const viewer, float distance) + EMSCRIPTEN_KEEPALIVE void set_camera_exposure(CameraPtr* camera, float aperture, float shutterSpeed, float sensitivity) { - ((FilamentViewer *)viewer)->setCameraFocusDistance(distance); + auto * cam = reinterpret_cast(camera); + cam->setExposure(aperture, shutterSpeed, sensitivity); } - EMSCRIPTEN_KEEPALIVE void set_camera_exposure(const void *const viewer, float aperture, float shutterSpeed, float sensitivity) + EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(CameraPtr* camera, double4x4 matrix) { - ((FilamentViewer *)viewer)->setCameraExposure(aperture, shutterSpeed, sensitivity); - } - - EMSCRIPTEN_KEEPALIVE void set_camera_position(const void *const viewer, float x, float y, float z) - { - ((FilamentViewer *)viewer)->setCameraPosition(x, y, z); - } - - EMSCRIPTEN_KEEPALIVE void set_camera_rotation(const void *const viewer, float w, float x, float y, float z) - { - ((FilamentViewer *)viewer)->setCameraRotation(w, x, y, z); - } - - EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(const void *const viewer, const float *const matrix) - { - ((FilamentViewer *)viewer)->setCameraModelMatrix(matrix); - } - - EMSCRIPTEN_KEEPALIVE void set_camera_focal_length(const void *const viewer, float focalLength) - { - ((FilamentViewer *)viewer)->setCameraFocalLength(focalLength); + auto * cam = reinterpret_cast(camera); + const filament::math::mat4& mat = convert_double4x4_to_mat4(matrix); + cam->setModelMatrix(mat); } EMSCRIPTEN_KEEPALIVE void render( @@ -345,11 +348,12 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void capture( - const void *const viewer, - uint8_t *pixelBuffer, - void (*callback)(void)) { - ((FilamentViewer *)viewer)->capture(pixelBuffer, callback); - }; + const void *const viewer, + uint8_t *pixelBuffer, + void (*callback)(void)) + { + ((FilamentViewer *)viewer)->capture(pixelBuffer, callback); + }; EMSCRIPTEN_KEEPALIVE void set_frame_interval( const void *const viewer, @@ -368,9 +372,9 @@ extern "C" ((FilamentViewer *)viewer)->createSwapChain(window, width, height); } - EMSCRIPTEN_KEEPALIVE void update_viewport_and_camera_projection(const void *const viewer, uint32_t width, uint32_t height, float scaleFactor) + EMSCRIPTEN_KEEPALIVE void update_viewport(const void *const viewer, uint32_t width, uint32_t height) { - return ((FilamentViewer *)viewer)->updateViewportAndCameraProjection(width, height, scaleFactor); + return ((FilamentViewer *)viewer)->updateViewport(width, height); } EMSCRIPTEN_KEEPALIVE void scroll_update(const void *const viewer, float x, float y, float delta) @@ -440,7 +444,8 @@ extern "C" return result; } - EMSCRIPTEN_KEEPALIVE void clear_morph_animation(void* sceneManager, EntityId asset) { + EMSCRIPTEN_KEEPALIVE void clear_morph_animation(void *sceneManager, EntityId asset) + { ((SceneManager *)sceneManager)->clearMorphAnimationBuffer(asset); } @@ -490,14 +495,16 @@ extern "C" } EMSCRIPTEN_KEEPALIVE EntityId get_bone(void *sceneManager, - EntityId entityId, - int skinIndex, - int boneIndex) { - return ((SceneManager*)sceneManager)->getBone(entityId, skinIndex, boneIndex); + EntityId entityId, + int skinIndex, + int boneIndex) + { + return ((SceneManager *)sceneManager)->getBone(entityId, skinIndex, boneIndex); } EMSCRIPTEN_KEEPALIVE void get_world_transform(void *sceneManager, - EntityId entityId, float* const out) { - auto transform = ((SceneManager*)sceneManager)->getWorldTransform(entityId); + EntityId entityId, float *const out) + { + auto transform = ((SceneManager *)sceneManager)->getWorldTransform(entityId); out[0] = transform[0][0]; out[1] = transform[0][1]; out[2] = transform[0][2]; @@ -517,8 +524,9 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void get_local_transform(void *sceneManager, - EntityId entityId, float* const out) { - auto transform = ((SceneManager*)sceneManager)->getLocalTransform(entityId); + EntityId entityId, float *const out) + { + auto transform = ((SceneManager *)sceneManager)->getLocalTransform(entityId); out[0] = transform[0][0]; out[1] = transform[0][1]; out[2] = transform[0][2]; @@ -538,26 +546,32 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(void *sceneManager, - EntityId entityId, int skinIndex, float* const out, int numBones) { - const auto transforms = ((SceneManager*)sceneManager)->getBoneRestTranforms(entityId, skinIndex); + EntityId entityId, int skinIndex, float *const out, int numBones) + { + const auto transforms = ((SceneManager *)sceneManager)->getBoneRestTranforms(entityId, skinIndex); auto numTransforms = transforms->size(); - if(numTransforms != numBones) { + if (numTransforms != numBones) + { Log("Error - %d bone transforms available but you only specified %d.", numTransforms, numBones); return; } - for(int boneIndex = 0; boneIndex < numTransforms; boneIndex++) { + for (int boneIndex = 0; boneIndex < numTransforms; boneIndex++) + { const auto transform = transforms->at(boneIndex); - for(int colNum = 0; colNum < 4; colNum++) { - for(int rowNum = 0; rowNum < 4; rowNum++) { + for (int colNum = 0; colNum < 4; colNum++) + { + for (int rowNum = 0; rowNum < 4; rowNum++) + { out[(boneIndex * 16) + (colNum * 4) + rowNum] = transform[colNum][rowNum]; } } - } + } } - + EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(void *sceneManager, - EntityId entityId, int skinIndex, int boneIndex, float* const out) { - auto transform = ((SceneManager*)sceneManager)->getInverseBindMatrix(entityId, skinIndex, boneIndex); + EntityId entityId, int skinIndex, int boneIndex, float *const out) + { + auto transform = ((SceneManager *)sceneManager)->getInverseBindMatrix(entityId, skinIndex, boneIndex); out[0] = transform[0][0]; out[1] = transform[0][1]; out[2] = transform[0][2]; @@ -647,21 +661,25 @@ extern "C" strcpy(outPtr, name.c_str()); } - EMSCRIPTEN_KEEPALIVE int get_bone_count(void *sceneManager, EntityId assetEntity, int skinIndex) { + EMSCRIPTEN_KEEPALIVE int get_bone_count(void *sceneManager, EntityId assetEntity, int skinIndex) + { auto names = ((SceneManager *)sceneManager)->getBoneNames(assetEntity, skinIndex); return names->size(); } - EMSCRIPTEN_KEEPALIVE void get_bone_names(void *sceneManager, EntityId assetEntity, const char** out, int skinIndex) { + EMSCRIPTEN_KEEPALIVE void get_bone_names(void *sceneManager, EntityId assetEntity, const char **out, int skinIndex) + { auto names = ((SceneManager *)sceneManager)->getBoneNames(assetEntity, skinIndex); - for(int i = 0; i < names->size(); i++) { + for (int i = 0; i < names->size(); i++) + { auto name_c = names->at(i).c_str(); - memcpy((void*)out[i], name_c, strlen(name_c) + 1); + memcpy((void *)out[i], name_c, strlen(name_c) + 1); } } - EMSCRIPTEN_KEEPALIVE bool set_transform(void* sceneManager, EntityId entityId, const float* const transform) { - auto matrix = math::mat4f( + EMSCRIPTEN_KEEPALIVE bool set_transform(void *sceneManager, EntityId entityId, const float *const transform) + { + auto matrix = math::mat4f( transform[0], transform[1], transform[2], transform[3], transform[4], @@ -676,11 +694,12 @@ extern "C" transform[13], transform[14], transform[15]); - return ((SceneManager*)sceneManager)->setTransform(entityId, matrix); + return ((SceneManager *)sceneManager)->setTransform(entityId, matrix); } - EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(void* sceneManager, EntityId entityId) { - return ((SceneManager*)sceneManager)->updateBoneMatrices(entityId); + EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(void *sceneManager, EntityId entityId) + { + return ((SceneManager *)sceneManager)->updateBoneMatrices(entityId); } EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(void *sceneManager, EntityId assetEntity, EntityId childEntity) @@ -736,7 +755,8 @@ extern "C" ((SceneManager *)sceneManager)->queuePositionUpdate(asset, x, y, z, relative); } - EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(void *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z) { + EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(void *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z) + { ((SceneManager *)sceneManager)->queueRelativePositionUpdateWorldAxis(entity, viewportX, viewportY, x, y, z); } @@ -745,7 +765,8 @@ extern "C" ((SceneManager *)sceneManager)->queueRotationUpdate(asset, rads, x, y, z, w, relative); } - EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(void *sceneManager, EntityId entity, float viewportX, float viewportY) { + EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(void *sceneManager, EntityId entity, float viewportX, float viewportY) + { ((SceneManager *)sceneManager)->queueRelativePositionUpdateFromViewportVector(entity, viewportX, viewportY); } @@ -823,7 +844,7 @@ extern "C" { return ((SceneManager *)sceneManager)->addAnimationComponent(entityId); } - + EMSCRIPTEN_KEEPALIVE void remove_animation_component(void *const sceneManager, EntityId entityId) { ((SceneManager *)sceneManager)->removeAnimationComponent(entityId); @@ -831,26 +852,12 @@ extern "C" EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) { - return ((SceneManager *)sceneManager)->createGeometry( - vertices, - (uint32_t)numVertices, - indices, - numIndices, - (filament::RenderableManager::PrimitiveType)primitiveType, - materialPath); + return ((SceneManager *)sceneManager)->createGeometry(vertices, (uint32_t)numVertices, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, materialPath); } EMSCRIPTEN_KEEPALIVE EntityId create_geometry_with_normals(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) { - return ((SceneManager *)sceneManager)->createGeometryWithNormals( - vertices, - (uint32_t)numVertices, - normals, - (uint32_t)numNormals, - indices, - numIndices, - (filament::RenderableManager::PrimitiveType)primitiveType, - materialPath); + return ((SceneManager *)sceneManager)->createGeometryWithNormals(vertices, (uint32_t)numVertices, normals, (uint32_t)numNormals, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, materialPath); } EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(void *const sceneManager, const EntityId parent, const char *name) @@ -864,7 +871,8 @@ extern "C" return ((SceneManager *)sceneManager)->getParent(child); } - EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child) { + EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child) + { return ((SceneManager *)sceneManager)->getAncestor(child); } @@ -892,40 +900,47 @@ extern "C" out[3] = Entity::smuggle(gizmo->center()); } - EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity) { + EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity) + { return ((SceneManager *)sceneManager)->getBoundingBox(entity); } - EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float* minX, float* minY, float* maxX, float* maxY) { - auto box =((SceneManager *)sceneManager)->getBoundingBox(entity); + EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float *minX, float *minY, float *maxX, float *maxY) + { + auto box = ((SceneManager *)sceneManager)->getBoundingBox(entity); *minX = box.minX; *minY = box.minY; *maxX = box.maxX; *maxY = box.maxY; } - EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled) { - ((SceneManager*)sceneManager)->setLayerEnabled(layer, enabled); + EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled) + { + ((SceneManager *)sceneManager)->setLayerEnabled(layer, enabled); } - EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void* ptr) { + EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr) + { free(ptr); } - EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)) { - ((SceneManager*)sceneManager)->gizmo->pick(x, y, callback); + EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)) + { + ((SceneManager *)sceneManager)->gizmo->pick(x, y, callback); } - EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible) { - ((SceneManager*)sceneManager)->gizmo->setVisibility(visible); - } - - EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entityId, float r, float g, float b) { - ((SceneManager*)sceneManager)->setStencilHighlight(entityId, r, g, b); + EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible) + { + ((SceneManager *)sceneManager)->gizmo->setVisibility(visible); } - EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entityId) { - ((SceneManager*)sceneManager)->removeStencilHighlight(entityId); + EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entityId, float r, float g, float b) + { + ((SceneManager *)sceneManager)->setStencilHighlight(entityId, r, g, b); } + EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entityId) + { + ((SceneManager *)sceneManager)->removeStencilHighlight(entityId); + } } From d123929fb45c7a0ccd4fbdce2de21eab636d1dad Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:06:06 +0800 Subject: [PATCH 121/232] remove camera methods from FilamentViewer --- .../native/include/FilamentViewer.hpp | 29 ++++--------------- 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index 461f975b..a3a68de6 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -76,7 +76,7 @@ namespace thermion_filament void removeEntity(EntityId asset); void clearEntities(); - void updateViewportAndCameraProjection(int height, int width, float scaleFactor); + void updateViewport(uint32_t width, uint32_t height); void render( uint64_t frameTimeInNanos, void *pixelBuffer, @@ -87,6 +87,7 @@ namespace thermion_filament bool setCamera(EntityId asset, const char *nodeName); void setMainCamera(); EntityId getMainCamera(); + Camera* getCamera(EntityId entity); float getCameraFov(bool horizontal); void setCameraFov(double fovDegrees, bool horizontal); @@ -103,24 +104,8 @@ namespace thermion_filament void clearBackgroundImage(); void setBackgroundImagePosition(float x, float y, bool clamp); - // Camera methods - void moveCameraToAsset(EntityId entityId); void setViewFrustumCulling(bool enabled); - void setCameraExposure(float aperture, float shutterSpeed, float sensitivity); - void setCameraPosition(float x, float y, float z); - void setCameraRotation(float w, float x, float y, float z); - const math::mat4 getCameraModelMatrix(); - const math::mat4 getCameraViewMatrix(); - const math::mat4 getCameraProjectionMatrix(); - const math::mat4 getCameraCullingProjectionMatrix(); - const filament::Frustum getCameraFrustum(); - void setCameraModelMatrix(const float *const matrix); - void setCameraProjectionMatrix(const double *const matrix, double near, double far); - void setCameraFocalLength(float focalLength); - void setCameraCulling(double near, double far); - double getCameraCullingNear(); - double getCameraCullingFar(); - void setCameraFocusDistance(float focusDistance); + void setCameraManipulatorOptions(filament::camutils::Mode mode, double orbitSpeedX, double orbitSpeedY, double zoomSpeed); void grabBegin(float x, float y, bool pan); void grabUpdate(float x, float y); @@ -198,18 +183,14 @@ namespace thermion_filament // Camera properties Camera *_mainCamera = nullptr; // the default camera added to every scene. If you want the *active* camera, access via View. - float _cameraFocalLength = 28.0f; - float _cameraFocusDistance = 0.0f; + Manipulator *_manipulator = nullptr; filament::camutils::Mode _manipulatorMode = filament::camutils::Mode::ORBIT; double _orbitSpeedX = 0.01; double _orbitSpeedY = 0.01; double _zoomSpeed = 0.01; - math::mat4f _cameraPosition; - math::mat4f _cameraRotation; + void _createManipulator(); - double _near = 0.05; - double _far = 1000.0; ColorGrading *colorGrading = nullptr; From a1f71ab459ad0c331bb0a2791d5f7c9785ba117c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:06:32 +0800 Subject: [PATCH 122/232] remove camera methods from FilamentViewer --- thermion_dart/native/src/FilamentViewer.cpp | 218 +------------------- 1 file changed, 8 insertions(+), 210 deletions(-) diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index b8ec4f93..c55aba86 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -190,10 +190,6 @@ namespace thermion_filament _view->setScene(_scene); _view->setCamera(_mainCamera); - _cameraFocalLength = 28.0f; - _mainCamera->setLensProjection(_cameraFocalLength, 1.0f, _near, - _far); - const float aperture = _mainCamera->getAperture(); const float shutterSpeed = _mainCamera->getShutterSpeed(); const float sens = _mainCamera->getSensitivity(); @@ -851,68 +847,6 @@ namespace thermion_filament mtx.unlock(); } - /// - /// Set the exposure for the current active camera. - /// - void FilamentViewer::setCameraExposure(float aperture, float shutterSpeed, float sensitivity) - { - Camera &cam = _view->getCamera(); - cam.setExposure(aperture, shutterSpeed, sensitivity); - } - - /// - /// Set the focal length of the active camera. - /// - void FilamentViewer::setCameraFocalLength(float focalLength) - { - Camera &cam = _view->getCamera(); - _cameraFocalLength = focalLength; - const auto &vp = _view->getViewport(); - if (vp.height == 0) - { - Log("Viewport height has not yet been set, returning"); - return; - } - auto aspect = vp.width / vp.height; - - cam.setLensProjection(_cameraFocalLength, aspect, _near, - _far); - } - - /// - /// Set the focal length of the active camera. - /// - void FilamentViewer::setCameraCulling(double near, double far) - { - Camera &cam = _view->getCamera(); - _near = near; - _far = far; - const auto &vp = _view->getViewport(); - auto aspect = vp.width / vp.height; - cam.setLensProjection(_cameraFocalLength, aspect, _near, _far); - } - - double FilamentViewer::getCameraCullingNear() - { - Camera &cam = _view->getCamera(); - return cam.getNear(); - } - double FilamentViewer::getCameraCullingFar() - { - Camera &cam = _view->getCamera(); - return cam.getCullingFar(); - } - - /// - /// Set the focus distance of the active camera. - /// - void FilamentViewer::setCameraFocusDistance(float focusDistance) - { - Camera &cam = _view->getCamera(); - _cameraFocusDistance = focusDistance; - cam.setFocusDistance(_cameraFocusDistance); - } - /// /// /// @@ -1386,157 +1320,21 @@ namespace thermion_filament this->_recording = recording; } - void FilamentViewer::updateViewportAndCameraProjection( - int width, int height, float contentScaleFactor) + Camera* FilamentViewer::getCamera(EntityId entity) { + return _engine->getCameraComponent(Entity::import(entity)); + } + + void FilamentViewer::updateViewport( + uint32_t width, uint32_t height) { - if (!_view || !_mainCamera) - { - return; - } - - const uint32_t _width = width * contentScaleFactor; - const uint32_t _height = height * contentScaleFactor; - _view->setViewport({0, 0, _width, _height}); - - const double aspect = (double)width / height; - - Camera &cam = _view->getCamera(); - - cam.setLensProjection(_cameraFocalLength, aspect, _near, - _far); - + _view->setViewport({0, 0, width, height}); } void FilamentViewer::setViewFrustumCulling(bool enabled) { _view->setFrustumCullingEnabled(enabled); } - - float FilamentViewer::getCameraFov(bool horizontal) - { - Camera &cam = _view->getCamera(); - return cam.getFieldOfViewInDegrees(horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); - } - - void FilamentViewer::setCameraFov(double fovInDegrees, bool horizontal) - { - Camera &cam = _view->getCamera(); - const auto &vp = _view->getViewport(); - const float aspect = static_cast(vp.width) / static_cast(vp.height); - cam.setProjection(fovInDegrees, aspect, _near, _far, horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); - } - - void FilamentViewer::setCameraPosition(float x, float y, float z) - { - Camera &cam = _view->getCamera(); - - _cameraPosition = math::mat4f::translation(math::float3(x, y, z)); - cam.setModelMatrix(_cameraRotation * _cameraPosition); - } - - void FilamentViewer::moveCameraToAsset(EntityId entityId) - { - auto asset = _sceneManager->getAssetByEntityId(entityId); - if (!asset) - { - Log("Failed to find asset attached to specified entity id."); - return; - } - - const filament::Aabb bb = asset->getBoundingBox(); - auto corners = bb.getCorners(); - Camera &cam = _view->getCamera(); - auto eye = corners.vertices[0] * 1.5; - auto lookAt = corners.vertices[7]; - cam.lookAt(eye, lookAt); - Log("Moved camera to %f %f %f, lookAt %f %f %f, near %f far %f", eye[0], eye[1], eye[2], lookAt[0], lookAt[1], lookAt[2], cam.getNear(), cam.getCullingFar()); - } - - void FilamentViewer::setCameraRotation(float w, float x, float y, float z) - { - Camera &cam = _view->getCamera(); - _cameraRotation = math::mat4f(math::quatf(w, x, y, z)); - cam.setModelMatrix(_cameraRotation * _cameraPosition); - } - - void FilamentViewer::setCameraModelMatrix(const float *const matrix) - { - Camera &cam = _view->getCamera(); - - mat4 modelMatrix( - matrix[0], - matrix[1], - matrix[2], - matrix[3], - matrix[4], - matrix[5], - matrix[6], - matrix[7], - matrix[8], - matrix[9], - matrix[10], - matrix[11], - matrix[12], - matrix[13], - matrix[14], - matrix[15]); - cam.setModelMatrix(modelMatrix); - } - - void FilamentViewer::setCameraProjectionMatrix(const double *const matrix, double near, double far) - { - Camera &cam = _view->getCamera(); - - mat4 projectionMatrix( - matrix[0], - matrix[1], - matrix[2], - matrix[3], - matrix[4], - matrix[5], - matrix[6], - matrix[7], - matrix[8], - matrix[9], - matrix[10], - matrix[11], - matrix[12], - matrix[13], - matrix[14], - matrix[15]); - cam.setCustomProjection(projectionMatrix, projectionMatrix, near, far); - } - - const math::mat4 FilamentViewer::getCameraModelMatrix() - { - const auto &cam = _view->getCamera(); - return cam.getModelMatrix(); - } - - const math::mat4 FilamentViewer::getCameraViewMatrix() - { - const auto &cam = _view->getCamera(); - return cam.getViewMatrix(); - } - - const math::mat4 FilamentViewer::getCameraProjectionMatrix() - { - const auto &cam = _view->getCamera(); - return cam.getProjectionMatrix(); - } - - const math::mat4 FilamentViewer::getCameraCullingProjectionMatrix() - { - const auto &cam = _view->getCamera(); - return cam.getCullingProjectionMatrix(); - } - - const filament::Frustum FilamentViewer::getCameraFrustum() - { - const auto &cam = _view->getCamera(); - return cam.getFrustum(); - } - + void FilamentViewer::_createManipulator() { Camera &cam = _view->getCamera(); From abc9ecbeeef29c7eba4df573f18ae3c24faae0ff Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:07:03 +0800 Subject: [PATCH 123/232] use opaque CameraPtr to set camera matrices/properties/etc --- .../native/include/ThermionDartApi.h | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 6fc50923..3a9218d1 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -49,14 +49,23 @@ #include "ResourceBuffer.hpp" #include "Aabb2.h" -typedef int32_t EntityId; -typedef int32_t _ManipulatorMode; #ifdef __cplusplus extern "C" { #endif + typedef int32_t EntityId; + typedef int32_t _ManipulatorMode; + typedef struct CameraPtr CameraPtr; + + typedef struct { + double col1[4]; + double col2[4]; + double col3[4]; + double col4[4]; + } double4x4; + EMSCRIPTEN_KEEPALIVE const void *create_filament_viewer(const void *const context, const void *const loader, void *const platform, const char *uberArchivePath); EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer(const void *const viewer); EMSCRIPTEN_KEEPALIVE void *get_scene_manager(const void *const viewer); @@ -118,7 +127,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void create_swap_chain(const void *const viewer, const void *const window, uint32_t width, uint32_t height); EMSCRIPTEN_KEEPALIVE void destroy_swap_chain(const void *const viewer); EMSCRIPTEN_KEEPALIVE void set_frame_interval(const void *const viewer, float interval); - EMSCRIPTEN_KEEPALIVE void update_viewport_and_camera_projection(const void *const viewer, uint32_t width, uint32_t height, float scaleFactor); + EMSCRIPTEN_KEEPALIVE void update_viewport(const void *const viewer, uint32_t width, uint32_t height); EMSCRIPTEN_KEEPALIVE void scroll_begin(const void *const viewer); EMSCRIPTEN_KEEPALIVE void scroll_update(const void *const viewer, float x, float y, float z); EMSCRIPTEN_KEEPALIVE void scroll_end(const void *const viewer); @@ -205,25 +214,23 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_scale(void *sceneManager, EntityId entity, float scale); // Camera methods - EMSCRIPTEN_KEEPALIVE void move_camera_to_asset(const void *const viewer, EntityId asset); EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(const void *const viewer, bool enabled); - EMSCRIPTEN_KEEPALIVE void set_camera_exposure(const void *const viewer, float aperture, float shutterSpeed, float sensitivity); - EMSCRIPTEN_KEEPALIVE void set_camera_position(const void *const viewer, float x, float y, float z); - EMSCRIPTEN_KEEPALIVE void set_camera_rotation(const void *const viewer, float w, float x, float y, float z); - EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(const void *const viewer, const float *const matrix); - EMSCRIPTEN_KEEPALIVE const double *const get_camera_model_matrix(const void *const viewer); - EMSCRIPTEN_KEEPALIVE const double *const get_camera_view_matrix(const void *const viewer); - EMSCRIPTEN_KEEPALIVE const double *const get_camera_projection_matrix(const void *const viewer); - EMSCRIPTEN_KEEPALIVE void set_camera_projection_matrix(const void *const viewer, const double *const matrix, double near, double far); - EMSCRIPTEN_KEEPALIVE void set_camera_culling(const void *const viewer, double near, double far); - EMSCRIPTEN_KEEPALIVE double get_camera_culling_near(const void *const viewer); - EMSCRIPTEN_KEEPALIVE double get_camera_culling_far(const void *const viewer); - EMSCRIPTEN_KEEPALIVE const double *const get_camera_culling_projection_matrix(const void *const viewer); - EMSCRIPTEN_KEEPALIVE const double *const get_camera_frustum(const void *const viewer); - EMSCRIPTEN_KEEPALIVE float get_camera_fov(const void *const viewer, bool horizontal); - EMSCRIPTEN_KEEPALIVE void set_camera_fov(const void *const viewer, float fovInDegrees, bool horizontal); - EMSCRIPTEN_KEEPALIVE void set_camera_focal_length(const void *const viewer, float focalLength); - EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(const void *const viewer, float focusDistance); + EMSCRIPTEN_KEEPALIVE void set_camera_exposure(CameraPtr* camera, float aperture, float shutterSpeed, float sensitivity); + EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(CameraPtr* camera, double4x4 matrix); + EMSCRIPTEN_KEEPALIVE CameraPtr* get_camera(const void *const viewer, EntityId entity); + EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(CameraPtr* const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_model_matrix(CameraPtr* const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_view_matrix(CameraPtr* const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_projection_matrix(CameraPtr* const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_culling_projection_matrix(CameraPtr* const camera); + EMSCRIPTEN_KEEPALIVE const double *const get_camera_frustum(CameraPtr* const camera); + EMSCRIPTEN_KEEPALIVE void set_camera_projection_matrix(CameraPtr* camera, double4x4 matrix, double near, double far); + EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(CameraPtr* camera, double fovInDegrees, double aspect, double near, double far, bool horizontal); + EMSCRIPTEN_KEEPALIVE double get_camera_near(CameraPtr* camera); + EMSCRIPTEN_KEEPALIVE double get_camera_culling_far(CameraPtr* camera); + EMSCRIPTEN_KEEPALIVE float get_camera_fov(CameraPtr* camera, bool horizontal); + EMSCRIPTEN_KEEPALIVE void set_camera_lens_projection(CameraPtr* camera, double near, double far, double aspect, double focalLength); + EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(CameraPtr* camera, float focusDistance); EMSCRIPTEN_KEEPALIVE void set_camera_manipulator_options(const void *const viewer, _ManipulatorMode mode, double orbitSpeedX, double orbitSpeedY, double zoomSpeed); EMSCRIPTEN_KEEPALIVE int hide_mesh(void *sceneManager, EntityId entity, const char *meshName); From 62417bfebdff427a1ae399c48ddbc1a6a251f0bf Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:07:29 +0800 Subject: [PATCH 124/232] explicitly mark type of Camera for Gizmo --- thermion_dart/native/include/Gizmo.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_dart/native/include/Gizmo.hpp b/thermion_dart/native/include/Gizmo.hpp index ec3c9376..5aef1e70 100644 --- a/thermion_dart/native/include/Gizmo.hpp +++ b/thermion_dart/native/include/Gizmo.hpp @@ -93,7 +93,7 @@ class Gizmo { Engine &_engine; View *_view; Scene *_scene; - Camera *_camera; + filament::Camera *_camera; utils::Entity _entities[7] = { utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity() }; Material* _material; MaterialInstance* _materialInstances[7]; From 833fc74b4c1e0ec178eaf3426819a77312bca3b8 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:07:47 +0800 Subject: [PATCH 125/232] rename getBoundingBox to getViewportBoundingBox --- thermion_dart/lib/thermion_dart/entities/gizmo.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_dart/lib/thermion_dart/entities/gizmo.dart b/thermion_dart/lib/thermion_dart/entities/gizmo.dart index 87ccf082..29998407 100644 --- a/thermion_dart/lib/thermion_dart/entities/gizmo.dart +++ b/thermion_dart/lib/thermion_dart/entities/gizmo.dart @@ -103,7 +103,7 @@ class Gizmo extends AbstractGizmo { _activeEntity = entity; await _viewer.setGizmoVisibility(true); await _viewer.setParent(center, entity, preserveScaling: true); - _boundingBoxController.sink.add(await _viewer.getBoundingBox(x)); + _boundingBoxController.sink.add(await _viewer.getViewportBoundingBox(x)); } From 374e8eb910780ddd78ff04d2189b78227b7bb632 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:08:07 +0800 Subject: [PATCH 126/232] rename getBoundingBox to getViewportBoundingBox and add camera methods --- .../lib/thermion_dart/thermion_viewer.dart | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index d1e2c225..f7e2b927 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -492,15 +492,26 @@ abstract class ThermionViewer { Future setCameraCulling(double near, double far); /// - /// Get the distance (in world units) to the near culling plane for the active camera. + /// Get the distance (in world units) to the near plane for the active camera. /// + @Deprecated("Use getCameraNear") Future getCameraCullingNear(); + /// + /// Get the distance (in world units) to the near plane for the active camera. + /// + Future getCameraNear(); + /// /// Get the distance (in world units) to the far culling plane for the active camera. /// Future getCameraCullingFar(); + /// + /// + /// + Future setCameraLensProjection(double near, double far, double aspect, double focalLength); + /// /// Sets the focus distance for the camera. /// @@ -571,8 +582,14 @@ abstract class ThermionViewer { /// /// Sets the camera model matrix. /// + @Deprecated("Will be superseded by setCameraModelMatrix4") Future setCameraModelMatrix(List matrix); + /// + /// Sets the camera model matrix. + /// + Future setCameraModelMatrix4(Matrix4 matrix); + /// /// Sets the `baseColorFactor` property for the material at index [materialIndex] in [entity] under node [meshName] to [color]. /// @@ -631,8 +648,6 @@ abstract class ThermionViewer { Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, double viewportX, double viewportY, double x, double y, double z); - - /// /// Queues an update to the worldspace rotation for [entity]. /// The actual update will occur on the next frame, and will be subject to collision detection. @@ -783,12 +798,12 @@ abstract class ThermionViewer { PrimitiveType primitiveType = PrimitiveType.TRIANGLES}); /// - /// Gets the parent entity of [entity]. Returns null if the entity has no parent. + /// Gets the parent entity of [entity]. Returns null if the entity has no parent. /// Future getParent(ThermionEntity entity); /// - /// Gets the ancestor (ultimate parent) entity of [entity]. Returns null if the entity has no parent. + /// Gets the ancestor (ultimate parent) entity of [entity]. Returns null if the entity has no parent. /// Future getAncestor(ThermionEntity entity); @@ -827,7 +842,7 @@ abstract class ThermionViewer { /// /// Gets the 2D bounding box (in viewport coordinates) for the given entity. /// - Future getBoundingBox(ThermionEntity entity); + Future getViewportBoundingBox(ThermionEntity entity); /// /// Filament assigns renderables to a numeric layer. From d455cea29e705caae6ef3ae8279f043af220952c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:09:27 +0800 Subject: [PATCH 127/232] use opaque CameraPtr to set camera matrices/properties/etc --- .../thermion_dart/thermion_viewer_ffi.dart | 192 ++++++++++-------- 1 file changed, 109 insertions(+), 83 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index 3aba6d8e..2ce5544a 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -4,6 +4,7 @@ import 'dart:typed_data'; import 'package:animation_tools_dart/animation_tools_dart.dart'; import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; import 'package:thermion_dart/thermion_dart/entities/gizmo.dart'; +import 'package:thermion_dart/thermion_dart/matrix_helper.dart'; import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:vector_math/vector_math_64.dart'; import 'package:vector_math/vector_math_64.dart' as v64; @@ -18,6 +19,10 @@ const ThermionEntity _FILAMENT_ASSET_ERROR = 0; typedef RenderCallback = Pointer)>>; +double kNear = 0.05; +double kFar = 1000.0; +double kFocalLength = 28.0; + class ThermionViewerFFI extends ThermionViewer { final _logger = Logger("ThermionViewerFFI"); @@ -93,10 +98,23 @@ class ThermionViewerFFI extends ThermionViewer { Future updateViewportAndCameraProjection(double width, double height) async { viewportDimensions = (width * pixelRatio, height * pixelRatio); - await withVoidCallback((callback) { - update_viewport_and_camera_projection_ffi( - _viewer!, width.toInt(), height.toInt(), 1.0, callback); - }); + update_viewport(_viewer!, width.toInt(), height.toInt()); + var mainCamera = get_camera(_viewer!, await getMainCamera()); + var near = await getCameraCullingNear(); + if (near.abs() < 0.000001) { + near = kNear; + } + var far = await getCameraCullingFar(); + if (far.abs() < 0.000001) { + far = kFar; + } + + var aspect = viewportDimensions.$1 / viewportDimensions.$2; + var focalLength = get_camera_focal_length(mainCamera); + if (focalLength.abs() < 0.1) { + focalLength = kFocalLength; + } + set_camera_lens_projection(mainCamera, near, far, aspect, focalLength); } Future createSwapChain(double width, double height, @@ -472,7 +490,7 @@ class ThermionViewerFFI extends ThermionViewer { numInstances, keepData, callback)); - + if (entity == _FILAMENT_ASSET_ERROR) { throw Exception("An error occurred loading GLB from buffer"); } @@ -1173,14 +1191,15 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setCameraFocalLength(double focalLength) async { - set_camera_focal_length(_viewer!, focalLength); + throw Exception("DONT USE"); } /// /// /// Future getCameraFov(bool horizontal) async { - return get_camera_fov(_viewer!, horizontal); + var mainCamera = get_camera(_viewer!, await getMainCamera()); + return get_camera_fov(mainCamera, horizontal); } /// @@ -1188,7 +1207,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setCameraFov(double degrees, {bool horizontal = true}) async { - set_camera_fov(_viewer!, degrees, horizontal); + throw Exception("DONT USE"); } /// @@ -1196,7 +1215,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setCameraCulling(double near, double far) async { - set_camera_culling(_viewer!, near, far); + throw Exception("DONT USE"); } /// @@ -1204,7 +1223,12 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future getCameraCullingNear() async { - return get_camera_culling_near(_viewer!); + return getCameraNear(); + } + + Future getCameraNear() async { + var mainCamera = get_camera(_viewer!, await getMainCamera()); + return get_camera_near(mainCamera); } /// @@ -1212,7 +1236,8 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future getCameraCullingFar() async { - return get_camera_culling_far(_viewer!); + var mainCamera = get_camera(_viewer!, await getMainCamera()); + return get_camera_culling_far(mainCamera); } /// @@ -1220,7 +1245,8 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setCameraFocusDistance(double focusDistance) async { - set_camera_focus_distance(_viewer!, focusDistance); + var mainCamera = get_camera(_viewer!, await getMainCamera()); + set_camera_focus_distance(mainCamera, focusDistance); } /// @@ -1228,7 +1254,9 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setCameraPosition(double x, double y, double z) async { - set_camera_position(_viewer!, x, y, z); + var modelMatrix = await getCameraModelMatrix(); + modelMatrix.setTranslation(Vector3(x, y, z)); + await setCameraModelMatrix4(modelMatrix); } /// @@ -1236,7 +1264,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future moveCameraToAsset(ThermionEntity entity) async { - move_camera_to_asset(_viewer!, entity); + throw Exception("DON'T USE"); } /// @@ -1253,7 +1281,8 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setCameraExposure( double aperture, double shutterSpeed, double sensitivity) async { - set_camera_exposure(_viewer!, aperture, shutterSpeed, sensitivity); + var mainCamera = get_camera(_viewer!, await getMainCamera()); + set_camera_exposure(mainCamera, aperture, shutterSpeed, sensitivity); } /// @@ -1261,8 +1290,9 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setCameraRotation(Quaternion quaternion) async { - set_camera_rotation( - _viewer!, quaternion.w, quaternion.x, quaternion.y, quaternion.z); + var modelMatrix = await getCameraModelMatrix(); + modelMatrix.setRotation(quaternion.asRotationMatrix()); + await setCameraModelMatrix(modelMatrix.storage); } /// @@ -1271,12 +1301,28 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setCameraModelMatrix(List matrix) async { assert(matrix.length == 16); - var ptr = allocator(16); - for (int i = 0; i < 16; i++) { - ptr.elementAt(i).value = matrix[i]; - } - set_camera_model_matrix(_viewer!, ptr); - allocator.free(ptr); + await setCameraModelMatrix4(Matrix4.fromList(matrix)); + } + + /// + /// + /// + @override + Future setCameraModelMatrix4(Matrix4 modelMatrix) async { + var mainCamera = get_camera(_viewer!, await getMainCamera()); + final out = allocator(1); + set_camera_model_matrix(mainCamera, out.ref); + allocator.free(out); + } + + /// + /// + /// + @override + Future setCameraLensProjection( + double near, double far, double aspect, double focalLength) async { + var mainCamera = get_camera(_viewer!, get_main_camera(_viewer!)); + set_camera_lens_projection(mainCamera, near, far, aspect, focalLength); } /// @@ -1497,10 +1543,9 @@ class ThermionViewerFFI extends ThermionViewer { if (_viewer == null) { throw Exception("No viewer available"); } - var arrayPtr = get_camera_view_matrix(_viewer!); - var viewMatrix = Matrix4.fromList(arrayPtr.asTypedList(16)); - allocator.free(arrayPtr); - return viewMatrix; + var mainCamera = get_camera(_viewer!, await getMainCamera()); + var matrixStruct = get_camera_view_matrix(mainCamera); + return double4x4ToMatrix4(matrixStruct); } /// @@ -1511,10 +1556,35 @@ class ThermionViewerFFI extends ThermionViewer { if (_viewer == null) { throw Exception("No viewer available"); } - var arrayPtr = get_camera_model_matrix(_viewer!); - var modelMatrix = Matrix4.fromList(arrayPtr.asTypedList(16)); - allocator.free(arrayPtr); - return modelMatrix; + var mainCamera = get_camera(_viewer!, await getMainCamera()); + var matrixStruct = get_camera_model_matrix(mainCamera); + return double4x4ToMatrix4(matrixStruct); + } + + /// + /// + /// + @override + Future getCameraProjectionMatrix() async { + if (_viewer == null) { + throw Exception("No viewer available"); + } + var mainCamera = get_camera(_viewer!, await getMainCamera()); + var matrixStruct = get_camera_projection_matrix(mainCamera); + return double4x4ToMatrix4(matrixStruct); + } + + /// + /// + /// + @override + Future getCameraCullingProjectionMatrix() async { + if (_viewer == null) { + throw Exception("No viewer available"); + } + var mainCamera = get_camera(_viewer!, await getMainCamera()); + var matrixStruct = get_camera_culling_projection_matrix(mainCamera); + return double4x4ToMatrix4(matrixStruct); } /// @@ -1525,14 +1595,8 @@ class ThermionViewerFFI extends ThermionViewer { if (_viewer == null) { throw Exception("No viewer available"); } - var arrayPtr = get_camera_model_matrix(_viewer!); - var doubleList = arrayPtr.asTypedList(16); - var modelMatrix = Matrix4.fromFloat64List(doubleList); - - var position = modelMatrix.getColumn(3).xyz; - - thermion_flutter_free(arrayPtr.cast()); - return position; + var modelMatrix = await getCameraModelMatrix(); + return modelMatrix.getColumn(3).xyz; } /// @@ -1543,12 +1607,9 @@ class ThermionViewerFFI extends ThermionViewer { if (_viewer == null) { throw Exception("No viewer available"); } - var arrayPtr = get_camera_model_matrix(_viewer!); - var doubleList = arrayPtr.asTypedList(16); - var modelMatrix = Matrix4.fromFloat64List(doubleList); + var modelMatrix = await getCameraModelMatrix(); var rotationMatrix = Matrix3.identity(); modelMatrix.copyRotation(rotationMatrix); - thermion_flutter_free(arrayPtr.cast()); return rotationMatrix; } @@ -1573,44 +1634,6 @@ class ThermionViewerFFI extends ThermionViewer { _viewer!, _cameraMode.index, orbitSpeedX, orbitSpeedX, zoomSpeed); } - /// - /// I don't think these two methods are accurate - don't rely on them, use the Frustum values instead. - /// I think because we use [setLensProjection] and [setScaling] together, this projection matrix doesn't accurately reflect the field of view (because it's using an additional scaling matrix). - /// Also, the near/far planes never seem to get updated (which is what I would expect to see when calling [getCameraCullingProjectionMatrix]) - /// - /// - /// - /// - @override - Future getCameraProjectionMatrix() async { - if (_viewer == null) { - throw Exception("No viewer available"); - } - - var arrayPtr = get_camera_projection_matrix(_viewer!); - var doubleList = arrayPtr.asTypedList(16); - var projectionMatrix = Matrix4.fromList(doubleList); - thermion_flutter_free(arrayPtr.cast()); - return projectionMatrix; - } - - /// - /// - /// - @override - Future getCameraCullingProjectionMatrix() async { - if (_viewer == null) { - throw Exception("No viewer available"); - } - throw Exception( - "WARNING: getCameraProjectionMatrix and getCameraCullingProjectionMatrix are not reliable. Consider these broken"); - var arrayPtr = get_camera_culling_projection_matrix(_viewer!); - var doubleList = arrayPtr.asTypedList(16); - var projectionMatrix = Matrix4.fromList(doubleList); - thermion_flutter_free(arrayPtr.cast()); - return projectionMatrix; - } - /// /// /// @@ -1619,7 +1642,8 @@ class ThermionViewerFFI extends ThermionViewer { if (_viewer == null) { throw Exception("No viewer available"); } - var arrayPtr = get_camera_frustum(_viewer!); + var mainCamera = get_camera(_viewer!, await getMainCamera()); + var arrayPtr = get_camera_frustum(mainCamera); var doubleList = arrayPtr.asTypedList(24); var frustum = Frustum(); @@ -1885,7 +1909,7 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future getBoundingBox(ThermionEntity entityId) async { + Future getViewportBoundingBox(ThermionEntity entityId) async { final result = get_bounding_box(_sceneManager!, entityId); return v64.Aabb2.minMax(v64.Vector2(result.minX, result.minY), v64.Vector2(result.maxX, result.maxY)); @@ -1919,4 +1943,6 @@ class ThermionViewerFFI extends ThermionViewer { Future removeStencilHighlight(ThermionEntity entity) async { remove_stencil_highlight(_sceneManager!, entity); } + + } From 8d250e26643392c5f1d171d96a5d651ee0ffc99f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:09:41 +0800 Subject: [PATCH 128/232] update test --- thermion_dart/test/integration_test.dart | 249 ++++++++++++++++------- 1 file changed, 178 insertions(+), 71 deletions(-) diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index 034a481e..e0e60933 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -5,6 +5,7 @@ import 'package:thermion_dart/thermion_dart.dart'; import 'package:test/test.dart'; import 'package:animation_tools_dart/animation_tools_dart.dart'; import 'package:path/path.dart' as p; +import 'package:thermion_dart/thermion_dart/geometry_helper.dart'; import 'package:vector_math/vector_math_64.dart'; import 'helpers.dart'; @@ -25,6 +26,72 @@ void main() async { viewportDimensions.height, outPath); } + final cubeGeometry = GeometryHelper.cube(); + + group('camera', () { + test('getCameraModelMatrix, getCameraPosition, rotation', () async { + var viewer = await createViewer(); + var matrix = await viewer.getCameraModelMatrix(); + expect(matrix.trace(), 4); + await viewer.setCameraPosition(2.0, 2.0, 2.0); + matrix = await viewer.getCameraModelMatrix(); + var position = matrix.getColumn(3).xyz; + expect(position.x, 2.0); + expect(position.y, 2.0); + expect(position.z, 2.0); + + position = await viewer.getCameraPosition(); + expect(position.x, 2.0); + expect(position.y, 2.0); + expect(position.z, 2.0); + }); + + test('getCameraViewMatrix', () async { + var viewer = await createViewer(); + + var modelMatrix = await viewer.getCameraModelMatrix(); + var viewMatrix = await viewer.getCameraViewMatrix(); + + // The view matrix should be the inverse of the model matrix + var identity = modelMatrix * viewMatrix; + expect(identity.isIdentity(), isTrue); + + // Check that moving the camera affects the view matrix + await viewer.setCameraPosition(3.0, 4.0, 5.0); + viewMatrix = await viewer.getCameraViewMatrix(); + var invertedView = viewMatrix.clone()..invert(); + var position = invertedView.getColumn(3).xyz; + expect(position.x, closeTo(3.0, 1e-6)); + expect(position.y, closeTo(4.0, 1e-6)); + expect(position.z, closeTo(5.0, 1e-6)); + }); + + test('getCameraProjectionMatrix', () async { + var viewer = await createViewer(); + var projectionMatrix = await viewer.getCameraProjectionMatrix(); + print(projectionMatrix); + }); + + test('getCameraCullingProjectionMatrix', () async { + var viewer = await createViewer(); + var matrix = await viewer.getCameraCullingProjectionMatrix(); + print(matrix); + throw Exception("TODO"); + }); + + test('getCameraFrustum', () async { + var viewer = await createViewer(); + var frustum = await viewer.getCameraFrustum(); + print(frustum.plane5.normal); + print(frustum.plane5.constant); + + await viewer.setCameraLensProjection(10.0, 1000.0, 1.0, 28.0); + frustum = await viewer.getCameraFrustum(); + print(frustum.plane5.normal); + print(frustum.plane5.constant); + }); + }); + group('background', () { test('set background color to solid green', () async { var viewer = await createViewer(); @@ -55,6 +122,45 @@ void main() async { }); }); + group("custom geometry", () { + test('create cube (no normals)', () async { + var viewer = await createViewer(); + var light = await viewer.addLight( + LightType.POINT, 6500, 10000000, 0, 2, 0, 0, -1, 0, + falloffRadius: 10.0); + await viewer.setCameraPosition(0, 0, 6); + await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0); + await viewer.createGeometry(cubeGeometry.vertices, cubeGeometry.indices, + primitiveType: PrimitiveType.TRIANGLES); + await _capture(viewer, "geometry_cube"); + }); + + test('create cube (with normals)', () async { + var viewer = await createViewer(); + + var light = await viewer.addLight( + LightType.POINT, 6500, 1000000, 0, 2, 0, 0, -1, 0, + falloffRadius: 10.0); + + await viewer.setCameraPosition(0, 0, 6); + await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0); + await viewer.createGeometry(cubeGeometry.vertices, cubeGeometry.indices, + normals: cubeGeometry.normals, + primitiveType: PrimitiveType.TRIANGLES); + await _capture(viewer, "geometry_cube"); + }); + + test('create sphere', () async { + final geometry = GeometryHelper.sphere(); + var viewer = await createViewer(); + await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); + await viewer.setCameraPosition(0, 0, 6); + await viewer.createGeometry(geometry.vertices, geometry.indices, + primitiveType: PrimitiveType.TRIANGLES); + await _capture(viewer, "geometry_sphere"); + }); + }); + // test('create instance from glb when keepData is true', () async { // var model = await viewer.loadGlb("$testDir/cube.glb", keepData: true); // await viewer.transformToUnitCube(model); @@ -117,7 +223,7 @@ void main() async { await viewer.setCameraPosition(0, 0, 6); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); // Create the cube geometry - await viewer.createGeometry(cubeVertices, cubeIndices, + await viewer.createGeometry(cubeGeometry.vertices, cubeGeometry.indices, primitiveType: PrimitiveType.TRIANGLES); await _capture(viewer, "geometry_cube"); @@ -125,10 +231,12 @@ void main() async { }); group("transforms & parenting", () { - test('getParent and getAncestor both return null when entity has no parent', () async { + test('getParent and getAncestor both return null when entity has no parent', + () async { var viewer = await createViewer(); - final cube = await viewer.createGeometry(cubeVertices, cubeIndices, + final cube = await viewer.createGeometry( + cubeGeometry.vertices, cubeGeometry.indices, primitiveType: PrimitiveType.TRIANGLES); expect(await viewer.getParent(cube), isNull); @@ -140,9 +248,11 @@ void main() async { () async { var viewer = await createViewer(); - final cube1 = await viewer.createGeometry(cubeVertices, cubeIndices, + final cube1 = await viewer.createGeometry( + cubeGeometry.vertices, cubeGeometry.indices, primitiveType: PrimitiveType.TRIANGLES); - final cube2 = await viewer.createGeometry(cubeVertices, cubeIndices, + final cube2 = await viewer.createGeometry( + cubeGeometry.vertices, cubeGeometry.indices, primitiveType: PrimitiveType.TRIANGLES); await viewer.setParent(cube1, cube2); @@ -155,18 +265,20 @@ void main() async { test('getAncestor returns the ultimate parent entity', () async { var viewer = await createViewer(); - final grandparent = await viewer.createGeometry(cubeVertices, cubeIndices, + final grandparent = await viewer.createGeometry( + cubeGeometry.vertices, cubeGeometry.indices, primitiveType: PrimitiveType.TRIANGLES); - final parent = await viewer.createGeometry(cubeVertices, cubeIndices, + final parent = await viewer.createGeometry( + cubeGeometry.vertices, cubeGeometry.indices, primitiveType: PrimitiveType.TRIANGLES); - final child = await viewer.createGeometry(cubeVertices, cubeIndices, + final child = await viewer.createGeometry( + cubeGeometry.vertices, cubeGeometry.indices, primitiveType: PrimitiveType.TRIANGLES); await viewer.setParent(child, parent); await viewer.setParent(parent, grandparent); expect(await viewer.getAncestor(child), grandparent); - }); test('set position based on screenspace coord', () async { @@ -176,7 +288,8 @@ void main() async { await viewer.setCameraPosition(0, 0, 6); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); // Create the cube geometry - final cube = await viewer.createGeometry(cubeVertices, cubeIndices, + final cube = await viewer.createGeometry( + cubeGeometry.vertices, cubeGeometry.indices, primitiveType: PrimitiveType.TRIANGLES); // await viewer.setPosition(cube, -0.05, 0.04, 5.9); // await viewer.setPosition(cube, -2.54, 2.54, 0); @@ -189,64 +302,6 @@ void main() async { }); }); - // test('create sphere', () async { - // // Define the parameters for the sphere - // int latitudeBands = 30; - // int longitudeBands = 30; - // double radius = 1.0; - - // List vertices = []; - // List indices = []; - - // // Generate vertices - // for (int latNumber = 0; latNumber <= latitudeBands; latNumber++) { - // double theta = latNumber * pi / latitudeBands; - // double sinTheta = sin(theta); - // double cosTheta = cos(theta); - - // for (int longNumber = 0; longNumber <= longitudeBands; longNumber++) { - // double phi = longNumber * 2 * pi / longitudeBands; - // double sinPhi = sin(phi); - // double cosPhi = cos(phi); - - // double x = cosPhi * sinTheta; - // double y = cosTheta; - // double z = sinPhi * sinTheta; - - // vertices.addAll([radius * x, radius * y, radius * z]); - // } - // } - - // // Generate indices - // for (int latNumber = 0; latNumber < latitudeBands; latNumber++) { - // for (int longNumber = 0; longNumber < longitudeBands; longNumber++) { - // int first = (latNumber * (longitudeBands + 1)) + longNumber; - // int second = first + longitudeBands + 1; - - // indices.addAll( - // [first, second, first + 1, second, second + 1, first + 1]); - // } - // } - - // await viewer.createIbl(1.0, 1.0, 1.0, 1000); - // await viewer.setCameraPosition(0, 0.5, 10); - // await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); - // await viewer - // .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); - // await viewer.setRendering(true); - - // // Create the sphere geometry - // // final sphere = await viewer.createGeometry(vertices, indices, - // // primitiveType: PrimitiveType.TRIANGLES); - - // // await viewer.gizmo!.attach(sphere); - // // await viewer.setPosition(sphere, -1.0, 0.0, -10.0); - // // await viewer.setRotationQuat( - // // sphere, Quaternion.axisAngle(Vector3(1, 0, 0), pi / 8)); - // await _capture(viewer, "geometry_sphere"); - // await viewer.setRendering(false); - // }); - // test('enable grid overlay', () async { // await viewer.setBackgroundColor(0, 0, 0, 1); // await viewer.setCameraPosition(0, 0.5, 0); @@ -344,7 +399,8 @@ void main() async { await viewer .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - var cube = await viewer.createGeometry(cubeVertices, cubeIndices, + var cube = await viewer.createGeometry( + cubeGeometry.vertices, cubeGeometry.indices, primitiveType: PrimitiveType.TRIANGLES); await viewer.setStencilHighlight(cube); @@ -355,6 +411,26 @@ void main() async { await _capture(viewer, "stencil_highlight_geometry_remove"); }); + test('set stencil highlight for gltf asset', () async { + var viewer = await createViewer(); + await viewer.setPostProcessing(true); + await viewer.setBackgroundColor(0.0, 1.0, 0.0, 1.0); + await viewer.setCameraPosition(0, 1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + + var cube1 = await viewer.loadGlb("$testDir/cube.glb", keepData: true); + await viewer.transformToUnitCube(cube1); + + await viewer.setStencilHighlight(cube1); + + await _capture(viewer, "stencil_highlight_gltf"); + + await viewer.removeStencilHighlight(cube1); + + await _capture(viewer, "stencil_highlight_gltf_removed"); + }); + test('set stencil highlight for multiple geometry ', () async { var viewer = await createViewer(); await viewer.setPostProcessing(true); @@ -363,15 +439,46 @@ void main() async { await viewer .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - var cube1 = await viewer.createGeometry(cubeVertices, cubeIndices, + var cube1 = await viewer.createGeometry( + cubeGeometry.vertices, cubeGeometry.indices, primitiveType: PrimitiveType.TRIANGLES); - var cube2 = await viewer.createGeometry(cubeVertices, cubeIndices, + var cube2 = await viewer.createGeometry( + cubeGeometry.vertices, cubeGeometry.indices, primitiveType: PrimitiveType.TRIANGLES); await viewer.setPosition(cube2, 0.5, 0.5, 0); await viewer.setStencilHighlight(cube1); await viewer.setStencilHighlight(cube2, r: 0.0, g: 0.0, b: 1.0); await _capture(viewer, "stencil_highlight_multiple_geometry"); + + await viewer.removeStencilHighlight(cube1); + await viewer.removeStencilHighlight(cube2); + + await _capture(viewer, "stencil_highlight_multiple_geometry_removed"); + }); + + test('set stencil highlight for multiple gltf assets ', () async { + var viewer = await createViewer(); + await viewer.setPostProcessing(true); + await viewer.setBackgroundColor(0.0, 1.0, 0.0, 1.0); + await viewer.setCameraPosition(0, 1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + + var cube1 = await viewer.loadGlb("$testDir/cube.glb", keepData: true); + await viewer.transformToUnitCube(cube1); + var cube2 = await viewer.loadGlb("$testDir/cube.glb", keepData: true); + await viewer.transformToUnitCube(cube2); + await viewer.setPosition(cube2, 0.5, 0.5, 0); + await viewer.setStencilHighlight(cube1); + await viewer.setStencilHighlight(cube2, r: 0.0, g: 0.0, b: 1.0); + + await _capture(viewer, "stencil_highlight_multiple_geometry"); + + await viewer.removeStencilHighlight(cube1); + await viewer.removeStencilHighlight(cube2); + + await _capture(viewer, "stencil_highlight_multiple_geometry_removed"); }); }); } From 3e4e6653a87c76ee2e15c740d2754ac9984ad9ea Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 11 Sep 2024 23:09:56 +0800 Subject: [PATCH 129/232] update material building in Makefile --- Makefile | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 5fb8f801..0fce35c0 100644 --- a/Makefile +++ b/Makefile @@ -22,18 +22,12 @@ bindings: # materials: FORCE @echo "Using Filament build from ${FILAMENT_PATH}" - ${FILAMENT_PATH}/matc -a opengl -a metal -o materials/image.filamat materials/image.mat - $(FILAMENT_PATH)/resgen -c -p image -x thermion_dart/native/include/material/ materials/image.filamat - $(FILAMENT_PATH)/matc -a opengl -a metal -o materials/gizmo.filamat materials/gizmo.mat - $(FILAMENT_PATH)/resgen -c -p gizmo -x thermion_dart/native/include/material/ materials/gizmo.filamat - ${FILAMENT_PATH}/matc -a opengl -a metal -o materials/grid.filamat materials/grid.mat - $(FILAMENT_PATH)/resgen -c -p grid -x thermion_dart/native/include/material/ materials/grid.filamat - echo '#include "gizmo.h"' | cat - thermion_dart/native/include/material/gizmo.c > thermion_dart/native/include/material/gizmo.c.new - echo '#include "image.h"' | cat - thermion_dart/native/include/material/image.c > thermion_dart/native/include/material/image.c.new - echo '#include "grid.h"' | cat - thermion_dart/native/include/material/grid.c > thermion_dart/native/include/material/grid.c.new - mv thermion_dart/native/include/material/image.c.new thermion_dart/native/include/material/image.c - mv thermion_dart/native/include/material/gizmo.c.new thermion_dart/native/include/material/gizmo.c - mv thermion_dart/native/include/material/grid.c.new thermion_dart/native/include/material/grid.c + @for material in unlit image gizmo grid; do \ + ${FILAMENT_PATH}/matc -a opengl -a metal -o materials/$$material.filamat materials/$$material.mat; \ + $(FILAMENT_PATH)/resgen -c -p $$material -x thermion_dart/native/include/material/ materials/$$material.filamat; \ + echo '#include "'$$material'.h"' | cat - thermion_dart/native/include/material/$$material.c > thermion_dart/native/include/material/$$material.c.new; \ + mv thermion_dart/native/include/material/$$material.c.new thermion_dart/native/include/material/$$material.c; \ + done #rm materials/*.filamat From d785bd6b7e39c79ce28c28745dd7cbf06d1724d0 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 12 Sep 2024 08:54:07 +0800 Subject: [PATCH 130/232] chore!: rename controller to viewer in gesture detector widgets --- .../gestures/thermion_gesture_detector.dart | 14 +++---- .../thermion_gesture_detector_desktop.dart | 8 ++-- .../thermion_gesture_detector_mobile.dart | 40 +++++++++---------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart index a6c08067..20421c04 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart @@ -15,14 +15,14 @@ class ThermionGestureDetector extends StatelessWidget { /// /// The content to display below the gesture detector/listener widget. /// This will usually be a ThermionWidget (so you can navigate by directly interacting with the viewport), but this is not necessary. - /// It is equally possible to render the viewport/gesture controls elsewhere in the widget hierarchy. The only requirement is that they share the same [FilamentController]. + /// It is equally possible to render the viewport/gesture controls elsewhere in the widget hierarchy. The only requirement is that they share the same [Filamentviewer]. /// final Widget? child; /// - /// The [controller] attached to the [ThermionWidget] you wish to control. + /// The [viewer] attached to the [ThermionWidget] you wish to control. /// - final ThermionViewer controller; + final ThermionViewer viewer; /// /// If true, an overlay will be shown with buttons to toggle whether pointer movements are interpreted as: @@ -47,7 +47,7 @@ class ThermionGestureDetector extends StatelessWidget { const ThermionGestureDetector( {Key? key, - required this.controller, + required this.viewer, this.child, this.showControlOverlay = false, this.enableCamera = true, @@ -60,7 +60,7 @@ class ThermionGestureDetector extends StatelessWidget { @override Widget build(BuildContext context) { return FutureBuilder( - future: controller.initialized, + future: viewer.initialized, builder: (_, initialized) { if (initialized.data != true) { return child ?? Container(); @@ -69,7 +69,7 @@ class ThermionGestureDetector extends StatelessWidget { Platform.isWindows || Platform.isMacOS) { return ThermionGestureDetectorDesktop( - controller: controller, + viewer: viewer, child: child, showControlOverlay: showControlOverlay, enableCamera: enableCamera, @@ -77,7 +77,7 @@ class ThermionGestureDetector extends StatelessWidget { ); } else { return ThermionGestureDetectorMobile( - controller: controller, + viewer: viewer, child: child, showControlOverlay: showControlOverlay, enableCamera: enableCamera, diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart index 45dbc6b5..11110ddd 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart @@ -10,14 +10,14 @@ import 'package:vector_math/vector_math_64.dart' as v64; class ThermionGestureDetectorDesktop extends StatefulWidget { final Widget? child; - final ThermionViewer controller; + final ThermionViewer viewer; final bool showControlOverlay; final bool enableCamera; final bool enablePicking; const ThermionGestureDetectorDesktop({ Key? key, - required this.controller, + required this.viewer, this.child, this.showControlOverlay = false, this.enableCamera = true, @@ -37,7 +37,7 @@ class _ThermionGestureDetectorDesktopState super.initState(); _gestureHandler = ThermionGestureHandler( enableCamera: widget.enableCamera, - enablePicking: widget.enablePicking, viewer: widget.controller, + enablePicking: widget.enablePicking, viewer: widget.viewer, ); } @@ -46,7 +46,7 @@ class _ThermionGestureDetectorDesktopState if (widget.enableCamera != oldWidget.enableCamera || widget.enablePicking != oldWidget.enablePicking) { _gestureHandler = ThermionGestureHandler( - viewer: widget.controller, + viewer: widget.viewer, enableCamera: widget.enableCamera, enablePicking: widget.enablePicking, ); diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_mobile.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_mobile.dart index e44195e0..efc4bfc8 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_mobile.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_mobile.dart @@ -11,14 +11,14 @@ class ThermionGestureDetectorMobile extends StatefulWidget { /// /// The content to display below the gesture detector/listener widget. /// This will usually be a ThermionWidget (so you can navigate by directly interacting with the viewport), but this is not necessary. - /// It is equally possible to render the viewport/gesture controls elsewhere in the widget hierarchy. The only requirement is that they share the same [FilamentController]. + /// It is equally possible to render the viewport/gesture controls elsewhere in the widget hierarchy. The only requirement is that they share the same [Filamentviewer]. /// final Widget? child; /// - /// The [controller] attached to the [ThermionWidget] you wish to control. + /// The [viewer] attached to the [ThermionWidget] you wish to control. /// - final ThermionViewer controller; + final ThermionViewer viewer; /// /// If true, an overlay will be shown with buttons to toggle whether pointer movements are interpreted as: @@ -45,7 +45,7 @@ class ThermionGestureDetectorMobile extends StatefulWidget { const ThermionGestureDetectorMobile( {Key? key, - required this.controller, + required this.viewer, this.child, this.showControlOverlay = false, this.enableCamera = true, @@ -98,14 +98,14 @@ class _ThermionGestureDetectorMobileState void _setFunction() { switch (gestureType) { case GestureType.rotateCamera: - _functionStart = widget.controller.rotateStart; - _functionUpdate = widget.controller.rotateUpdate; - _functionEnd = widget.controller.rotateEnd; + _functionStart = widget.viewer.rotateStart; + _functionUpdate = widget.viewer.rotateUpdate; + _functionEnd = widget.viewer.rotateEnd; break; case GestureType.panCamera: - _functionStart = widget.controller.panStart; - _functionUpdate = widget.controller.panUpdate; - _functionEnd = widget.controller.panEnd; + _functionStart = widget.viewer.panStart; + _functionUpdate = widget.viewer.panUpdate; + _functionEnd = widget.viewer.panEnd; break; // TODO case GestureType.panBackground: @@ -143,7 +143,7 @@ class _ThermionGestureDetectorMobileState return; } - widget.controller.pick( + widget.viewer.pick( d.globalPosition.dx.toInt(), d.globalPosition.dy.toInt()); }, onDoubleTap: () { @@ -158,13 +158,13 @@ class _ThermionGestureDetectorMobileState } if (d.pointerCount == 2 && widget.enableCamera) { _scaling = true; - await widget.controller.zoomBegin(); + await widget.viewer.zoomBegin(); } else if (!_scaling && widget.enableCamera) { if (_rotateOnPointerMove) { - widget.controller.rotateStart( + widget.viewer.rotateStart( d.localFocalPoint.dx, d.localFocalPoint.dy); } else { - widget.controller + widget.viewer .panStart(d.localFocalPoint.dx, d.localFocalPoint.dy); } } @@ -176,7 +176,7 @@ class _ThermionGestureDetectorMobileState } if (d.pointerCount == 2 && widget.enableCamera) { if (d.horizontalScale != _lastScale) { - widget.controller.zoomUpdate( + widget.viewer.zoomUpdate( d.localFocalPoint.dx, d.localFocalPoint.dy, d.horizontalScale > _lastScale ? 0.1 : -0.1); @@ -184,10 +184,10 @@ class _ThermionGestureDetectorMobileState } } else if (!_scaling && widget.enableCamera) { if (_rotateOnPointerMove) { - widget.controller + widget.viewer .rotateUpdate(d.focalPoint.dx, d.focalPoint.dy); } else { - widget.controller + widget.viewer .panUpdate(d.focalPoint.dx, d.focalPoint.dy); } } @@ -199,12 +199,12 @@ class _ThermionGestureDetectorMobileState } if (d.pointerCount == 2 && widget.enableCamera) { - widget.controller.zoomEnd(); + widget.viewer.zoomEnd(); } else if (!_scaling && widget.enableCamera) { if (_rotateOnPointerMove) { - widget.controller.rotateEnd(); + widget.viewer.rotateEnd(); } else { - widget.controller.panEnd(); + widget.viewer.panEnd(); } } _scaling = false; From 866219ee2e3e8ede750292c2a5477feab7798989 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 10:34:12 +0800 Subject: [PATCH 131/232] add v2 gesture handlers --- .../lib/thermion_dart/geometry_helper.dart | 86 +++- ...nfigurable_pan_rotate_gesture_handler.dart | 155 +++++++ .../picking_camera_gesture_handler.dart | 230 +++++++++++ .../gestures/thermion_gesture_detector.dart | 73 ++-- .../thermion_gesture_detector_desktop.dart | 43 +- .../gestures/thermion_gesture_handler.dart | 391 ++++++++++-------- .../gestures/thermion_listener_widget.dart | 57 +++ ...obile_gesture_handler_selector_widget.dart | 28 ++ ...rmion_gesture_detector_desktop_widget.dart | 37 ++ ...ermion_gesture_detector_mobile_widget.dart | 51 +++ 10 files changed, 895 insertions(+), 256 deletions(-) create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/configurable_pan_rotate_gesture_handler.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/mobile_gesture_handler_selector_widget.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_desktop_widget.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart diff --git a/thermion_dart/lib/thermion_dart/geometry_helper.dart b/thermion_dart/lib/thermion_dart/geometry_helper.dart index ff4851d7..4ada4971 100644 --- a/thermion_dart/lib/thermion_dart/geometry_helper.dart +++ b/thermion_dart/lib/thermion_dart/geometry_helper.dart @@ -6,6 +6,12 @@ class Geometry { final List normals; Geometry(this.vertices, this.indices, this.normals); + + void scale(double factor) { + for (int i = 0; i < vertices.length; i++) { + vertices[i] = vertices[i] * factor; + } + } } class GeometryHelper { @@ -32,7 +38,11 @@ class GeometryHelper { double z = sinPhi * sinTheta; vertices.addAll([x, y, z]); - normals.addAll([x, y, z]); // For a sphere, normals are the same as vertex positions + normals.addAll([ + x, + y, + z + ]); // For a sphere, normals are the same as vertex positions } } @@ -41,7 +51,8 @@ class GeometryHelper { int first = (latNumber * (longitudeBands + 1)) + longNumber; int second = first + longitudeBands + 1; - indices.addAll([first, second, first + 1, second, second + 1, first + 1]); + indices + .addAll([first, second, first + 1, second, second + 1, first + 1]); } } @@ -142,4 +153,73 @@ class GeometryHelper { return Geometry(vertices, indices, normals); } -} \ No newline at end of file + + static Geometry cylinder({double radius = 1.0, double length = 1.0}) { + int segments = 32; + List vertices = []; + List indices = []; + + // Create vertices + for (int i = 0; i <= segments; i++) { + double theta = i * 2 * pi / segments; + double x = radius * cos(theta); + double z = radius * sin(theta); + + // Top circle + vertices.addAll([x, length / 2, z]); + // Bottom circle + vertices.addAll([x, -length / 2, z]); + } + + // Create indices + for (int i = 0; i < segments; i++) { + int topFirst = i * 2; + int topSecond = (i + 1) * 2; + int bottomFirst = topFirst + 1; + int bottomSecond = topSecond + 1; + + // Top face (counter-clockwise) + indices.addAll([segments * 2, topSecond, topFirst]); + // Bottom face (counter-clockwise when viewed from below) + indices.addAll([segments * 2 + 1, bottomFirst, bottomSecond]); + // Side faces (counter-clockwise) + indices.addAll([topFirst, bottomFirst, topSecond]); + indices.addAll([bottomFirst, bottomSecond, topSecond]); + } + + // Add center vertices for top and bottom faces + vertices.addAll([0, length / 2, 0]); // Top center + vertices.addAll([0, -length / 2, 0]); // Bottom center + + return Geometry(vertices:vertices, indices:indices, normals:normals); + } + + static Geometry conic({double radius = 1.0, double length = 1.0}) { + int segments = 32; + List vertices = []; + List indices = []; + + // Create vertices + for (int i = 0; i <= segments; i++) { + double theta = i * 2 * pi / segments; + double x = radius * cos(theta); + double z = radius * sin(theta); + + // Base circle + vertices.addAll([x, 0, z]); + } + // Apex + vertices.addAll([0, length, 0]); + + // Create indices + for (int i = 0; i < segments; i++) { + // Base face + indices.addAll([i, i + 1, segments + 1]); + // Side faces + indices.addAll([i, segments, i + 1]); + } + + return Geometry(vertices:vertices, indices:indices, normals:normals); + } + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/configurable_pan_rotate_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/configurable_pan_rotate_gesture_handler.dart new file mode 100644 index 00000000..c0aa1afa --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/configurable_pan_rotate_gesture_handler.dart @@ -0,0 +1,155 @@ +import 'dart:async'; +import 'package:flutter/gestures.dart'; +import 'package:logging/logging.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; + +class ConfigurablePanRotateGestureHandler implements ThermionGestureHandler { + + final ThermionViewer viewer; + final Logger _logger = Logger("ConfigurablePanRotateGestureHandler"); + + ConfigurablePanRotateGestureHandler({ + required this.viewer, + }); + + @override + Future onPointerHover(Offset localPosition) async { + // noop + } + + // @override + // Future onPointerScroll(Offset localPosition, double scrollDelta) async { + // await _zoom(localPosition, scrollDelta); + // } + + // @override + // Future onPointerDown(Offset localPosition, int buttons) async { + // if (buttons == kMiddleMouseButton) { + // await viewer.rotateStart(localPosition.dx, localPosition.dy); + // } else if (buttons == kPrimaryMouseButton) { + // await viewer.panStart(localPosition.dx, localPosition.dy); + // } + // } + + // @override + // Future onPointerMove( + // Offset localPosition, Offset delta, int buttons) async { + // switch (_currentState) { + // case ThermionGestureState.NULL: + // break; + // case ThermionGestureState.ENTITY_HIGHLIGHTED: + // await _handleEntityHighlightedMove(localPosition); + // break; + // case ThermionGestureState.GIZMO_ATTACHED: + // break; + // case ThermionGestureState.ROTATING: + // if (enableCamera) { + // await viewer.rotateUpdate(localPosition.dx, localPosition.dy); + // } + // break; + // case ThermionGestureState.PANNING: + // if (enableCamera) { + // await viewer.panUpdate(localPosition.dx, localPosition.dy); + // } + // break; + // } + // } + + // @override + // Future onPointerUp(int buttons) async { + // switch (_currentState) { + // case ThermionGestureState.ROTATING: + // await viewer.rotateEnd(); + // _currentState = ThermionGestureState.NULL; + // break; + // case ThermionGestureState.PANNING: + // await viewer.panEnd(); + // _currentState = ThermionGestureState.NULL; + // break; + // default: + // break; + // } + // } + + // Future _handleEntityHighlightedMove(Offset localPosition) async { + // if (_highlightedEntity != null) { + // await viewer.queuePositionUpdateFromViewportCoords( + // _highlightedEntity!, + // localPosition.dx, + // localPosition.dy, + // ); + // } + // } + + // Future _zoom(Offset localPosition, double scrollDelta) async { + // _scrollTimer?.cancel(); + // await viewer.zoomBegin(); + // await viewer.zoomUpdate( + // localPosition.dx, localPosition.dy, scrollDelta > 0 ? 1 : -1); + + // _scrollTimer = Timer(const Duration(milliseconds: 100), () async { + // await viewer.zoomEnd(); + // }); + // } + + @override + void dispose() { + } + + @override + Future get initialized => viewer.initialized; + + @override + GestureAction getActionForType(GestureType type) { + // TODO: implement getActionForType + throw UnimplementedError(); + } + + @override + Future onScaleEnd() { + // TODO: implement onScaleEnd + throw UnimplementedError(); + } + + @override + Future onScaleStart() { + // TODO: implement onScaleStart + throw UnimplementedError(); + } + + @override + Future onScaleUpdate() { + // TODO: implement onScaleUpdate + throw UnimplementedError(); + } + + @override + void setActionForType(GestureType type, GestureAction action) { + // TODO: implement setActionForType + } + + @override + Future onPointerDown(Offset localPosition, int buttons) { + // TODO: implement onPointerDown + throw UnimplementedError(); + } + + @override + Future onPointerMove(Offset localPosition, Offset delta, int buttons) { + // TODO: implement onPointerMove + throw UnimplementedError(); + } + + @override + Future onPointerScroll(Offset localPosition, double scrollDelta) { + // TODO: implement onPointerScroll + throw UnimplementedError(); + } + + @override + Future onPointerUp(int buttons) { + // TODO: implement onPointerUp + throw UnimplementedError(); + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart new file mode 100644 index 00000000..bd7488f1 --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart @@ -0,0 +1,230 @@ +import 'dart:async'; + +import 'package:flutter/gestures.dart'; +import 'package:flutter/services.dart'; +import 'package:logging/logging.dart'; +import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'dart:ui'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; + +// Renamed implementation +class PickingCameraGestureHandler implements ThermionGestureHandler { + + final ThermionViewer viewer; + final bool enableCamera; + final bool enablePicking; + final Logger _logger = Logger("PickingCameraGestureHandler"); + + ThermionGestureState _currentState = ThermionGestureState.NULL; + AbstractGizmo? _gizmo; + Timer? _scrollTimer; + ThermionEntity? _highlightedEntity; + StreamSubscription? _pickResultSubscription; + + bool _gizmoAttached = false; + + PickingCameraGestureHandler({ + required this.viewer, + this.enableCamera = true, + this.enablePicking = true, + }) { + try { + _gizmo = viewer.gizmo; + } catch (err) { + _logger.warning( + "Failed to get gizmo. If you are running on WASM, this is expected"); + } + + _pickResultSubscription = viewer.pickResult.listen(_onPickResult); + + // Add keyboard listener + RawKeyboard.instance.addListener(_handleKeyEvent); + } + + @override + ThermionGestureState get currentState => _currentState; + + void _handleKeyEvent(RawKeyEvent event) { + if (event is RawKeyDownEvent && + event.logicalKey == LogicalKeyboardKey.escape) { + _resetToNullState(); + } + } + + void _resetToNullState() async { + _currentState = ThermionGestureState.NULL; + if (_highlightedEntity != null) { + await viewer.removeStencilHighlight(_highlightedEntity!); + _highlightedEntity = null; + } + } + + void _onPickResult(FilamentPickResult result) async { + var targetEntity = await viewer.getAncestor(result.entity) ?? result.entity; + + if (_highlightedEntity != targetEntity) { + if (_highlightedEntity != null) { + await viewer.removeStencilHighlight(_highlightedEntity!); + } + + _highlightedEntity = targetEntity; + if (_highlightedEntity != null) { + await viewer.setStencilHighlight(_highlightedEntity!); + } + } + } + + @override + Future onPointerHover(Offset localPosition) async { + if (_gizmoAttached) { + _gizmo?.checkHover(localPosition.dx, localPosition.dy); + } + + if (_highlightedEntity != null) { + await viewer.queuePositionUpdateFromViewportCoords( + _highlightedEntity!, + localPosition.dx, + localPosition.dy, + ); + } + } + + @override + Future onPointerScroll(Offset localPosition, double scrollDelta) async { + if(!enableCamera) { + return; + } + if (_currentState == ThermionGestureState.NULL || _currentState == ThermionGestureState.ZOOMING) { + await _zoom(localPosition, scrollDelta); + } + } + + @override + Future onPointerDown(Offset localPosition, int buttons) async { + if (_highlightedEntity != null) { + _resetToNullState(); + return; + } + + if (enablePicking && buttons != kMiddleMouseButton) { + viewer.pick(localPosition.dx.toInt(), localPosition.dy.toInt()); + } + + if (buttons == kMiddleMouseButton && enableCamera) { + await viewer.rotateStart(localPosition.dx, localPosition.dy); + _currentState = ThermionGestureState.ROTATING; + } else if (buttons == kPrimaryMouseButton && enableCamera) { + await viewer.panStart(localPosition.dx, localPosition.dy); + _currentState = ThermionGestureState.PANNING; + } + } + + @override + Future onPointerMove( + Offset localPosition, Offset delta, int buttons) async { + if (_highlightedEntity != null) { + await _handleEntityHighlightedMove(localPosition); + return; + } + + switch (_currentState) { + case ThermionGestureState.NULL: + break; + + case ThermionGestureState.ROTATING: + if (enableCamera) { + await viewer.rotateUpdate(localPosition.dx, localPosition.dy); + } + break; + case ThermionGestureState.PANNING: + if (enableCamera) { + await viewer.panUpdate(localPosition.dx, localPosition.dy); + } + break; + case ThermionGestureState.ZOOMING: + // ignore + break; + } + } + + @override + Future onPointerUp(int buttons) async { + switch (_currentState) { + case ThermionGestureState.ROTATING: + await viewer.rotateEnd(); + _currentState = ThermionGestureState.NULL; + break; + case ThermionGestureState.PANNING: + await viewer.panEnd(); + _currentState = ThermionGestureState.NULL; + break; + default: + break; + } + } + + Future _handleEntityHighlightedMove(Offset localPosition) async { + if (_highlightedEntity != null) { + await viewer.queuePositionUpdateFromViewportCoords( + _highlightedEntity!, + localPosition.dx, + localPosition.dy, + ); + } + } + + Future _zoom(Offset localPosition, double scrollDelta) async { + _scrollTimer?.cancel(); + _currentState = ThermionGestureState.ZOOMING; + await viewer.zoomBegin(); + await viewer.zoomUpdate( + localPosition.dx, localPosition.dy, scrollDelta > 0 ? 1 : -1); + + _scrollTimer = Timer(const Duration(milliseconds: 100), () async { + await viewer.zoomEnd(); + _currentState = ThermionGestureState.NULL; + }); + } + + @override + void dispose() { + _pickResultSubscription?.cancel(); + if (_highlightedEntity != null) { + viewer.removeStencilHighlight(_highlightedEntity!); + } + RawKeyboard.instance.removeListener(_handleKeyEvent); + } + + @override + Future get initialized => viewer.initialized; + + @override + GestureAction getActionForType(GestureType type) { + // TODO: implement getActionForType + throw UnimplementedError(); + } + + @override + Future onScaleEnd() { + // TODO: implement onScaleEnd + throw UnimplementedError(); + } + + @override + Future onScaleStart() { + // TODO: implement onScaleStart + throw UnimplementedError(); + } + + @override + Future onScaleUpdate() { + // TODO: implement onScaleUpdate + throw UnimplementedError(); + } + + @override + void setActionForType(GestureType type, GestureAction action) { + // TODO: implement setActionForType + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart index 20421c04..ae20650f 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector.dart @@ -1,28 +1,22 @@ -import 'dart:io'; - import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'thermion_gesture_detector_desktop.dart'; -import 'thermion_gesture_detector_mobile.dart'; - -enum GestureType { rotateCamera, panCamera, panBackground } /// /// A widget that translates finger/mouse gestures to zoom/pan/rotate actions. /// +@Deprecated("Use ThermionListenerWidget instead") class ThermionGestureDetector extends StatelessWidget { /// /// The content to display below the gesture detector/listener widget. /// This will usually be a ThermionWidget (so you can navigate by directly interacting with the viewport), but this is not necessary. - /// It is equally possible to render the viewport/gesture controls elsewhere in the widget hierarchy. The only requirement is that they share the same [Filamentviewer]. + /// It is equally possible to render the viewport/gesture controls elsewhere in the widget hierarchy. The only requirement is that they share the same [FilamentController]. /// final Widget? child; /// - /// The [viewer] attached to the [ThermionWidget] you wish to control. + /// The [controller] attached to the [ThermionWidget] you wish to control. /// - final ThermionViewer viewer; + final ThermionViewer controller; /// /// If true, an overlay will be shown with buttons to toggle whether pointer movements are interpreted as: @@ -47,7 +41,7 @@ class ThermionGestureDetector extends StatelessWidget { const ThermionGestureDetector( {Key? key, - required this.viewer, + required this.controller, this.child, this.showControlOverlay = false, this.enableCamera = true, @@ -59,33 +53,34 @@ class ThermionGestureDetector extends StatelessWidget { @override Widget build(BuildContext context) { - return FutureBuilder( - future: viewer.initialized, - builder: (_, initialized) { - if (initialized.data != true) { - return child ?? Container(); - } - if (kIsWeb || Platform.isLinux || - Platform.isWindows || - Platform.isMacOS) { - return ThermionGestureDetectorDesktop( - viewer: viewer, - child: child, - showControlOverlay: showControlOverlay, - enableCamera: enableCamera, - enablePicking: enablePicking, - ); - } else { - return ThermionGestureDetectorMobile( - viewer: viewer, - child: child, - showControlOverlay: showControlOverlay, - enableCamera: enableCamera, - enablePicking: enablePicking, - onScaleStart: onScaleStart, - onScaleUpdate: onScaleUpdate, - onScaleEnd: onScaleEnd); - } - }); + throw Exception("TODO"); + // return FutureBuilder( + // future: controller.initialized, + // builder: (_, initialized) { + // if (initialized.data != true) { + // return child ?? Container(); + // } + // if (kIsWeb || Platform.isLinux || + // Platform.isWindows || + // Platform.isMacOS) { + // return ThermionGestureDetectorDesktop( + // controller: controller, + // child: child, + // showControlOverlay: showControlOverlay, + // enableCamera: enableCamera, + // enablePicking: enablePicking, + // ); + // } else { + // return ThermionGestureDetectorMobile( + // controller: controller, + // child: child, + // showControlOverlay: showControlOverlay, + // enableCamera: enableCamera, + // enablePicking: enablePicking, + // onScaleStart: onScaleStart, + // onScaleUpdate: onScaleUpdate, + // onScaleEnd: onScaleEnd); + // } + // }); } } diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart index 11110ddd..948b92ab 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart @@ -10,14 +10,14 @@ import 'package:vector_math/vector_math_64.dart' as v64; class ThermionGestureDetectorDesktop extends StatefulWidget { final Widget? child; - final ThermionViewer viewer; + final ThermionGestureHandler gestureHandler; final bool showControlOverlay; final bool enableCamera; final bool enablePicking; const ThermionGestureDetectorDesktop({ Key? key, - required this.viewer, + required this.gestureHandler, this.child, this.showControlOverlay = false, this.enableCamera = true, @@ -30,38 +30,15 @@ class ThermionGestureDetectorDesktop extends StatefulWidget { class _ThermionGestureDetectorDesktopState extends State { - late ThermionGestureHandler _gestureHandler; - - @override - void initState() { - super.initState(); - _gestureHandler = ThermionGestureHandler( - enableCamera: widget.enableCamera, - enablePicking: widget.enablePicking, viewer: widget.viewer, - ); - } - - @override - void didUpdateWidget(ThermionGestureDetectorDesktop oldWidget) { - if (widget.enableCamera != oldWidget.enableCamera || - widget.enablePicking != oldWidget.enablePicking) { - _gestureHandler = ThermionGestureHandler( - viewer: widget.viewer, - enableCamera: widget.enableCamera, - enablePicking: widget.enablePicking, - ); - } - super.didUpdateWidget(oldWidget); - } - + @override Widget build(BuildContext context) { return Listener( onPointerHover: (event) => - _gestureHandler.onPointerHover(event.localPosition), + widget.gestureHandler.onPointerHover(event.localPosition), onPointerSignal: (PointerSignalEvent pointerSignal) { if (pointerSignal is PointerScrollEvent) { - _gestureHandler.onPointerScroll( + widget.gestureHandler.onPointerScroll( pointerSignal.localPosition, pointerSignal.scrollDelta.dy); } }, @@ -69,11 +46,11 @@ class _ThermionGestureDetectorDesktopState throw Exception("TODO - is this a pinch zoom on laptop trackpad?"); }, onPointerDown: (d) => - _gestureHandler.onPointerDown(d.localPosition, d.buttons), - onPointerMove: (d) => _gestureHandler.onPointerMove( - d.localPosition, d.delta, d.buttons), - onPointerUp: (d) => _gestureHandler.onPointerUp(d.buttons), + widget.gestureHandler.onPointerDown(d.localPosition, d.buttons), + onPointerMove: (d) => + widget.gestureHandler.onPointerMove(d.localPosition, d.delta, d.buttons), + onPointerUp: (d) => widget.gestureHandler.onPointerUp(d.buttons), child: widget.child, ); } -} \ No newline at end of file +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart index a5f9ec4a..2be95fe3 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart @@ -2,192 +2,221 @@ import 'dart:async'; import 'package:flutter/gestures.dart'; import 'package:flutter/services.dart'; -import 'package:logging/logging.dart'; -import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; -import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; + +enum GestureType { POINTER_HOVER, POINTER_DOWN, SCALE } + +enum GestureAction { + PAN_CAMERA, + ROTATE_CAMERA, + ZOOM_CAMERA, + TRANSLATE_ENTITY, + ROTATE_ENTITY +} enum ThermionGestureState { NULL, - ENTITY_HIGHLIGHTED, - GIZMO_ATTACHED, ROTATING, PANNING, + ZOOMING, // aka SCROLL } -class ThermionGestureHandler { - final ThermionViewer viewer; - final bool enableCamera; - final bool enablePicking; - final Logger _logger = Logger("ThermionGestureHandler"); - - ThermionGestureState _currentState = ThermionGestureState.NULL; - AbstractGizmo? _gizmo; - Timer? _scrollTimer; - ThermionEntity? _highlightedEntity; - StreamSubscription? _pickResultSubscription; - - ThermionGestureHandler({ - required this.viewer, - this.enableCamera = true, - this.enablePicking = true, - }) { - try { - _gizmo = viewer.gizmo; - } catch (err) { - _logger.warning( - "Failed to get gizmo. If you are running on WASM, this is expected"); - } - - _pickResultSubscription = viewer.pickResult.listen(_onPickResult); - - // Add keyboard listener - RawKeyboard.instance.addListener(_handleKeyEvent); - } - - void _handleKeyEvent(RawKeyEvent event) { - if (event is RawKeyDownEvent && - event.logicalKey == LogicalKeyboardKey.escape) { - _resetToNullState(); - } - } - - void _resetToNullState() async { - // set current state to NULL first, so that any subsequent pointer movements - // won't attempt to translate a deleted entity - _currentState = ThermionGestureState.NULL; - if (_highlightedEntity != null) { - await viewer.removeStencilHighlight(_highlightedEntity!); - _highlightedEntity = null; - } - } - - void _onPickResult(FilamentPickResult result) async { - var targetEntity = await viewer.getAncestor(result.entity) ?? result.entity; - - if (_highlightedEntity != targetEntity) { - if (_highlightedEntity != null) { - await viewer.removeStencilHighlight(_highlightedEntity!); - } - - _highlightedEntity = targetEntity; - if (_highlightedEntity != null) { - await viewer.setStencilHighlight(_highlightedEntity!); - } - - _currentState = _highlightedEntity != null - ? ThermionGestureState.ENTITY_HIGHLIGHTED - : ThermionGestureState.NULL; - } - } - - Future onPointerHover(Offset localPosition) async { - if (_currentState == ThermionGestureState.GIZMO_ATTACHED) { - _gizmo?.checkHover(localPosition.dx, localPosition.dy); - } - - // Update highlighted entity position - if (_highlightedEntity != null) { - await viewer.queuePositionUpdateFromViewportCoords( - _highlightedEntity!, - localPosition.dx, - localPosition.dy, - ); - } - } - - Future onPointerScroll(Offset localPosition, double scrollDelta) async { - if (_currentState == ThermionGestureState.NULL && enableCamera) { - await _zoom(localPosition, scrollDelta); - } - } - - Future onPointerDown(Offset localPosition, int buttons) async { - if (_currentState == ThermionGestureState.ENTITY_HIGHLIGHTED) { - _resetToNullState(); - return; - } - - if (enablePicking && buttons != kMiddleMouseButton) { - viewer.pick(localPosition.dx.toInt(), localPosition.dy.toInt()); - } - - if (buttons == kMiddleMouseButton && enableCamera) { - await viewer.rotateStart(localPosition.dx, localPosition.dy); - _currentState = ThermionGestureState.ROTATING; - } else if (buttons == kPrimaryMouseButton && enableCamera) { - await viewer.panStart(localPosition.dx, localPosition.dy); - _currentState = ThermionGestureState.PANNING; - } - } - - Future onPointerMove( - Offset localPosition, Offset delta, int buttons) async { - switch (_currentState) { - case ThermionGestureState.NULL: - // This case should not occur now, as we set the state on pointer down - break; - case ThermionGestureState.ENTITY_HIGHLIGHTED: - await _handleEntityHighlightedMove(localPosition); - break; - case ThermionGestureState.GIZMO_ATTACHED: - // Do nothing - break; - case ThermionGestureState.ROTATING: - if (enableCamera) { - await viewer.rotateUpdate(localPosition.dx, localPosition.dy); - } - break; - case ThermionGestureState.PANNING: - if (enableCamera) { - await viewer.panUpdate(localPosition.dx, localPosition.dy); - } - break; - } - } - - Future onPointerUp(int buttons) async { - switch (_currentState) { - case ThermionGestureState.ROTATING: - await viewer.rotateEnd(); - _currentState = ThermionGestureState.NULL; - break; - case ThermionGestureState.PANNING: - await viewer.panEnd(); - _currentState = ThermionGestureState.NULL; - break; - default: - // For other states, no action needed - break; - } - } - - Future _handleEntityHighlightedMove(Offset localPosition) async { - if (_highlightedEntity != null) { - await viewer.queuePositionUpdateFromViewportCoords( - _highlightedEntity!, - localPosition.dx, - localPosition.dy, - ); - } - } - - Future _zoom(Offset localPosition, double scrollDelta) async { - _scrollTimer?.cancel(); - await viewer.zoomBegin(); - await viewer.zoomUpdate( - localPosition.dx, localPosition.dy, scrollDelta > 0 ? 1 : -1); - - _scrollTimer = Timer(const Duration(milliseconds: 100), () async { - await viewer.zoomEnd(); - }); - } - - void dispose() { - _pickResultSubscription?.cancel(); - if (_highlightedEntity != null) { - viewer.removeStencilHighlight(_highlightedEntity!); - } - // Remove keyboard listener - RawKeyboard.instance.removeListener(_handleKeyEvent); - } +abstract class ThermionGestureHandler { + GestureAction getActionForType(GestureType type); + void setActionForType(GestureType type, GestureAction action); + Future onPointerHover(Offset localPosition); + Future onPointerScroll(Offset localPosition, double scrollDelta); + Future onPointerDown(Offset localPosition, int buttons); + Future onPointerMove(Offset localPosition, Offset delta, int buttons); + Future onPointerUp(int buttons); + Future onScaleStart(); + Future onScaleUpdate(); + Future onScaleEnd(); + Future get initialized; + void dispose(); } + +// enum ThermionGestureState { +// NULL, +// ENTITY_HIGHLIGHTED, +// GIZMO_ATTACHED, +// ROTATING, +// PANNING, +// } + +// class ThermionGestureHandler { +// final ThermionViewer viewer; +// final bool enableCamera; +// final bool enablePicking; +// final Logger _logger = Logger("ThermionGestureHandler"); + +// ThermionGestureState _currentState = ThermionGestureState.NULL; +// AbstractGizmo? _gizmo; +// Timer? _scrollTimer; +// ThermionEntity? _highlightedEntity; +// StreamSubscription? _pickResultSubscription; + +// ThermionGestureHandler({ +// required this.viewer, +// this.enableCamera = true, +// this.enablePicking = true, +// }) { +// try { +// _gizmo = viewer.gizmo; +// } catch (err) { +// _logger.warning( +// "Failed to get gizmo. If you are running on WASM, this is expected"); +// } + +// _pickResultSubscription = viewer.pickResult.listen(_onPickResult); + +// // Add keyboard listener +// RawKeyboard.instance.addListener(_handleKeyEvent); +// } + +// void _handleKeyEvent(RawKeyEvent event) { +// if (event is RawKeyDownEvent && +// event.logicalKey == LogicalKeyboardKey.escape) { +// _resetToNullState(); +// } +// } + +// void _resetToNullState() async { +// // set current state to NULL first, so that any subsequent pointer movements +// // won't attempt to translate a deleted entity +// _currentState = ThermionGestureState.NULL; +// if (_highlightedEntity != null) { +// await viewer.removeStencilHighlight(_highlightedEntity!); +// _highlightedEntity = null; +// } +// } + +// void _onPickResult(FilamentPickResult result) async { +// var targetEntity = await viewer.getAncestor(result.entity) ?? result.entity; + +// if (_highlightedEntity != targetEntity) { +// if (_highlightedEntity != null) { +// await viewer.removeStencilHighlight(_highlightedEntity!); +// } + +// _highlightedEntity = targetEntity; +// if (_highlightedEntity != null) { +// await viewer.setStencilHighlight(_highlightedEntity!); +// } + +// _currentState = _highlightedEntity != null +// ? ThermionGestureState.ENTITY_HIGHLIGHTED +// : ThermionGestureState.NULL; +// } +// } + +// Future onPointerHover(Offset localPosition) async { +// if (_currentState == ThermionGestureState.GIZMO_ATTACHED) { +// _gizmo?.checkHover(localPosition.dx, localPosition.dy); +// } + +// // Update highlighted entity position +// if (_highlightedEntity != null) { +// await viewer.queuePositionUpdateFromViewportCoords( +// _highlightedEntity!, +// localPosition.dx, +// localPosition.dy, +// ); +// } +// } + +// Future onPointerScroll(Offset localPosition, double scrollDelta) async { +// if (_currentState == ThermionGestureState.NULL && enableCamera) { +// await _zoom(localPosition, scrollDelta); +// } +// } + +// Future onPointerDown(Offset localPosition, int buttons) async { +// if (_currentState == ThermionGestureState.ENTITY_HIGHLIGHTED) { +// _resetToNullState(); +// return; +// } + +// if (enablePicking && buttons != kMiddleMouseButton) { +// viewer.pick(localPosition.dx.toInt(), localPosition.dy.toInt()); +// } + +// if (buttons == kMiddleMouseButton && enableCamera) { +// await viewer.rotateStart(localPosition.dx, localPosition.dy); +// _currentState = ThermionGestureState.ROTATING; +// } else if (buttons == kPrimaryMouseButton && enableCamera) { +// await viewer.panStart(localPosition.dx, localPosition.dy); +// _currentState = ThermionGestureState.PANNING; +// } +// } + +// Future onPointerMove( +// Offset localPosition, Offset delta, int buttons) async { +// switch (_currentState) { +// case ThermionGestureState.NULL: +// // This case should not occur now, as we set the state on pointer down +// break; +// case ThermionGestureState.ENTITY_HIGHLIGHTED: +// await _handleEntityHighlightedMove(localPosition); +// break; +// case ThermionGestureState.GIZMO_ATTACHED: +// // Do nothing +// break; +// case ThermionGestureState.ROTATING: +// if (enableCamera) { +// await viewer.rotateUpdate(localPosition.dx, localPosition.dy); +// } +// break; +// case ThermionGestureState.PANNING: +// if (enableCamera) { +// await viewer.panUpdate(localPosition.dx, localPosition.dy); +// } +// break; +// } +// } + +// Future onPointerUp(int buttons) async { +// switch (_currentState) { +// case ThermionGestureState.ROTATING: +// await viewer.rotateEnd(); +// _currentState = ThermionGestureState.NULL; +// break; +// case ThermionGestureState.PANNING: +// await viewer.panEnd(); +// _currentState = ThermionGestureState.NULL; +// break; +// default: +// // For other states, no action needed +// break; +// } +// } + +// Future _handleEntityHighlightedMove(Offset localPosition) async { +// if (_highlightedEntity != null) { +// await viewer.queuePositionUpdateFromViewportCoords( +// _highlightedEntity!, +// localPosition.dx, +// localPosition.dy, +// ); +// } +// } + +// Future _zoom(Offset localPosition, double scrollDelta) async { +// _scrollTimer?.cancel(); +// await viewer.zoomBegin(); +// await viewer.zoomUpdate( +// localPosition.dx, localPosition.dy, scrollDelta > 0 ? 1 : -1); + +// _scrollTimer = Timer(const Duration(milliseconds: 100), () async { +// await viewer.zoomEnd(); +// }); +// } + +// void dispose() { +// _pickResultSubscription?.cancel(); +// if (_highlightedEntity != null) { +// viewer.removeStencilHighlight(_highlightedEntity!); +// } +// // Remove keyboard listener +// RawKeyboard.instance.removeListener(_handleKeyEvent); +// } +// } diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart new file mode 100644 index 00000000..3295c58a --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart @@ -0,0 +1,57 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_desktop_widget.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart'; + +/// +/// A widget that captures swipe/pointer events. +/// This is a dumb listener that simply forwards events to the provided [ThermionGestureHandler]. +/// +class ThermionListenerWidget extends StatelessWidget { + /// + /// The content to display below the gesture detector/listener widget. + /// This will usually be a ThermionWidget (so you can navigate by directly interacting with the viewport), but this is not necessary. + /// It is equally possible to render the viewport/gesture controls elsewhere in the widget hierarchy. The only requirement is that they share the same [FilamentViewer]. + /// + final Widget? child; + + /// + /// The handler to use for interpreting gestures/pointer movements. + /// + final ThermionGestureHandler gestureHandler; + + ThermionListenerWidget({ + Key? key, + required this.gestureHandler, + this.child, + }) : super(key: key); + + bool get isDesktop => kIsWeb || + Platform.isLinux || + Platform.isWindows || + Platform.isMacOS; + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: gestureHandler.initialized, + builder: (_, initialized) { + if (initialized.data != true) { + return child ?? Container(); + } + return Stack(children: [ + if(child != null) + Positioned.fill(child:child!), + if (isDesktop) + Positioned.fill(child:ThermionGestureDetectorDesktop( + gestureHandler: gestureHandler)), + if(!isDesktop) + Positioned.fill(child:ThermionGestureDetectorMobile( + gestureHandler: gestureHandler)) + ]); + }); + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/mobile_gesture_handler_selector_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/mobile_gesture_handler_selector_widget.dart new file mode 100644 index 00000000..210ee718 --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/mobile_gesture_handler_selector_widget.dart @@ -0,0 +1,28 @@ +import 'package:flutter/widgets.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; + +class MobileGestureHandlerSelectorWidget extends StatelessWidget { + final ThermionGestureHandler handler; + + const MobileGestureHandlerSelectorWidget({super.key, required this.handler}); + @override + Widget build(BuildContext context) { + throw Exception("TODO"); + // return GestureDetector( + // onTap: () { + + // var curIdx = + // GestureType.values.indexOf(handler.gestureType); + // var nextIdx = + // curIdx == GestureType.values.length - 1 ? 0 : curIdx + 1; + // handler.setGestureType(GestureType.values[nextIdx]); + // }); + // }, + // child: Container( + // padding: const EdgeInsets.all(50), + // child: Icon(_icons[widget.gestureHandler.gestureType], + // color: Colors.green), + // ), + // ); + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_desktop_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_desktop_widget.dart new file mode 100644 index 00000000..38f5ad0e --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_desktop_widget.dart @@ -0,0 +1,37 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; + +class ThermionGestureDetectorDesktop extends StatelessWidget { + + final ThermionGestureHandler gestureHandler; + + const ThermionGestureDetectorDesktop({ + Key? key, + required this.gestureHandler, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Listener( + onPointerHover: (event) => + gestureHandler.onPointerHover(event.localPosition), + onPointerSignal: (PointerSignalEvent pointerSignal) { + if (pointerSignal is PointerScrollEvent) { + gestureHandler.onPointerScroll( + pointerSignal.localPosition, pointerSignal.scrollDelta.dy); + } + }, + onPointerPanZoomStart: (pzs) { + throw Exception("TODO - is this a pinch zoom on laptop trackpad?"); + }, + onPointerDown: (d) { + gestureHandler.onPointerDown(d.localPosition, d.buttons); + }, + onPointerMove: (d) => + gestureHandler.onPointerMove(d.localPosition, d.delta, d.buttons), + onPointerUp: (d) => gestureHandler.onPointerUp(d.buttons), + child: Container(color: Colors.transparent,), + ); + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart new file mode 100644 index 00000000..b6907d96 --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart @@ -0,0 +1,51 @@ +import 'package:flutter/widgets.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; + +class ThermionGestureDetectorMobile extends StatefulWidget { + final Widget? child; + final ThermionGestureHandler gestureHandler; + + const ThermionGestureDetectorMobile({ + Key? key, + required this.gestureHandler, + this.child, + }) : super(key: key); + + @override + State createState() => _ThermionGestureDetectorMobileState(); +} + +class _ThermionGestureDetectorMobileState + extends State { + @override + Widget build(BuildContext context) { + return Stack(children: [ + Positioned.fill( + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTapDown: (details) => + widget.gestureHandler.onPointerDown(details.localPosition, 0), + onDoubleTap: () { + var current = widget.gestureHandler.getActionForType(GestureType.SCALE); + if(current == GestureAction.PAN_CAMERA) { + widget.gestureHandler.setActionForType(GestureType.SCALE, GestureAction.ROTATE_CAMERA); + } else { + widget.gestureHandler.setActionForType(GestureType.SCALE, GestureAction.PAN_CAMERA); + } + }, + onScaleStart: (details) async { + await widget.gestureHandler.onScaleStart(); + }, + onScaleUpdate: (details) async { + await widget.gestureHandler.onScaleUpdate(); + }, + onScaleEnd: (details) async { + await widget.gestureHandler.onScaleUpdate(); + }, + child: widget.child, + ), + ), + + ]); + } +} From 44078ba2e0490d62ef77a6c8b6604b45eb9144b4 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 10:34:23 +0800 Subject: [PATCH 132/232] add v2 gesture handlers --- thermion_flutter/thermion_flutter/lib/thermion_flutter.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart b/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart index be4e9ea5..fc1e3c83 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart @@ -3,6 +3,7 @@ library thermion_flutter; export 'thermion/thermion_flutter_plugin.dart'; export 'thermion/widgets/thermion_widget.dart'; export 'thermion/widgets/camera/gestures/thermion_gesture_detector.dart'; +export 'thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; export 'thermion/widgets/camera/camera_orientation_widget.dart'; export 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; export 'package:thermion_dart/thermion_dart.dart'; From 90827ff0127b5eff6a322f004bb4d5b031bd5fcb Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 10:34:47 +0800 Subject: [PATCH 133/232] culling fixes for HighlightOverlay --- thermion_dart/native/src/HighlightOverlay.cpp | 144 ++++++++++-------- 1 file changed, 83 insertions(+), 61 deletions(-) diff --git a/thermion_dart/native/src/HighlightOverlay.cpp b/thermion_dart/native/src/HighlightOverlay.cpp index b7a313c1..12589b8e 100644 --- a/thermion_dart/native/src/HighlightOverlay.cpp +++ b/thermion_dart/native/src/HighlightOverlay.cpp @@ -4,54 +4,62 @@ #include "SceneManager.hpp" -namespace thermion_filament { +namespace thermion_filament +{ SceneManager::HighlightOverlay::HighlightOverlay( - EntityId entityId, - SceneManager* const sceneManager, - Engine* engine, - float r, - float g, - float b) : _sceneManager(sceneManager), _engine(engine) { - - auto& rm = engine->getRenderableManager(); - - auto& tm = engine->getTransformManager(); + EntityId entityId, + SceneManager *const sceneManager, + Engine *engine, + float r, + float g, + float b) : _sceneManager(sceneManager), _engine(engine) + { + + auto &rm = engine->getRenderableManager(); + + auto &tm = engine->getTransformManager(); // Create the outline/highlight material instance - filament::gltfio::MaterialKey dummyKey; // We're not using the key for this simple material - filament::gltfio::UvMap dummyUvMap; // We're not using UV mapping for this simple material + filament::gltfio::MaterialKey dummyKey; // We're not using the key for this simple material + filament::gltfio::UvMap dummyUvMap; // We're not using UV mapping for this simple material auto materialProvider = sceneManager->unlitMaterialProvider(); - + _highlightMaterialInstance = materialProvider->createMaterialInstance(&dummyKey, &dummyUvMap); - + _highlightMaterialInstance->setDoubleSided(false); _highlightMaterialInstance->setStencilOpStencilFail(filament::backend::StencilOperation::KEEP); _highlightMaterialInstance->setStencilOpDepthFail(filament::backend::StencilOperation::KEEP); - _highlightMaterialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::KEEP); + _highlightMaterialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::REPLACE); _highlightMaterialInstance->setStencilCompareFunction(filament::backend::SamplerCompareFunc::NE); _highlightMaterialInstance->setStencilReferenceValue(1); - _highlightMaterialInstance->setParameter("color", filament::math::float3 { r, g, b }); - _highlightMaterialInstance->setParameter("scale", 1.05f); + + _highlightMaterialInstance->setParameter("color", filament::math::float3{r, g, b}); + _highlightMaterialInstance->setParameter("scale", 1.04f); + _highlightMaterialInstance->setCullingMode(filament::backend::CullingMode::FRONT); + auto scene = sceneManager->getScene(); _isGeometryEntity = sceneManager->isGeometryEntity(entityId); _isGltfAsset = sceneManager->isGltfAsset(entityId); - if(!(_isGeometryEntity || _isGltfAsset)) { + if (!(_isGeometryEntity || _isGltfAsset)) + { Log("Failed to set stencil outline for entity %d: the entity is a child of another entity. " - "Currently, we only support outlining top-level entities." - "Call getAncestor() to get the ancestor of this entity, then set on that", entityId); + "Currently, we only support outlining top-level entities." + "Call getAncestor() to get the ancestor of this entity, then set on that", + entityId); return; } - if(_isGeometryEntity) { + if (_isGeometryEntity) + { Log("Entity %d is geometry", entityId); auto geometryEntity = Entity::import(entityId); - auto renderable = rm.getInstance(geometryEntity); + auto renderable = rm.getInstance(geometryEntity); auto materialInstance = rm.getMaterialInstanceAt(renderable, 0); @@ -60,37 +68,40 @@ namespace thermion_filament { materialInstance->setDepthWrite(true); materialInstance->setStencilReferenceValue(1); materialInstance->setStencilOpStencilFail(filament::backend::StencilOperation::KEEP); - materialInstance->setStencilOpDepthFail(filament::backend::StencilOperation::REPLACE); - materialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::REPLACE); + materialInstance->setStencilOpDepthFail(filament::backend::StencilOperation::KEEP); + materialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::KEEP); materialInstance->setStencilCompareFunction(filament::backend::SamplerCompareFunc::A); + // materialInstance->setCullingMode(filament::MaterialInstance::CullingMode::BACK); auto geometry = sceneManager->getGeometry(entityId); _entity = utils::EntityManager::get().create(); RenderableManager::Builder builder(1); builder.boundingBox(geometry->getBoundingBox()) - .geometry(0, geometry->primitiveType, geometry->vertexBuffer(), geometry->indexBuffer(), 0, geometry->numIndices) - .culling(true) - .material(0, _highlightMaterialInstance) - .receiveShadows(false) - .castShadows(false); + .geometry(0, geometry->primitiveType, geometry->vertexBuffer(), geometry->indexBuffer(), 0, geometry->numIndices) + .culling(true) + .material(0, _highlightMaterialInstance) + .priority(0) + .receiveShadows(false) + .castShadows(false); builder.build(*engine, _entity); scene->addEntity(_entity); auto outlineTransformInstance = tm.getInstance(_entity); auto entityTransformInstance = tm.getInstance(geometryEntity); - tm.setParent(outlineTransformInstance, entityTransformInstance); - } else if(_isGltfAsset) { + tm.setParent(outlineTransformInstance, entityTransformInstance); + } + else if (_isGltfAsset) + { Log("Entity %d is gltf", entityId); auto *asset = sceneManager->getAssetByEntityId(entityId); - + if (asset) { Log("Found glTF FilamentAsset with %d material instances", asset->getInstance()->getMaterialInstanceCount()); - auto materialInstance = asset->getInstance()->getMaterialInstances()[0]; // set stencil write on the existing material @@ -108,55 +119,66 @@ namespace thermion_filament { auto newTransformInstance = tm.getInstance(_entity); - auto entityTransformInstance = tm.getInstance(asset->getRoot()); - tm.setParent(newTransformInstance, entityTransformInstance); - if(!_newInstance) { + auto entityTransformInstance = tm.getInstance(asset->getRoot()); + tm.setParent(newTransformInstance, entityTransformInstance); + if (!_newInstance) + { Log("Couldn't create new instance"); - } else { - for(int i = 0; i < _newInstance->getEntityCount(); i++) { + } + else + { + for (int i = 0; i < _newInstance->getEntityCount(); i++) + { auto entity = _newInstance->getEntities()[i]; auto renderableInstance = rm.getInstance(entity); rm.setPriority(renderableInstance, 7); - if(renderableInstance.isValid()) { - for(int primitiveIndex = 0; primitiveIndex < rm.getPrimitiveCount(renderableInstance); primitiveIndex++) { + if (renderableInstance.isValid()) + { + for (int primitiveIndex = 0; primitiveIndex < rm.getPrimitiveCount(renderableInstance); primitiveIndex++) + { rm.setMaterialInstanceAt(renderableInstance, primitiveIndex, _highlightMaterialInstance); } - } else { + } + else + { Log("Not renderable, ignoring"); } - } - scene->addEntities(_newInstance->getEntities(), _newInstance->getEntityCount()); + } + scene->addEntities(_newInstance->getEntities(), _newInstance->getEntityCount()); } - } else { + } + else + { Log("Not FilamentAsset"); } } + } - -} - -SceneManager::HighlightOverlay::~HighlightOverlay() { - Log("Destructor"); - if (_entity.isNull()) { - Log("Null entity"); - return; - } - - if (_isGltfAsset) + SceneManager::HighlightOverlay::~HighlightOverlay() + { + if (_entity.isNull()) + { + Log("Null entity"); + return; + } + + if (_isGltfAsset) { - Log("Erasing new instance"); _sceneManager->getScene()->removeEntities(_newInstance->getEntities(), _newInstance->getEntityCount()); _newInstance->detachMaterialInstances(); _engine->destroy(_highlightMaterialInstance); - } else if(_isGeometryEntity) { - Log("Erasing new geometry"); - auto& tm = _engine->getTransformManager(); + } + else if (_isGeometryEntity) + { + auto &tm = _engine->getTransformManager(); auto transformInstance = tm.getInstance(_entity); _sceneManager->getScene()->remove(_entity); utils::EntityManager::get().destroy(_entity); _engine->destroy(_entity); _engine->destroy(_highlightMaterialInstance); - } else { + } + else + { Log("FATAL: Unknown highlight overlay entity type"); } } From 98113fb79f2c0ac09e61c57a7c380e66356f36ba Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 10:34:59 +0800 Subject: [PATCH 134/232] remove logging --- thermion_dart/native/src/ThermionDartFFIApi.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/thermion_dart/native/src/ThermionDartFFIApi.cpp b/thermion_dart/native/src/ThermionDartFFIApi.cpp index 6f1df24c..f7750910 100644 --- a/thermion_dart/native/src/ThermionDartFFIApi.cpp +++ b/thermion_dart/native/src/ThermionDartFFIApi.cpp @@ -262,7 +262,6 @@ extern "C" uint32_t height, void (*onComplete)()) { - Log("Creating swapchain %dx%d with viewer %lu & surface %lu", width, height, viewer, surface); std::packaged_task lambda( [=]() mutable { From d476d78e2b08e1e165ac688ea1c7cd7c75498c02 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 10:35:13 +0800 Subject: [PATCH 135/232] reduce size of gizmo --- thermion_dart/native/src/Gizmo.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/thermion_dart/native/src/Gizmo.cpp b/thermion_dart/native/src/Gizmo.cpp index 65080fa3..75116d81 100644 --- a/thermion_dart/native/src/Gizmo.cpp +++ b/thermion_dart/native/src/Gizmo.cpp @@ -38,7 +38,7 @@ Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) _materialInstances[3]->setParameter("color", math::float4{0.0f, 0.0f, 0.0f, 1.0f}); // Black color // Create center cube vertices - float centerCubeSize = 0.05f; + float centerCubeSize = 0.01f; float *centerCubeVertices = new float[8 * 3]{ -centerCubeSize, -centerCubeSize, -centerCubeSize, centerCubeSize, -centerCubeSize, -centerCubeSize, @@ -78,7 +78,7 @@ Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) {centerCubeSize, centerCubeSize, centerCubeSize}}) .material(0, _materialInstances[3]) .layerMask(0xFF, 2) - .priority(6) + .priority(7) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, centerCubeVb, centerCubeIb, 0, 36) .culling(false) .build(engine, _entities[3]); @@ -88,10 +88,10 @@ Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) transformManager.setTransform(cubeTransformInstance, cubeTransform); // Line and arrow vertices - float lineLength = 0.8f; + float lineLength = 0.6f; float lineWidth = 0.005f; - float arrowLength = 0.1f; - float arrowWidth = 0.03f; + float arrowLength = 0.05f; + float arrowWidth = 0.02f; float *vertices = new float[13 * 3]{ // Line vertices (8 vertices) -lineWidth, -lineWidth, 0.0f, From 98fefd0e52c71d66215d51a6c595678fafbe9bfa Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 10:35:33 +0800 Subject: [PATCH 136/232] fix winding order in GeometryHelper --- .../lib/thermion_dart/geometry_helper.dart | 186 +++++++++++------- 1 file changed, 116 insertions(+), 70 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/geometry_helper.dart b/thermion_dart/lib/thermion_dart/geometry_helper.dart index 4ada4971..8ddd1aa4 100644 --- a/thermion_dart/lib/thermion_dart/geometry_helper.dart +++ b/thermion_dart/lib/thermion_dart/geometry_helper.dart @@ -3,7 +3,7 @@ import 'dart:math'; class Geometry { final List vertices; final List indices; - final List normals; + final List? normals; Geometry(this.vertices, this.indices, this.normals); @@ -15,7 +15,7 @@ class Geometry { } class GeometryHelper { - static Geometry sphere() { +static Geometry sphere() { int latitudeBands = 20; int longitudeBands = 20; @@ -136,90 +136,136 @@ class GeometryHelper { -1, 0, 0, ]; - final indices = [ + final indices = [ // Front face - 0, 3, 2, 0, 2, 1, + 0, 1, 2, 0, 2, 3, // Back face - 4, 7, 6, 4, 6, 5, + 4, 5, 6, 4, 6, 7, // Top face - 8, 11, 10, 8, 10, 9, + 8, 9, 10, 8, 10, 11, // Bottom face - 12, 15, 14, 12, 14, 13, + 12, 13, 14, 12, 14, 15, // Right face - 16, 19, 18, 16, 18, 17, + 16, 17, 18, 16, 18, 19, // Left face - 20, 23, 22, 20, 22, 21 + 20, 21, 22, 20, 22, 23 ]; - return Geometry(vertices, indices, normals); } static Geometry cylinder({double radius = 1.0, double length = 1.0}) { - int segments = 32; - List vertices = []; - List indices = []; + int segments = 32; + List vertices = []; + List normals = []; + List indices = []; - // Create vertices - for (int i = 0; i <= segments; i++) { - double theta = i * 2 * pi / segments; - double x = radius * cos(theta); - double z = radius * sin(theta); + // Create vertices and normals + for (int i = 0; i <= segments; i++) { + double theta = i * 2 * pi / segments; + double x = radius * cos(theta); + double z = radius * sin(theta); - // Top circle - vertices.addAll([x, length / 2, z]); - // Bottom circle - vertices.addAll([x, -length / 2, z]); - } + // Top circle + vertices.addAll([x, length / 2, z]); + normals.addAll([x / radius, 0, z / radius]); - // Create indices - for (int i = 0; i < segments; i++) { - int topFirst = i * 2; - int topSecond = (i + 1) * 2; - int bottomFirst = topFirst + 1; - int bottomSecond = topSecond + 1; - - // Top face (counter-clockwise) - indices.addAll([segments * 2, topSecond, topFirst]); - // Bottom face (counter-clockwise when viewed from below) - indices.addAll([segments * 2 + 1, bottomFirst, bottomSecond]); - // Side faces (counter-clockwise) - indices.addAll([topFirst, bottomFirst, topSecond]); - indices.addAll([bottomFirst, bottomSecond, topSecond]); - } - - // Add center vertices for top and bottom faces - vertices.addAll([0, length / 2, 0]); // Top center - vertices.addAll([0, -length / 2, 0]); // Bottom center - - return Geometry(vertices:vertices, indices:indices, normals:normals); + // Bottom circle + vertices.addAll([x, -length / 2, z]); + normals.addAll([x / radius, 0, z / radius]); } - static Geometry conic({double radius = 1.0, double length = 1.0}) { - int segments = 32; - List vertices = []; - List indices = []; + // Create indices + for (int i = 0; i < segments; i++) { + int topFirst = i * 2; + int topSecond = (i + 1) * 2; + int bottomFirst = topFirst + 1; + int bottomSecond = topSecond + 1; - // Create vertices - for (int i = 0; i <= segments; i++) { - double theta = i * 2 * pi / segments; - double x = radius * cos(theta); - double z = radius * sin(theta); - - // Base circle - vertices.addAll([x, 0, z]); - } - // Apex - vertices.addAll([0, length, 0]); - - // Create indices - for (int i = 0; i < segments; i++) { - // Base face - indices.addAll([i, i + 1, segments + 1]); - // Side faces - indices.addAll([i, segments, i + 1]); - } - - return Geometry(vertices:vertices, indices:indices, normals:normals); + // Top face (counter-clockwise) + indices.addAll([segments * 2, topSecond, topFirst]); + // Bottom face (counter-clockwise when viewed from below) + indices.addAll([segments * 2 + 1, bottomFirst, bottomSecond]); + // Side faces (counter-clockwise) + indices.addAll([topFirst, bottomFirst, topSecond]); + indices.addAll([bottomFirst, bottomSecond, topSecond]); } + + // Add center vertices and normals for top and bottom faces + vertices.addAll([0, length / 2, 0]); // Top center + normals.addAll([0, 1, 0]); + vertices.addAll([0, -length / 2, 0]); // Bottom center + normals.addAll([0, -1, 0]); + + // Add top and bottom face normals + for (int i = 0; i <= segments; i++) { + normals.addAll([0, 1, 0]); // Top face normal + normals.addAll([0, -1, 0]); // Bottom face normal + } + + return Geometry(vertices, indices, normals); } -} + + static Geometry conic({double radius = 1.0, double length = 1.0}) { + int segments = 32; + List vertices = []; + List normals = []; + List indices = []; + + // Create vertices and normals + for (int i = 0; i <= segments; i++) { + double theta = i * 2 * pi / segments; + double x = radius * cos(theta); + double z = radius * sin(theta); + + // Base circle + vertices.addAll([x, 0, z]); + + // Calculate normal for the side + double nx = x / sqrt(x * x + length * length); + double nz = z / sqrt(z * z + length * length); + double ny = radius / sqrt(radius * radius + length * length); + normals.addAll([nx, ny, nz]); + } + // Apex + vertices.addAll([0, length, 0]); + normals.addAll([0, 1, 0]); // Normal at apex points straight up + + // Create indices + for (int i = 0; i < segments; i++) { + // Base face + indices.addAll([i, i + 1, segments + 1]); + // Side faces + indices.addAll([i, segments, i + 1]); + } + + // Add base face normals + for (int i = 0; i <= segments; i++) { + normals.addAll([0, -1, 0]); // Base face normal + } + + return Geometry(vertices, indices, normals); + } + + static Geometry plane({double width = 1.0, double height = 1.0}) { + List vertices = [ + -width / 2, 0, -height / 2, + width / 2, 0, -height / 2, + width / 2, 0, height / 2, + -width / 2, 0, height / 2, + ]; + + List normals = [ + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + ]; + + List indices = [ + 0, 1, 2, + 0, 2, 3, + ]; + + return Geometry(vertices, indices, normals); + } +} \ No newline at end of file From b6863828b460cc465c82962f046f43dd7387280c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 10:35:57 +0800 Subject: [PATCH 137/232] initialize viewportDimensions to (0,0) in ThermionViewer --- thermion_dart/lib/thermion_dart/thermion_viewer.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index f7e2b927..e16bde5d 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -61,7 +61,7 @@ abstract class ThermionViewer { /// /// The current dimensions of the viewport (in physical pixels). /// - late (double, double) viewportDimensions; + var viewportDimensions = (0.0,0.0); /// /// The current ratio of logical to physical pixels. @@ -575,7 +575,7 @@ abstract class ThermionViewer { double aperture, double shutterSpeed, double sensitivity); /// - /// Rotate the camera by [rads] around the given axis. Note this is not persistent - any viewport navigation will reset the camera transform. + /// Rotate the camera by [rads] around the given axis. /// Future setCameraRotation(Quaternion quaternion); @@ -728,6 +728,7 @@ abstract class ThermionViewer { /// Sets the options for manipulating the camera via the viewport. /// ManipulatorMode.FREE_FLIGHT and ManipulatorMode.MAP are currently unsupported and will throw an exception. /// + @Deprecated("Use ThermionGestureHandler instead") Future setCameraManipulatorOptions( {ManipulatorMode mode = ManipulatorMode.ORBIT, double orbitSpeedX = 0.01, From 5b3d16a3164f02a1d3cf01776b1482325f9510eb Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 10:36:07 +0800 Subject: [PATCH 138/232] update bindings --- .../compatibility/native/thermion_dart.g.dart | 757 ++++++++++-------- 1 file changed, 406 insertions(+), 351 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart index 1f55f8e2..e38295b3 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart @@ -9,7 +9,7 @@ import 'dart:ffi' as ffi; @ffi.Native< ffi.Pointer Function(LoadFilamentResourceFromOwner, - FreeFilamentResourceFromOwner, ffi.Pointer)>() + FreeFilamentResourceFromOwner, ffi.Pointer)>(isLeaf: true) external ffi.Pointer make_resource_loader( LoadFilamentResourceFromOwner loadFn, FreeFilamentResourceFromOwner freeFn, @@ -18,7 +18,7 @@ external ffi.Pointer make_resource_loader( @ffi.Native< ffi.Pointer Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer, ffi.Pointer)>() + ffi.Pointer, ffi.Pointer)>(isLeaf: true) external ffi.Pointer create_filament_viewer( ffi.Pointer context, ffi.Pointer loader, @@ -26,19 +26,19 @@ external ffi.Pointer create_filament_viewer( ffi.Pointer uberArchivePath, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void destroy_filament_viewer( ffi.Pointer viewer, ); -@ffi.Native Function(ffi.Pointer)>() +@ffi.Native Function(ffi.Pointer)>(isLeaf: true) external ffi.Pointer get_scene_manager( ffi.Pointer viewer, ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32)>() + ffi.Void Function(ffi.Pointer, ffi.IntPtr, ffi.Uint32, + ffi.Uint32)>(isLeaf: true) external void create_render_target( ffi.Pointer viewer, int texture, @@ -46,13 +46,14 @@ external void create_render_target( int height, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void clear_background_image( ffi.Pointer viewer, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Bool)>() + ffi.Void Function( + ffi.Pointer, ffi.Pointer, ffi.Bool)>(isLeaf: true) external void set_background_image( ffi.Pointer viewer, ffi.Pointer path, @@ -60,7 +61,8 @@ external void set_background_image( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>() + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) external void set_background_image_position( ffi.Pointer viewer, double x, @@ -69,8 +71,8 @@ external void set_background_image_position( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, + ffi.Float)>(isLeaf: true) external void set_background_color( ffi.Pointer viewer, double r, @@ -79,19 +81,20 @@ external void set_background_color( double a, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, ffi.Int)>(isLeaf: true) external void set_tone_mapping( ffi.Pointer viewer, int toneMapping, ); -@ffi.Native, ffi.Float)>() +@ffi.Native, ffi.Float)>(isLeaf: true) external void set_bloom( ffi.Pointer viewer, double strength, ); -@ffi.Native, ffi.Pointer)>() +@ffi.Native, ffi.Pointer)>( + isLeaf: true) external void load_skybox( ffi.Pointer viewer, ffi.Pointer skyboxPath, @@ -99,7 +102,7 @@ external void load_skybox( @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Pointer, ffi.Float)>() + ffi.Pointer, ffi.Pointer, ffi.Float)>(isLeaf: true) external void load_ibl( ffi.Pointer viewer, ffi.Pointer iblPath, @@ -107,8 +110,8 @@ external void load_ibl( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, + ffi.Float)>(isLeaf: true) external void create_ibl( ffi.Pointer viewer, double r, @@ -117,18 +120,19 @@ external void create_ibl( double intensity, ); -@ffi.Native, ffi.Pointer)>() +@ffi.Native, ffi.Pointer)>( + isLeaf: true) external void rotate_ibl( ffi.Pointer viewer, ffi.Pointer rotationMatrix, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void remove_skybox( ffi.Pointer viewer, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void remove_ibl( ffi.Pointer viewer, ); @@ -151,7 +155,7 @@ external void remove_ibl( ffi.Float, ffi.Float, ffi.Float, - ffi.Bool)>() + ffi.Bool)>(isLeaf: true) external int add_light( ffi.Pointer viewer, int type, @@ -172,20 +176,20 @@ external int add_light( bool shadows, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external void remove_light( ffi.Pointer viewer, int entityId, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void clear_lights( ffi.Pointer viewer, ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>() + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Float)>(isLeaf: true) external void set_light_position( ffi.Pointer viewer, int light, @@ -195,8 +199,8 @@ external void set_light_position( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>() + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Float)>(isLeaf: true) external void set_light_direction( ffi.Pointer viewer, int light, @@ -206,8 +210,8 @@ external void set_light_direction( ); @ffi.Native< - EntityId Function( - ffi.Pointer, ffi.Pointer, ffi.Int, ffi.Bool)>() + EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Int, + ffi.Bool)>(isLeaf: true) external int load_glb( ffi.Pointer sceneManager, ffi.Pointer assetPath, @@ -216,8 +220,8 @@ external int load_glb( ); @ffi.Native< - EntityId Function( - ffi.Pointer, ffi.Pointer, ffi.Size, ffi.Bool)>() + EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Size, + ffi.Bool)>(isLeaf: true) external int load_glb_from_buffer( ffi.Pointer sceneManager, ffi.Pointer data, @@ -227,7 +231,7 @@ external int load_glb_from_buffer( @ffi.Native< EntityId Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer, ffi.Bool)>() + ffi.Pointer, ffi.Bool)>(isLeaf: true) external int load_gltf( ffi.Pointer sceneManager, ffi.Pointer assetPath, @@ -235,45 +239,47 @@ external int load_gltf( bool keepData, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external int create_instance( ffi.Pointer sceneManager, int id, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external int get_instance_count( ffi.Pointer sceneManager, int entityId, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer)>() + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) external void get_instances( ffi.Pointer sceneManager, int entityId, ffi.Pointer out, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void set_main_camera( ffi.Pointer viewer, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external int get_main_camera( ffi.Pointer viewer, ); @ffi.Native< - ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer)>() + ffi.Bool Function( + ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) external bool set_camera( ffi.Pointer viewer, int entity, ffi.Pointer nodeName, ); -@ffi.Native, ffi.Bool)>() +@ffi.Native, ffi.Bool)>(isLeaf: true) external void set_view_frustum_culling( ffi.Pointer viewer, bool enabled, @@ -288,7 +294,7 @@ external void set_view_frustum_culling( ffi.NativeFunction< ffi.Void Function(ffi.Pointer buf, ffi.Size size, ffi.Pointer data)>>, - ffi.Pointer)>() + ffi.Pointer)>(isLeaf: true) external void render( ffi.Pointer viewer, int frameTimeInNanos, @@ -303,7 +309,7 @@ external void render( @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void capture( ffi.Pointer viewer, ffi.Pointer pixelBuffer, @@ -311,8 +317,8 @@ external void capture( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Pointer, ffi.Uint32, ffi.Uint32)>() + ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Uint32, + ffi.Uint32)>(isLeaf: true) external void create_swap_chain( ffi.Pointer viewer, ffi.Pointer window, @@ -320,34 +326,33 @@ external void create_swap_chain( int height, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void destroy_swap_chain( ffi.Pointer viewer, ); -@ffi.Native, ffi.Float)>() +@ffi.Native, ffi.Float)>(isLeaf: true) external void set_frame_interval( ffi.Pointer viewer, double interval, ); -@ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Uint32, ffi.Uint32, ffi.Float)>() -external void update_viewport_and_camera_projection( +@ffi.Native, ffi.Uint32, ffi.Uint32)>( + isLeaf: true) +external void update_viewport( ffi.Pointer viewer, int width, int height, - double scaleFactor, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void scroll_begin( ffi.Pointer viewer, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>() + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void scroll_update( ffi.Pointer viewer, double x, @@ -355,13 +360,14 @@ external void scroll_update( double z, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void scroll_end( ffi.Pointer viewer, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>() + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) external void grab_begin( ffi.Pointer viewer, double x, @@ -369,21 +375,22 @@ external void grab_begin( bool pan, ); -@ffi.Native, ffi.Float, ffi.Float)>() +@ffi.Native, ffi.Float, ffi.Float)>( + isLeaf: true) external void grab_update( ffi.Pointer viewer, double x, double y, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void grab_end( ffi.Pointer viewer, ); @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Pointer, ffi.Int)>() + ffi.Pointer, ffi.Int)>(isLeaf: true) external void apply_weights( ffi.Pointer sceneManager, int entity, @@ -393,8 +400,8 @@ external void apply_weights( ); @ffi.Native< - ffi.Bool Function( - ffi.Pointer, EntityId, ffi.Pointer, ffi.Int)>() + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Int)>(isLeaf: true) external bool set_morph_target_weights( ffi.Pointer sceneManager, int entity, @@ -404,7 +411,7 @@ external bool set_morph_target_weights( @ffi.Native< ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Pointer, ffi.Int, ffi.Int, ffi.Float)>() + ffi.Pointer, ffi.Int, ffi.Int, ffi.Float)>(isLeaf: true) external bool set_morph_animation( ffi.Pointer sceneManager, int entity, @@ -415,13 +422,13 @@ external bool set_morph_animation( double frameLengthInMs, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external void clear_morph_animation( ffi.Pointer sceneManager, int entity, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external void reset_to_rest_pose( ffi.Pointer sceneManager, int asset, @@ -438,7 +445,7 @@ external void reset_to_rest_pose( ffi.Float, ffi.Float, ffi.Float, - ffi.Float)>() + ffi.Float)>(isLeaf: true) external void add_bone_animation( ffi.Pointer sceneManager, int entity, @@ -454,7 +461,7 @@ external void add_bone_animation( @ffi.Native< ffi.Void Function( - ffi.Pointer, EntityId, ffi.Pointer)>() + ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) external void get_local_transform( ffi.Pointer sceneManager, int entityId, @@ -463,7 +470,7 @@ external void get_local_transform( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, - ffi.Pointer, ffi.Int)>() + ffi.Pointer, ffi.Int)>(isLeaf: true) external void get_rest_local_transforms( ffi.Pointer sceneManager, int entityId, @@ -474,7 +481,7 @@ external void get_rest_local_transforms( @ffi.Native< ffi.Void Function( - ffi.Pointer, EntityId, ffi.Pointer)>() + ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) external void get_world_transform( ffi.Pointer sceneManager, int entityId, @@ -483,7 +490,7 @@ external void get_world_transform( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, - ffi.Pointer)>() + ffi.Pointer)>(isLeaf: true) external void get_inverse_bind_matrix( ffi.Pointer sceneManager, int entityId, @@ -494,7 +501,7 @@ external void get_inverse_bind_matrix( @ffi.Native< ffi.Bool Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, - ffi.Pointer)>() + ffi.Pointer)>(isLeaf: true) external bool set_bone_transform( ffi.Pointer sceneManager, int entity, @@ -505,7 +512,7 @@ external bool set_bone_transform( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Bool, - ffi.Bool, ffi.Bool, ffi.Float, ffi.Float)>() + ffi.Bool, ffi.Bool, ffi.Float, ffi.Float)>(isLeaf: true) external void play_animation( ffi.Pointer sceneManager, int entity, @@ -518,7 +525,8 @@ external void play_animation( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>() + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Int, ffi.Int)>(isLeaf: true) external void set_animation_frame( ffi.Pointer sceneManager, int entity, @@ -526,22 +534,23 @@ external void set_animation_frame( int animationFrame, ); -@ffi.Native, EntityId, ffi.Int)>() +@ffi.Native, EntityId, ffi.Int)>( + isLeaf: true) external void stop_animation( ffi.Pointer sceneManager, int entity, int index, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external int get_animation_count( ffi.Pointer sceneManager, int asset, ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Pointer, ffi.Int)>() + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Int)>(isLeaf: true) external void get_animation_name( ffi.Pointer sceneManager, int entity, @@ -549,14 +558,16 @@ external void get_animation_name( int index, ); -@ffi.Native, EntityId, ffi.Int)>() +@ffi.Native, EntityId, ffi.Int)>( + isLeaf: true) external double get_animation_duration( ffi.Pointer sceneManager, int entity, int index, ); -@ffi.Native, EntityId, ffi.Int)>() +@ffi.Native, EntityId, ffi.Int)>( + isLeaf: true) external int get_bone_count( ffi.Pointer sceneManager, int assetEntity, @@ -565,7 +576,7 @@ external int get_bone_count( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>, ffi.Int)>() + ffi.Pointer>, ffi.Int)>(isLeaf: true) external void get_bone_names( ffi.Pointer sceneManager, int assetEntity, @@ -574,7 +585,8 @@ external void get_bone_names( ); @ffi.Native< - EntityId Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>() + EntityId Function( + ffi.Pointer, EntityId, ffi.Int, ffi.Int)>(isLeaf: true) external int get_bone( ffi.Pointer sceneManager, int entityId, @@ -584,14 +596,14 @@ external int get_bone( @ffi.Native< ffi.Bool Function( - ffi.Pointer, EntityId, ffi.Pointer)>() + ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) external bool set_transform( ffi.Pointer sceneManager, int entityId, ffi.Pointer transform, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external bool update_bone_matrices( ffi.Pointer sceneManager, int entityId, @@ -599,7 +611,7 @@ external bool update_bone_matrices( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, EntityId, - ffi.Pointer, ffi.Int)>() + ffi.Pointer, ffi.Int)>(isLeaf: true) external void get_morph_target_name( ffi.Pointer sceneManager, int assetEntity, @@ -608,27 +620,28 @@ external void get_morph_target_name( int index, ); -@ffi.Native, EntityId, EntityId)>() +@ffi.Native, EntityId, EntityId)>( + isLeaf: true) external int get_morph_target_name_count( ffi.Pointer sceneManager, int assetEntity, int childEntity, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external void remove_entity( ffi.Pointer viewer, int asset, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void clear_entities( ffi.Pointer viewer, ); @ffi.Native< ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Int, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() + ffi.Int, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external bool set_material_color( ffi.Pointer sceneManager, int entity, @@ -640,7 +653,7 @@ external bool set_material_color( double a, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external void transform_to_unit_cube( ffi.Pointer sceneManager, int asset, @@ -648,7 +661,7 @@ external void transform_to_unit_cube( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, - ffi.Float, ffi.Bool)>() + ffi.Float, ffi.Bool)>(isLeaf: true) external void queue_position_update( ffi.Pointer sceneManager, int entity, @@ -660,7 +673,7 @@ external void queue_position_update( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, - ffi.Float, ffi.Float, ffi.Float)>() + ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void queue_relative_position_update_world_axis( ffi.Pointer sceneManager, int entity, @@ -672,7 +685,8 @@ external void queue_relative_position_update_world_axis( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float)>() + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Float, ffi.Float)>(isLeaf: true) external void queue_position_update_from_viewport_coords( ffi.Pointer sceneManager, int entity, @@ -682,7 +696,7 @@ external void queue_position_update_from_viewport_coords( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, - ffi.Float, ffi.Float, ffi.Float, ffi.Bool)>() + ffi.Float, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) external void queue_rotation_update( ffi.Pointer sceneManager, int entity, @@ -695,8 +709,8 @@ external void queue_rotation_update( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>() + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Float)>(isLeaf: true) external void set_position( ffi.Pointer sceneManager, int entity, @@ -707,7 +721,7 @@ external void set_position( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, - ffi.Float, ffi.Float, ffi.Float)>() + ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void set_rotation( ffi.Pointer sceneManager, int entity, @@ -718,139 +732,126 @@ external void set_rotation( double w, ); -@ffi.Native, EntityId, ffi.Float)>() +@ffi.Native, EntityId, ffi.Float)>( + isLeaf: true) external void set_scale( ffi.Pointer sceneManager, int entity, double scale, ); -@ffi.Native, EntityId)>() -external void move_camera_to_asset( - ffi.Pointer viewer, - int asset, -); - @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>() + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void set_camera_exposure( - ffi.Pointer viewer, + ffi.Pointer camera, double aperture, double shutterSpeed, double sensitivity, ); -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>() -external void set_camera_position( - ffi.Pointer viewer, - double x, - double y, - double z, -); - -@ffi.Native)>() -external void get_camera_position( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() -external void set_camera_rotation( - ffi.Pointer viewer, - double w, - double x, - double y, - double z, -); - -@ffi.Native, ffi.Pointer)>() +@ffi.Native, double4x4)>(isLeaf: true) external void set_camera_model_matrix( - ffi.Pointer viewer, - ffi.Pointer matrix, + ffi.Pointer camera, + double4x4 matrix, ); -@ffi.Native Function(ffi.Pointer)>() -external ffi.Pointer get_camera_model_matrix( +@ffi.Native Function(ffi.Pointer, EntityId)>( + isLeaf: true) +external ffi.Pointer get_camera( ffi.Pointer viewer, + int entity, ); -@ffi.Native Function(ffi.Pointer)>() -external ffi.Pointer get_camera_view_matrix( - ffi.Pointer viewer, +@ffi.Native)>(isLeaf: true) +external double get_camera_focal_length( + ffi.Pointer camera, ); -@ffi.Native Function(ffi.Pointer)>() -external ffi.Pointer get_camera_projection_matrix( - ffi.Pointer viewer, +@ffi.Native)>(isLeaf: true) +external double4x4 get_camera_model_matrix( + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external double4x4 get_camera_view_matrix( + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external double4x4 get_camera_projection_matrix( + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external double4x4 get_camera_culling_projection_matrix( + ffi.Pointer camera, +); + +@ffi.Native Function(ffi.Pointer)>( + isLeaf: true) +external ffi.Pointer get_camera_frustum( + ffi.Pointer camera, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Double, ffi.Double)>() + ffi.Void Function(ffi.Pointer, double4x4, ffi.Double, + ffi.Double)>(isLeaf: true) external void set_camera_projection_matrix( - ffi.Pointer viewer, - ffi.Pointer matrix, + ffi.Pointer camera, + double4x4 matrix, double near, double far, ); -@ffi.Native, ffi.Double, ffi.Double)>() -external void set_camera_culling( - ffi.Pointer viewer, - double near, - double far, -); - -@ffi.Native)>() -external double get_camera_culling_near( - ffi.Pointer viewer, -); - -@ffi.Native)>() -external double get_camera_culling_far( - ffi.Pointer viewer, -); - -@ffi.Native Function(ffi.Pointer)>() -external ffi.Pointer get_camera_culling_projection_matrix( - ffi.Pointer viewer, -); - -@ffi.Native Function(ffi.Pointer)>() -external ffi.Pointer get_camera_frustum( - ffi.Pointer viewer, -); - -@ffi.Native, ffi.Bool)>() -external double get_camera_fov( - ffi.Pointer viewer, - bool horizontal, -); - -@ffi.Native, ffi.Float, ffi.Bool)>() -external void set_camera_fov( - ffi.Pointer viewer, +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, + ffi.Double, ffi.Double, ffi.Bool)>(isLeaf: true) +external void set_camera_projection_from_fov( + ffi.Pointer camera, double fovInDegrees, + double aspect, + double near, + double far, bool horizontal, ); -@ffi.Native, ffi.Float)>() -external void set_camera_focal_length( - ffi.Pointer viewer, +@ffi.Native)>(isLeaf: true) +external double get_camera_near( + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external double get_camera_culling_far( + ffi.Pointer camera, +); + +@ffi.Native, ffi.Bool)>(isLeaf: true) +external double get_camera_fov( + ffi.Pointer camera, + bool horizontal, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, + ffi.Double, ffi.Double)>(isLeaf: true) +external void set_camera_lens_projection( + ffi.Pointer camera, + double near, + double far, + double aspect, double focalLength, ); -@ffi.Native, ffi.Float)>() +@ffi.Native, ffi.Float)>(isLeaf: true) external void set_camera_focus_distance( - ffi.Pointer viewer, + ffi.Pointer camera, double focusDistance, ); @ffi.Native< ffi.Void Function(ffi.Pointer, _ManipulatorMode, ffi.Double, - ffi.Double, ffi.Double)>() + ffi.Double, ffi.Double)>(isLeaf: true) external void set_camera_manipulator_options( ffi.Pointer viewer, int mode, @@ -860,7 +861,8 @@ external void set_camera_manipulator_options( ); @ffi.Native< - ffi.Int Function(ffi.Pointer, EntityId, ffi.Pointer)>() + ffi.Int Function( + ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) external int hide_mesh( ffi.Pointer sceneManager, int entity, @@ -868,32 +870,34 @@ external int hide_mesh( ); @ffi.Native< - ffi.Int Function(ffi.Pointer, EntityId, ffi.Pointer)>() + ffi.Int Function( + ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) external int reveal_mesh( ffi.Pointer sceneManager, int entity, ffi.Pointer meshName, ); -@ffi.Native, ffi.Bool)>() +@ffi.Native, ffi.Bool)>(isLeaf: true) external void set_post_processing( ffi.Pointer viewer, bool enabled, ); -@ffi.Native, ffi.Bool)>() +@ffi.Native, ffi.Bool)>(isLeaf: true) external void set_shadows_enabled( ffi.Pointer viewer, bool enabled, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, ffi.Int)>(isLeaf: true) external void set_shadow_type( ffi.Pointer viewer, int shadowType, ); -@ffi.Native, ffi.Float, ffi.Float)>() +@ffi.Native, ffi.Float, ffi.Float)>( + isLeaf: true) external void set_soft_shadow_options( ffi.Pointer viewer, double penumbraScale, @@ -901,7 +905,8 @@ external void set_soft_shadow_options( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Bool, ffi.Bool, ffi.Bool)>() + ffi.Void Function( + ffi.Pointer, ffi.Bool, ffi.Bool, ffi.Bool)>(isLeaf: true) external void set_antialiasing( ffi.Pointer viewer, bool msaa, @@ -916,7 +921,8 @@ external void set_antialiasing( ffi.Int, ffi.Pointer< ffi.NativeFunction< - ffi.Void Function(EntityId entityId, ffi.Int x, ffi.Int y)>>)>() + ffi.Void Function( + EntityId entityId, ffi.Int x, ffi.Int y)>>)>(isLeaf: true) external void filament_pick( ffi.Pointer viewer, int x, @@ -927,21 +933,24 @@ external void filament_pick( callback, ); -@ffi.Native Function(ffi.Pointer, EntityId)>() +@ffi.Native Function(ffi.Pointer, EntityId)>( + isLeaf: true) external ffi.Pointer get_name_for_entity( ffi.Pointer sceneManager, int entityId, ); @ffi.Native< - EntityId Function(ffi.Pointer, EntityId, ffi.Pointer)>() + EntityId Function( + ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) external int find_child_entity_by_name( ffi.Pointer sceneManager, int parent, ffi.Pointer name, ); -@ffi.Native, EntityId, ffi.Bool)>() +@ffi.Native, EntityId, ffi.Bool)>( + isLeaf: true) external int get_entity_count( ffi.Pointer sceneManager, int target, @@ -949,8 +958,8 @@ external int get_entity_count( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Bool, ffi.Pointer)>() + ffi.Void Function(ffi.Pointer, EntityId, ffi.Bool, + ffi.Pointer)>(isLeaf: true) external void get_entities( ffi.Pointer sceneManager, int target, @@ -960,7 +969,7 @@ external void get_entities( @ffi.Native< ffi.Pointer Function( - ffi.Pointer, EntityId, ffi.Int, ffi.Bool)>() + ffi.Pointer, EntityId, ffi.Int, ffi.Bool)>(isLeaf: true) external ffi.Pointer get_entity_name_at( ffi.Pointer sceneManager, int target, @@ -968,22 +977,23 @@ external ffi.Pointer get_entity_name_at( bool renderableOnly, ); -@ffi.Native, ffi.Bool)>() +@ffi.Native, ffi.Bool)>(isLeaf: true) external void set_recording( ffi.Pointer viewer, bool recording, ); -@ffi.Native, ffi.Pointer)>() +@ffi.Native, ffi.Pointer)>( + isLeaf: true) external void set_recording_output_directory( ffi.Pointer viewer, ffi.Pointer outputDirectory, ); -@ffi.Native() +@ffi.Native(isLeaf: true) external void ios_dummy(); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void thermion_flutter_free( ffi.Pointer ptr, ); @@ -995,7 +1005,7 @@ external void thermion_flutter_free( ffi.Pointer< ffi.NativeFunction< ffi.Void Function(EntityId entityId1, EntityId entityId2)>>, - ffi.Bool)>() + ffi.Bool)>(isLeaf: true) external void add_collision_component( ffi.Pointer sceneManager, int entityId, @@ -1006,27 +1016,33 @@ external void add_collision_component( bool affectsCollidingTransform, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external void remove_collision_component( ffi.Pointer sceneManager, int entityId, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external bool add_animation_component( ffi.Pointer sceneManager, int entityId, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external void remove_animation_component( ffi.Pointer sceneManager, int entityId, ); @ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Int, - ffi.Pointer, ffi.Int, ffi.Int, ffi.Pointer)>() + EntityId Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer)>(isLeaf: true) external int create_geometry( ffi.Pointer sceneManager, ffi.Pointer vertices, @@ -1047,7 +1063,7 @@ external int create_geometry( ffi.Pointer, ffi.Int, ffi.Int, - ffi.Pointer)>() + ffi.Pointer)>(isLeaf: true) external int create_geometry_with_normals( ffi.Pointer sceneManager, ffi.Pointer vertices, @@ -1060,20 +1076,21 @@ external int create_geometry_with_normals( ffi.Pointer materialPath, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external int get_parent( ffi.Pointer sceneManager, int child, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external int get_ancestor( ffi.Pointer sceneManager, int child, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, EntityId, ffi.Bool)>() + ffi.Void Function( + ffi.Pointer, EntityId, EntityId, ffi.Bool)>(isLeaf: true) external void set_parent( ffi.Pointer sceneManager, int child, @@ -1081,26 +1098,28 @@ external void set_parent( bool preserveScaling, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external void test_collisions( ffi.Pointer sceneManager, int entity, ); -@ffi.Native, EntityId, ffi.Int)>() +@ffi.Native, EntityId, ffi.Int)>( + isLeaf: true) external void set_priority( ffi.Pointer sceneManager, int entityId, int priority, ); -@ffi.Native, ffi.Pointer)>() +@ffi.Native, ffi.Pointer)>( + isLeaf: true) external void get_gizmo( ffi.Pointer sceneManager, ffi.Pointer out, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external Aabb2 get_bounding_box( ffi.Pointer sceneManager, int entity, @@ -1113,7 +1132,7 @@ external Aabb2 get_bounding_box( ffi.Pointer, ffi.Pointer, ffi.Pointer, - ffi.Pointer)>() + ffi.Pointer)>(isLeaf: true) external void get_bounding_box_to_out( ffi.Pointer sceneManager, int entity, @@ -1123,7 +1142,8 @@ external void get_bounding_box_to_out( ffi.Pointer maxY, ); -@ffi.Native, ffi.Int, ffi.Bool)>() +@ffi.Native, ffi.Int, ffi.Bool)>( + isLeaf: true) external void set_layer_enabled( ffi.Pointer sceneManager, int layer, @@ -1137,7 +1157,8 @@ external void set_layer_enabled( ffi.Int, ffi.Pointer< ffi.NativeFunction< - ffi.Void Function(EntityId entityId, ffi.Int x, ffi.Int y)>>)>() + ffi.Void Function( + EntityId entityId, ffi.Int x, ffi.Int y)>>)>(isLeaf: true) external void pick_gizmo( ffi.Pointer sceneManager, int x, @@ -1148,15 +1169,15 @@ external void pick_gizmo( callback, ); -@ffi.Native, ffi.Bool)>() +@ffi.Native, ffi.Bool)>(isLeaf: true) external void set_gizmo_visibility( ffi.Pointer sceneManager, bool visible, ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>() + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Float)>(isLeaf: true) external void set_stencil_highlight( ffi.Pointer sceneManager, int entity, @@ -1165,7 +1186,7 @@ external void set_stencil_highlight( double b, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external void remove_stencil_highlight( ffi.Pointer sceneManager, int entity, @@ -1183,7 +1204,8 @@ external void remove_stencil_highlight( ffi.Pointer, ffi.Pointer< ffi.NativeFunction< - ffi.Void Function(ffi.Pointer viewer)>>)>() + ffi.Void Function( + ffi.Pointer viewer)>>)>(isLeaf: true) external void create_filament_viewer_ffi( ffi.Pointer context, ffi.Pointer platform, @@ -1200,8 +1222,12 @@ external void create_filament_viewer_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Uint32, - ffi.Uint32, ffi.Pointer>)>() + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Uint32, + ffi.Uint32, + ffi.Pointer>)>(isLeaf: true) external void create_swap_chain_ffi( ffi.Pointer viewer, ffi.Pointer surface, @@ -1212,7 +1238,7 @@ external void create_swap_chain_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void destroy_swap_chain_ffi( ffi.Pointer viewer, ffi.Pointer> onComplete, @@ -1220,7 +1246,7 @@ external void destroy_swap_chain_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void create_render_target_ffi( ffi.Pointer viewer, int nativeTextureId, @@ -1229,59 +1255,49 @@ external void create_render_target_ffi( ffi.Pointer> onComplete, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void destroy_filament_viewer_ffi( ffi.Pointer viewer, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void render_ffi( ffi.Pointer viewer, ); @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void capture_ffi( ffi.Pointer viewer, ffi.Pointer out, ffi.Pointer> onComplete, ); -@ffi.Native() +@ffi.Native( + isLeaf: true) external FilamentRenderCallback make_render_callback_fn_pointer( FilamentRenderCallback arg0, ); @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Bool, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void set_rendering_ffi( ffi.Pointer viewer, bool rendering, ffi.Pointer> onComplete, ); -@ffi.Native, ffi.Float)>() +@ffi.Native, ffi.Float)>(isLeaf: true) external void set_frame_interval_ffi( ffi.Pointer viewer, double frameInterval, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Uint32, ffi.Uint32, ffi.Float, - ffi.Pointer>)>() -external void update_viewport_and_camera_projection_ffi( - ffi.Pointer viewer, - int width, - int height, - double scaleFactor, - ffi.Pointer> onComplete, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, + ffi.Float)>(isLeaf: true) external void set_background_color_ffi( ffi.Pointer viewer, double r, @@ -1290,14 +1306,14 @@ external void set_background_color_ffi( double a, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void clear_background_image_ffi( ffi.Pointer viewer, ); @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Bool, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void set_background_image_ffi( ffi.Pointer viewer, ffi.Pointer path, @@ -1306,7 +1322,8 @@ external void set_background_image_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>() + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) external void set_background_image_position_ffi( ffi.Pointer viewer, double x, @@ -1314,13 +1331,13 @@ external void set_background_image_position_ffi( bool clamp, ); -@ffi.Native, ffi.Int)>() +@ffi.Native, ffi.Int)>(isLeaf: true) external void set_tone_mapping_ffi( ffi.Pointer viewer, int toneMapping, ); -@ffi.Native, ffi.Float)>() +@ffi.Native, ffi.Float)>(isLeaf: true) external void set_bloom_ffi( ffi.Pointer viewer, double strength, @@ -1328,7 +1345,7 @@ external void set_bloom_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void load_skybox_ffi( ffi.Pointer viewer, ffi.Pointer skyboxPath, @@ -1337,43 +1354,44 @@ external void load_skybox_ffi( @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Pointer, ffi.Float)>() + ffi.Pointer, ffi.Pointer, ffi.Float)>(isLeaf: true) external void load_ibl_ffi( ffi.Pointer viewer, ffi.Pointer iblPath, double intensity, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void remove_skybox_ffi( ffi.Pointer viewer, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void remove_ibl_ffi( ffi.Pointer viewer, ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Uint8, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Bool, - ffi.Pointer>)>() + ffi.Void Function( + ffi.Pointer, + ffi.Uint8, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Bool, + ffi.Pointer>)>( + isLeaf: true) external void add_light_ffi( ffi.Pointer viewer, int type, @@ -1395,24 +1413,25 @@ external void add_light_ffi( ffi.Pointer> callback, ); -@ffi.Native, EntityId)>() +@ffi.Native, EntityId)>(isLeaf: true) external void remove_light_ffi( ffi.Pointer viewer, int entityId, ); -@ffi.Native)>() +@ffi.Native)>(isLeaf: true) external void clear_lights_ffi( ffi.Pointer viewer, ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Bool, - ffi.Pointer>)>() + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Bool, + ffi.Pointer>)>( + isLeaf: true) external void load_glb_ffi( ffi.Pointer sceneManager, ffi.Pointer assetPath, @@ -1422,13 +1441,14 @@ external void load_glb_ffi( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Size, - ffi.Int, - ffi.Bool, - ffi.Pointer>)>(isLeaf: true) + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Size, + ffi.Int, + ffi.Bool, + ffi.Pointer>)>( + isLeaf: true) external void load_glb_from_buffer_ffi( ffi.Pointer sceneManager, ffi.Pointer data, @@ -1439,12 +1459,13 @@ external void load_glb_from_buffer_ffi( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Bool, - ffi.Pointer>)>() + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.Pointer>)>( + isLeaf: true) external void load_gltf_ffi( ffi.Pointer sceneManager, ffi.Pointer assetPath, @@ -1454,8 +1475,9 @@ external void load_gltf_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>() + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer>)>( + isLeaf: true) external void create_instance_ffi( ffi.Pointer sceneManager, int entityId, @@ -1464,7 +1486,7 @@ external void create_instance_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void remove_entity_ffi( ffi.Pointer viewer, int asset, @@ -1473,15 +1495,19 @@ external void remove_entity_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void clear_entities_ffi( ffi.Pointer viewer, ffi.Pointer> callback, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Pointer>)>() + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer>)>( + isLeaf: true) external void set_camera_ffi( ffi.Pointer viewer, int asset, @@ -1491,7 +1517,7 @@ external void set_camera_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Pointer, ffi.Int)>() + ffi.Pointer, ffi.Int)>(isLeaf: true) external void apply_weights_ffi( ffi.Pointer sceneManager, int asset, @@ -1501,7 +1527,8 @@ external void apply_weights_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>() + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Int, ffi.Int)>(isLeaf: true) external void set_animation_frame_ffi( ffi.Pointer sceneManager, int asset, @@ -1509,7 +1536,8 @@ external void set_animation_frame_ffi( int animationFrame, ); -@ffi.Native, EntityId, ffi.Int)>() +@ffi.Native, EntityId, ffi.Int)>( + isLeaf: true) external void stop_animation_ffi( ffi.Pointer sceneManager, int asset, @@ -1517,8 +1545,9 @@ external void stop_animation_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>() + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer>)>( + isLeaf: true) external void get_animation_count_ffi( ffi.Pointer sceneManager, int asset, @@ -1526,8 +1555,12 @@ external void get_animation_count_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Int, ffi.Pointer>)>() + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Int, + ffi.Pointer>)>(isLeaf: true) external void get_animation_name_ffi( ffi.Pointer sceneManager, int asset, @@ -1543,7 +1576,7 @@ external void get_animation_name_ffi( EntityId, ffi.Pointer, ffi.Int, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void get_morph_target_name_ffi( ffi.Pointer sceneManager, int assetEntity, @@ -1554,8 +1587,9 @@ external void get_morph_target_name_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, EntityId, - ffi.Pointer>)>() + ffi.Void Function(ffi.Pointer, EntityId, EntityId, + ffi.Pointer>)>( + isLeaf: true) external void get_morph_target_name_count_ffi( ffi.Pointer sceneManager, int asset, @@ -1564,12 +1598,13 @@ external void get_morph_target_name_count_ffi( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Pointer, - ffi.Int, - ffi.Pointer>)>() + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Int, + ffi.Pointer>)>( + isLeaf: true) external void set_morph_target_weights_ffi( ffi.Pointer sceneManager, int asset, @@ -1579,8 +1614,9 @@ external void set_morph_target_weights_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>() + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer>)>( + isLeaf: true) external void update_bone_matrices_ffi( ffi.Pointer sceneManager, int asset, @@ -1588,13 +1624,14 @@ external void update_bone_matrices_ffi( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Int, - ffi.Int, - ffi.Pointer, - ffi.Pointer>)>() + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Int, + ffi.Int, + ffi.Pointer, + ffi.Pointer>)>( + isLeaf: true) external void set_bone_transform_ffi( ffi.Pointer sceneManager, int asset, @@ -1604,7 +1641,7 @@ external void set_bone_transform_ffi( ffi.Pointer> callback, ); -@ffi.Native, ffi.Bool)>() +@ffi.Native, ffi.Bool)>(isLeaf: true) external void set_post_processing_ffi( ffi.Pointer viewer, bool enabled, @@ -1612,7 +1649,7 @@ external void set_post_processing_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>() + ffi.Pointer>)>(isLeaf: true) external void reset_to_rest_pose_ffi( ffi.Pointer sceneManager, int entityId, @@ -1620,16 +1657,17 @@ external void reset_to_rest_pose_ffi( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Pointer, - ffi.Bool, - ffi.Pointer>)>() + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer, + ffi.Bool, + ffi.Pointer>)>( + isLeaf: true) external void create_geometry_ffi( ffi.Pointer sceneManager, ffi.Pointer vertices, @@ -1643,18 +1681,19 @@ external void create_geometry_ffi( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Pointer, - ffi.Bool, - ffi.Pointer>)>() + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer, + ffi.Bool, + ffi.Pointer>)>( + isLeaf: true) external void create_geometry_with_normals_ffi( ffi.Pointer sceneManager, ffi.Pointer vertices, @@ -1732,6 +1771,22 @@ final class Aabb2 extends ffi.Struct { external double maxY; } +final class CameraPtr extends ffi.Opaque {} + +final class double4x4 extends ffi.Struct { + @ffi.Array.multi([4]) + external ffi.Array col1; + + @ffi.Array.multi([4]) + external ffi.Array col2; + + @ffi.Array.multi([4]) + external ffi.Array col3; + + @ffi.Array.multi([4]) + external ffi.Array col4; +} + /// This header replicates most of the methods in ThermionDartApi.h. /// It represents the interface for: /// - invoking those methods that must be called on the main Filament engine thread From 98d61fa1b3426a5a385e527dc54d49230a2ea99c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 10:36:24 +0800 Subject: [PATCH 139/232] fix setCameraModelMatrix4 --- .../lib/thermion_dart/thermion_viewer_ffi.dart | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index 2ce5544a..eaf2fb09 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -1291,8 +1291,9 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setCameraRotation(Quaternion quaternion) async { var modelMatrix = await getCameraModelMatrix(); - modelMatrix.setRotation(quaternion.asRotationMatrix()); - await setCameraModelMatrix(modelMatrix.storage); + var translation = modelMatrix.getTranslation(); + modelMatrix = Matrix4.compose(translation, quaternion, Vector3.all(1.0)); + await setCameraModelMatrix4(modelMatrix); } /// @@ -1311,6 +1312,7 @@ class ThermionViewerFFI extends ThermionViewer { Future setCameraModelMatrix4(Matrix4 modelMatrix) async { var mainCamera = get_camera(_viewer!, await getMainCamera()); final out = allocator(1); + matrix4ToDouble4x4(modelMatrix, out.ref); set_camera_model_matrix(mainCamera, out.ref); allocator.free(out); } @@ -1815,8 +1817,6 @@ class ThermionViewerFFI extends ThermionViewer { } } - print("ALLOCATION DONE"); - var entity = await withIntCallback((callback) => create_geometry_with_normals_ffi( _sceneManager!, @@ -1943,6 +1943,4 @@ class ThermionViewerFFI extends ThermionViewer { Future removeStencilHighlight(ThermionEntity entity) async { remove_stencil_highlight(_sceneManager!, entity); } - - } From 1be8a5e8624675daa336881b5056077a512d1252 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 11:08:49 +0800 Subject: [PATCH 140/232] adjust gizmo size --- thermion_dart/native/src/Gizmo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/thermion_dart/native/src/Gizmo.cpp b/thermion_dart/native/src/Gizmo.cpp index 75116d81..60067498 100644 --- a/thermion_dart/native/src/Gizmo.cpp +++ b/thermion_dart/native/src/Gizmo.cpp @@ -89,8 +89,8 @@ Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) // Line and arrow vertices float lineLength = 0.6f; - float lineWidth = 0.005f; - float arrowLength = 0.05f; + float lineWidth = 0.004f; + float arrowLength = 0.06f; float arrowWidth = 0.02f; float *vertices = new float[13 * 3]{ // Line vertices (8 vertices) From 2ab30a7933cbb30449ce62641affbb9e04ba9a64 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 11:09:09 +0800 Subject: [PATCH 141/232] remove double sided from HighlightOverlay material --- thermion_dart/native/src/HighlightOverlay.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/thermion_dart/native/src/HighlightOverlay.cpp b/thermion_dart/native/src/HighlightOverlay.cpp index 12589b8e..0b0f0f0d 100644 --- a/thermion_dart/native/src/HighlightOverlay.cpp +++ b/thermion_dart/native/src/HighlightOverlay.cpp @@ -27,7 +27,6 @@ namespace thermion_filament auto materialProvider = sceneManager->unlitMaterialProvider(); _highlightMaterialInstance = materialProvider->createMaterialInstance(&dummyKey, &dummyUvMap); - _highlightMaterialInstance->setDoubleSided(false); _highlightMaterialInstance->setStencilOpStencilFail(filament::backend::StencilOperation::KEEP); _highlightMaterialInstance->setStencilOpDepthFail(filament::backend::StencilOperation::KEEP); _highlightMaterialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::REPLACE); From 822b8e14c151649014cd18b94cc1b7579938e31b Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 13:30:00 +0800 Subject: [PATCH 142/232] add delegate-based implementations for gesture handlers --- ...nfigurable_pan_rotate_gesture_handler.dart | 155 ------------- .../picking_camera_gesture_handler.dart | 9 +- .../gestures/thermion_gesture_handler.dart | 206 ++---------------- .../gestures/thermion_listener_widget.dart | 105 +++++++-- .../v2/default_pan_camera_delegate.dart | 18 ++ .../v2/default_velocity_delegate.dart | 46 ++++ .../v2/default_zoom_camera_delegate.dart | 38 ++++ .../gestures/v2/delegate_gesture_handler.dart | 127 +++++++++++ .../widgets/camera/gestures/v2/delegates.dart | 29 +++ .../fixed_orbit_camera_rotation_delegate.dart | 45 ++++ ...ermion_gesture_detector_mobile_widget.dart | 29 ++- 11 files changed, 433 insertions(+), 374 deletions(-) delete mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/configurable_pan_rotate_gesture_handler.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_velocity_delegate.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/configurable_pan_rotate_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/configurable_pan_rotate_gesture_handler.dart deleted file mode 100644 index c0aa1afa..00000000 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/configurable_pan_rotate_gesture_handler.dart +++ /dev/null @@ -1,155 +0,0 @@ -import 'dart:async'; -import 'package:flutter/gestures.dart'; -import 'package:logging/logging.dart'; -import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; -import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; - -class ConfigurablePanRotateGestureHandler implements ThermionGestureHandler { - - final ThermionViewer viewer; - final Logger _logger = Logger("ConfigurablePanRotateGestureHandler"); - - ConfigurablePanRotateGestureHandler({ - required this.viewer, - }); - - @override - Future onPointerHover(Offset localPosition) async { - // noop - } - - // @override - // Future onPointerScroll(Offset localPosition, double scrollDelta) async { - // await _zoom(localPosition, scrollDelta); - // } - - // @override - // Future onPointerDown(Offset localPosition, int buttons) async { - // if (buttons == kMiddleMouseButton) { - // await viewer.rotateStart(localPosition.dx, localPosition.dy); - // } else if (buttons == kPrimaryMouseButton) { - // await viewer.panStart(localPosition.dx, localPosition.dy); - // } - // } - - // @override - // Future onPointerMove( - // Offset localPosition, Offset delta, int buttons) async { - // switch (_currentState) { - // case ThermionGestureState.NULL: - // break; - // case ThermionGestureState.ENTITY_HIGHLIGHTED: - // await _handleEntityHighlightedMove(localPosition); - // break; - // case ThermionGestureState.GIZMO_ATTACHED: - // break; - // case ThermionGestureState.ROTATING: - // if (enableCamera) { - // await viewer.rotateUpdate(localPosition.dx, localPosition.dy); - // } - // break; - // case ThermionGestureState.PANNING: - // if (enableCamera) { - // await viewer.panUpdate(localPosition.dx, localPosition.dy); - // } - // break; - // } - // } - - // @override - // Future onPointerUp(int buttons) async { - // switch (_currentState) { - // case ThermionGestureState.ROTATING: - // await viewer.rotateEnd(); - // _currentState = ThermionGestureState.NULL; - // break; - // case ThermionGestureState.PANNING: - // await viewer.panEnd(); - // _currentState = ThermionGestureState.NULL; - // break; - // default: - // break; - // } - // } - - // Future _handleEntityHighlightedMove(Offset localPosition) async { - // if (_highlightedEntity != null) { - // await viewer.queuePositionUpdateFromViewportCoords( - // _highlightedEntity!, - // localPosition.dx, - // localPosition.dy, - // ); - // } - // } - - // Future _zoom(Offset localPosition, double scrollDelta) async { - // _scrollTimer?.cancel(); - // await viewer.zoomBegin(); - // await viewer.zoomUpdate( - // localPosition.dx, localPosition.dy, scrollDelta > 0 ? 1 : -1); - - // _scrollTimer = Timer(const Duration(milliseconds: 100), () async { - // await viewer.zoomEnd(); - // }); - // } - - @override - void dispose() { - } - - @override - Future get initialized => viewer.initialized; - - @override - GestureAction getActionForType(GestureType type) { - // TODO: implement getActionForType - throw UnimplementedError(); - } - - @override - Future onScaleEnd() { - // TODO: implement onScaleEnd - throw UnimplementedError(); - } - - @override - Future onScaleStart() { - // TODO: implement onScaleStart - throw UnimplementedError(); - } - - @override - Future onScaleUpdate() { - // TODO: implement onScaleUpdate - throw UnimplementedError(); - } - - @override - void setActionForType(GestureType type, GestureAction action) { - // TODO: implement setActionForType - } - - @override - Future onPointerDown(Offset localPosition, int buttons) { - // TODO: implement onPointerDown - throw UnimplementedError(); - } - - @override - Future onPointerMove(Offset localPosition, Offset delta, int buttons) { - // TODO: implement onPointerMove - throw UnimplementedError(); - } - - @override - Future onPointerScroll(Offset localPosition, double scrollDelta) { - // TODO: implement onPointerScroll - throw UnimplementedError(); - } - - @override - Future onPointerUp(int buttons) { - // TODO: implement onPointerUp - throw UnimplementedError(); - } -} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart index bd7488f1..8800348b 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart @@ -10,7 +10,6 @@ import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gestu // Renamed implementation class PickingCameraGestureHandler implements ThermionGestureHandler { - final ThermionViewer viewer; final bool enableCamera; final bool enablePicking; @@ -71,6 +70,7 @@ class PickingCameraGestureHandler implements ThermionGestureHandler { _highlightedEntity = targetEntity; if (_highlightedEntity != null) { await viewer.setStencilHighlight(_highlightedEntity!); + _gizmo?.attach(_highlightedEntity!); } } } @@ -92,10 +92,11 @@ class PickingCameraGestureHandler implements ThermionGestureHandler { @override Future onPointerScroll(Offset localPosition, double scrollDelta) async { - if(!enableCamera) { + if (!enableCamera) { return; } - if (_currentState == ThermionGestureState.NULL || _currentState == ThermionGestureState.ZOOMING) { + if (_currentState == ThermionGestureState.NULL || + _currentState == ThermionGestureState.ZOOMING) { await _zoom(localPosition, scrollDelta); } } @@ -127,7 +128,7 @@ class PickingCameraGestureHandler implements ThermionGestureHandler { await _handleEntityHighlightedMove(localPosition); return; } - + switch (_currentState) { case ThermionGestureState.NULL: break; diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart index 2be95fe3..29a56121 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart @@ -2,8 +2,21 @@ import 'dart:async'; import 'package:flutter/gestures.dart'; import 'package:flutter/services.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; -enum GestureType { POINTER_HOVER, POINTER_DOWN, SCALE } +enum GestureType { + POINTER1_DOWN, + POINTER1_MOVE, + POINTER1_UP, + POINTER1_HOVER, + POINTER2_DOWN, + POINTER2_MOVE, + POINTER2_UP, + POINTER2_HOVER, + SCALE1, + SCALE2, + POINTER_ZOOM, +} enum GestureAction { PAN_CAMERA, @@ -21,8 +34,6 @@ enum ThermionGestureState { } abstract class ThermionGestureHandler { - GestureAction getActionForType(GestureType type); - void setActionForType(GestureType type, GestureAction action); Future onPointerHover(Offset localPosition); Future onPointerScroll(Offset localPosition, double scrollDelta); Future onPointerDown(Offset localPosition, int buttons); @@ -33,190 +44,7 @@ abstract class ThermionGestureHandler { Future onScaleEnd(); Future get initialized; void dispose(); + + void setActionForType(GestureType gestureType, GestureAction gestureAction); + GestureAction? getActionForType(GestureType gestureType); } - -// enum ThermionGestureState { -// NULL, -// ENTITY_HIGHLIGHTED, -// GIZMO_ATTACHED, -// ROTATING, -// PANNING, -// } - -// class ThermionGestureHandler { -// final ThermionViewer viewer; -// final bool enableCamera; -// final bool enablePicking; -// final Logger _logger = Logger("ThermionGestureHandler"); - -// ThermionGestureState _currentState = ThermionGestureState.NULL; -// AbstractGizmo? _gizmo; -// Timer? _scrollTimer; -// ThermionEntity? _highlightedEntity; -// StreamSubscription? _pickResultSubscription; - -// ThermionGestureHandler({ -// required this.viewer, -// this.enableCamera = true, -// this.enablePicking = true, -// }) { -// try { -// _gizmo = viewer.gizmo; -// } catch (err) { -// _logger.warning( -// "Failed to get gizmo. If you are running on WASM, this is expected"); -// } - -// _pickResultSubscription = viewer.pickResult.listen(_onPickResult); - -// // Add keyboard listener -// RawKeyboard.instance.addListener(_handleKeyEvent); -// } - -// void _handleKeyEvent(RawKeyEvent event) { -// if (event is RawKeyDownEvent && -// event.logicalKey == LogicalKeyboardKey.escape) { -// _resetToNullState(); -// } -// } - -// void _resetToNullState() async { -// // set current state to NULL first, so that any subsequent pointer movements -// // won't attempt to translate a deleted entity -// _currentState = ThermionGestureState.NULL; -// if (_highlightedEntity != null) { -// await viewer.removeStencilHighlight(_highlightedEntity!); -// _highlightedEntity = null; -// } -// } - -// void _onPickResult(FilamentPickResult result) async { -// var targetEntity = await viewer.getAncestor(result.entity) ?? result.entity; - -// if (_highlightedEntity != targetEntity) { -// if (_highlightedEntity != null) { -// await viewer.removeStencilHighlight(_highlightedEntity!); -// } - -// _highlightedEntity = targetEntity; -// if (_highlightedEntity != null) { -// await viewer.setStencilHighlight(_highlightedEntity!); -// } - -// _currentState = _highlightedEntity != null -// ? ThermionGestureState.ENTITY_HIGHLIGHTED -// : ThermionGestureState.NULL; -// } -// } - -// Future onPointerHover(Offset localPosition) async { -// if (_currentState == ThermionGestureState.GIZMO_ATTACHED) { -// _gizmo?.checkHover(localPosition.dx, localPosition.dy); -// } - -// // Update highlighted entity position -// if (_highlightedEntity != null) { -// await viewer.queuePositionUpdateFromViewportCoords( -// _highlightedEntity!, -// localPosition.dx, -// localPosition.dy, -// ); -// } -// } - -// Future onPointerScroll(Offset localPosition, double scrollDelta) async { -// if (_currentState == ThermionGestureState.NULL && enableCamera) { -// await _zoom(localPosition, scrollDelta); -// } -// } - -// Future onPointerDown(Offset localPosition, int buttons) async { -// if (_currentState == ThermionGestureState.ENTITY_HIGHLIGHTED) { -// _resetToNullState(); -// return; -// } - -// if (enablePicking && buttons != kMiddleMouseButton) { -// viewer.pick(localPosition.dx.toInt(), localPosition.dy.toInt()); -// } - -// if (buttons == kMiddleMouseButton && enableCamera) { -// await viewer.rotateStart(localPosition.dx, localPosition.dy); -// _currentState = ThermionGestureState.ROTATING; -// } else if (buttons == kPrimaryMouseButton && enableCamera) { -// await viewer.panStart(localPosition.dx, localPosition.dy); -// _currentState = ThermionGestureState.PANNING; -// } -// } - -// Future onPointerMove( -// Offset localPosition, Offset delta, int buttons) async { -// switch (_currentState) { -// case ThermionGestureState.NULL: -// // This case should not occur now, as we set the state on pointer down -// break; -// case ThermionGestureState.ENTITY_HIGHLIGHTED: -// await _handleEntityHighlightedMove(localPosition); -// break; -// case ThermionGestureState.GIZMO_ATTACHED: -// // Do nothing -// break; -// case ThermionGestureState.ROTATING: -// if (enableCamera) { -// await viewer.rotateUpdate(localPosition.dx, localPosition.dy); -// } -// break; -// case ThermionGestureState.PANNING: -// if (enableCamera) { -// await viewer.panUpdate(localPosition.dx, localPosition.dy); -// } -// break; -// } -// } - -// Future onPointerUp(int buttons) async { -// switch (_currentState) { -// case ThermionGestureState.ROTATING: -// await viewer.rotateEnd(); -// _currentState = ThermionGestureState.NULL; -// break; -// case ThermionGestureState.PANNING: -// await viewer.panEnd(); -// _currentState = ThermionGestureState.NULL; -// break; -// default: -// // For other states, no action needed -// break; -// } -// } - -// Future _handleEntityHighlightedMove(Offset localPosition) async { -// if (_highlightedEntity != null) { -// await viewer.queuePositionUpdateFromViewportCoords( -// _highlightedEntity!, -// localPosition.dx, -// localPosition.dy, -// ); -// } -// } - -// Future _zoom(Offset localPosition, double scrollDelta) async { -// _scrollTimer?.cancel(); -// await viewer.zoomBegin(); -// await viewer.zoomUpdate( -// localPosition.dx, localPosition.dy, scrollDelta > 0 ? 1 : -1); - -// _scrollTimer = Timer(const Duration(milliseconds: 100), () async { -// await viewer.zoomEnd(); -// }); -// } - -// void dispose() { -// _pickResultSubscription?.cancel(); -// if (_highlightedEntity != null) { -// viewer.removeStencilHighlight(_highlightedEntity!); -// } -// // Remove keyboard listener -// RawKeyboard.instance.removeListener(_handleKeyEvent); -// } -// } diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart index 3295c58a..0a9b82a7 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart @@ -1,14 +1,13 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; -import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_desktop_widget.dart'; -import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart'; /// /// A widget that captures swipe/pointer events. -/// This is a dumb listener that simply forwards events to the provided [ThermionGestureHandler]. +/// This is a dumb listener; events are forwarded to a [ThermionGestureHandler]. /// class ThermionListenerWidget extends StatelessWidget { /// @@ -23,16 +22,41 @@ class ThermionListenerWidget extends StatelessWidget { /// final ThermionGestureHandler gestureHandler; - ThermionListenerWidget({ + const ThermionListenerWidget({ Key? key, required this.gestureHandler, this.child, }) : super(key: key); - bool get isDesktop => kIsWeb || - Platform.isLinux || - Platform.isWindows || - Platform.isMacOS; + bool get isDesktop => + kIsWeb || Platform.isLinux || Platform.isWindows || Platform.isMacOS; + + Widget _desktop() { + return Listener( + onPointerHover: (event) => + gestureHandler.onPointerHover(event.localPosition), + onPointerSignal: (PointerSignalEvent pointerSignal) { + if (pointerSignal is PointerScrollEvent) { + gestureHandler.onPointerScroll( + pointerSignal.localPosition, pointerSignal.scrollDelta.dy); + } + }, + onPointerPanZoomStart: (pzs) { + throw Exception("TODO - is this a pinch zoom on laptop trackpad?"); + }, + onPointerDown: (d) => + gestureHandler.onPointerDown(d.localPosition, d.buttons), + onPointerMove: (d) => + gestureHandler.onPointerMove(d.localPosition, d.delta, d.buttons), + onPointerUp: (d) => gestureHandler.onPointerUp(d.buttons), + child: child, + ); + } + + Widget _mobile() { + return _MobileListenerWidget( + gestureHandler: gestureHandler); + } @override Widget build(BuildContext context) { @@ -43,15 +67,66 @@ class ThermionListenerWidget extends StatelessWidget { return child ?? Container(); } return Stack(children: [ - if(child != null) - Positioned.fill(child:child!), + if (child != null) Positioned.fill(child: child!), if (isDesktop) - Positioned.fill(child:ThermionGestureDetectorDesktop( - gestureHandler: gestureHandler)), - if(!isDesktop) - Positioned.fill(child:ThermionGestureDetectorMobile( - gestureHandler: gestureHandler)) + Positioned.fill( + child: _desktop()), + if (!isDesktop) + Positioned.fill( + child: _mobile()) ]); }); } } + + +class _MobileListenerWidget extends StatefulWidget { + final ThermionGestureHandler gestureHandler; + + const _MobileListenerWidget( + {Key? key, required this.gestureHandler}) + : super(key: key); + + @override + State createState() => _MobileListenerWidgetState(); +} + +class _MobileListenerWidgetState + extends State<_MobileListenerWidget> { + GestureAction current = GestureAction.PAN_CAMERA; + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.translucent, + onTapDown: (details) => + widget.gestureHandler.onPointerDown(details.localPosition, 0), + onDoubleTap: () { + if (current == GestureAction.PAN_CAMERA) { + widget.gestureHandler.setActionForType( + GestureType.SCALE1, GestureAction.ROTATE_CAMERA); + current = GestureAction.ROTATE_CAMERA; + } else { + widget.gestureHandler.setActionForType( + GestureType.SCALE1, GestureAction.PAN_CAMERA); + current = GestureAction.PAN_CAMERA; + } + }, + onScaleStart: (details) async { + await widget.gestureHandler.onScaleStart(); + }, + onScaleUpdate: (details) async { + await widget.gestureHandler.onScaleUpdate(); + }, + onScaleEnd: (details) async { + await widget.gestureHandler.onScaleUpdate(); + }, + ); + + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart new file mode 100644 index 00000000..5c58f14a --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart @@ -0,0 +1,18 @@ +import 'dart:ui'; + +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; +import 'package:vector_math/vector_math_64.dart'; + +class DefaultPanCameraDelegate implements PanCameraDelegate { + final ThermionViewer viewer; + + DefaultPanCameraDelegate(this.viewer); + + @override + Future panCamera(Offset delta, Vector2? velocity) async { + // Implement panning logic here + // This is a placeholder implementation + print("Panning camera by $delta"); + } +} \ No newline at end of file diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_velocity_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_velocity_delegate.dart new file mode 100644 index 00000000..a25eb0c6 --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_velocity_delegate.dart @@ -0,0 +1,46 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; +import 'package:vector_math/vector_math_64.dart'; + +class DefaultVelocityDelegate extends VelocityDelegate { + Vector2? _velocity; + Timer? _decelerationTimer; + final double _decelerationFactor = 0.95; + final double _minVelocity = 0.01; + + Vector2? get velocity => _velocity; + + @override + void updateVelocity(Offset delta) { + _velocity = Vector2(delta.dx, delta.dy); + } + + @override + void startDeceleration() { + if (_velocity != null && _velocity!.length > _minVelocity) { + _decelerationTimer = Timer.periodic(Duration(milliseconds: 16), (timer) { + if (_velocity == null || _velocity!.length <= _minVelocity) { + stopDeceleration(); + return; + } + + _velocity = _velocity! * _decelerationFactor; + + }); + } + } + + @override + void stopDeceleration() { + _decelerationTimer?.cancel(); + _decelerationTimer = null; + _velocity = null; + } + + @override + void dispose() { + stopDeceleration(); + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart new file mode 100644 index 00000000..6fde49e5 --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart @@ -0,0 +1,38 @@ +import 'dart:math'; + +import 'package:flutter/widgets.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; +import 'package:vector_math/vector_math_64.dart'; + +class DefaultZoomCameraDelegate implements ZoomCameraDelegate { + final ThermionViewer viewer; + final double _zoomSensitivity = 0.0005; + + final double? Function(Vector3 cameraPosition)? getDistanceToTarget; + + DefaultZoomCameraDelegate(this.viewer, {this.getDistanceToTarget}); + + @override + Future zoomCamera(double scrollDelta, Vector2? velocity) async { + Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); + final cameraRotation = currentModelMatrix.getRotation(); + final cameraPosition = currentModelMatrix.getTranslation(); + + Vector3 forwardVector = cameraRotation.getColumn(2); + forwardVector.normalize(); + + double? distanceToTarget = getDistanceToTarget?.call(cameraPosition); + double zoomDistance = scrollDelta * _zoomSensitivity; + if (distanceToTarget != null) { + zoomDistance *= distanceToTarget; + if (zoomDistance.abs() < 0.0001) { + zoomDistance = scrollDelta * _zoomSensitivity; + } + } + zoomDistance = max(zoomDistance, scrollDelta * _zoomSensitivity); + + Vector3 newPosition = cameraPosition + (forwardVector * zoomDistance); + await viewer.setCameraPosition(newPosition.x, newPosition.y, newPosition.z); + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart new file mode 100644 index 00000000..84fd329f --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart @@ -0,0 +1,127 @@ +import 'dart:async'; +import 'package:flutter/gestures.dart'; +import 'package:logging/logging.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; +import 'package:thermion_flutter/thermion_flutter.dart'; + +class DelegateGestureHandler implements ThermionGestureHandler { + final ThermionViewer viewer; + final Logger _logger = Logger("CustomGestureHandler"); + + ThermionGestureState _currentState = ThermionGestureState.NULL; + + // Class-based delegates + RotateCameraDelegate? rotateCameraDelegate; + PanCameraDelegate? panCameraDelegate; + ZoomCameraDelegate? zoomCameraDelegate; + VelocityDelegate? velocityDelegate; + + DelegateGestureHandler({ + required this.viewer, + required this.rotateCameraDelegate, + required this.panCameraDelegate, + required this.zoomCameraDelegate, + required this.velocityDelegate, + }); + + @override + Future onPointerDown(Offset localPosition, int buttons) async { + velocityDelegate?.stopDeceleration(); + } + + @override + Future onPointerMove( + Offset localPosition, Offset delta, int buttons) async { + velocityDelegate?.updateVelocity(delta); + + GestureType gestureType; + if (buttons == kPrimaryMouseButton) { + gestureType = GestureType.POINTER1_MOVE; + } else if (buttons == kSecondaryMouseButton) { + gestureType = GestureType.POINTER2_MOVE; + } else { + throw Exception("Unsupported button: $buttons"); + } + + var action = _actions[gestureType]; + + switch (action) { + case GestureAction.PAN_CAMERA: + _currentState = ThermionGestureState.PANNING; + await panCameraDelegate?.panCamera(delta, velocityDelegate?.velocity); + case GestureAction.ROTATE_CAMERA: + _currentState = ThermionGestureState.ROTATING; + await rotateCameraDelegate?.rotateCamera(delta, velocityDelegate?.velocity); + case null: + // ignore; + break; + default: + throw Exception("Unsupported gesture type : $gestureType "); + } + } + + @override + Future onPointerUp(int buttons) async { + _currentState = ThermionGestureState.NULL; + velocityDelegate?.startDeceleration(); + } + + @override + Future onPointerHover(Offset localPosition) async { + // TODO, currently noop + } + + @override + Future onPointerScroll(Offset localPosition, double scrollDelta) async { + if (_currentState != ThermionGestureState.NULL) { + return; + } + + if (_actions[GestureType.POINTER_ZOOM] != GestureAction.ZOOM_CAMERA) { + throw Exception( + "Unsupported action : ${_actions[GestureType.POINTER_ZOOM]}"); + } + + _currentState = ThermionGestureState.ZOOMING; + + try { + await zoomCameraDelegate?.zoomCamera(scrollDelta, velocityDelegate?.velocity); + } catch (e) { + _logger.warning("Error during camera zoom: $e"); + } finally { + _currentState = ThermionGestureState.NULL; + } + } + + @override + void dispose() { + // Clean up any resources if needed + } + + @override + Future get initialized => viewer.initialized; + + @override + Future onScaleEnd() async {} + + @override + Future onScaleStart() async {} + + @override + Future onScaleUpdate() async {} + + final _actions = { + GestureType.POINTER1_MOVE: GestureAction.PAN_CAMERA, + GestureType.POINTER2_MOVE: GestureAction.ROTATE_CAMERA, + GestureType.POINTER_ZOOM: GestureAction.ZOOM_CAMERA + }; + + @override + void setActionForType(GestureType gestureType, GestureAction gestureAction) { + _actions[gestureType] = gestureAction; + } + + GestureAction? getActionForType(GestureType gestureType) { + return _actions[gestureType]; + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart new file mode 100644 index 00000000..0f07aa24 --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart @@ -0,0 +1,29 @@ +import 'dart:ui'; + +import 'package:vector_math/vector_math_64.dart'; + +abstract class RotateCameraDelegate { + Future rotateCamera(Offset delta, Vector2? velocity); +} + +abstract class PanCameraDelegate { + Future panCamera(Offset delta, Vector2? velocity); +} + +abstract class ZoomCameraDelegate { + Future zoomCamera(double scrollDelta, Vector2? velocity); +} + +abstract class VelocityDelegate { + Vector2? get velocity; + + void updateVelocity(Offset delta); + + void startDeceleration(); + + void stopDeceleration(); + + void dispose() { + stopDeceleration(); + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart new file mode 100644 index 00000000..15998b9d --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart @@ -0,0 +1,45 @@ +import 'dart:ui'; + +import 'package:flutter/widgets.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; +import 'package:vector_math/vector_math_64.dart'; + +class FixedOrbitRotateCameraDelegate implements RotateCameraDelegate { + final ThermionViewer viewer; + static final _up = Vector3(0, 1, 0); + static final _forward = Vector3(0, 0, -1); + + static const double _rotationSensitivity = 0.01; + + FixedOrbitRotateCameraDelegate(this.viewer); + + @override + Future rotateCamera(Offset delta, Vector2? velocity) async { + double deltaX = delta.dx; + double deltaY = delta.dy; + deltaX *= _rotationSensitivity * viewer.pixelRatio; + deltaY *= _rotationSensitivity * viewer.pixelRatio; + + Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); + Vector3 currentPosition = currentModelMatrix.getTranslation(); + double distance = currentPosition.length; + Quaternion currentRotation = + Quaternion.fromRotation(currentModelMatrix.getRotation()); + + Quaternion yawRotation = Quaternion.axisAngle(_up, -deltaX); + Vector3 right = _up.cross(_forward)..normalize(); + Quaternion pitchRotation = Quaternion.axisAngle(right, -deltaY); + + Quaternion newRotation = currentRotation * yawRotation * pitchRotation; + newRotation.normalize(); + + Vector3 newPosition = _forward.clone() + ..applyQuaternion(newRotation) + ..scale(-distance); + + Matrix4 newModelMatrix = + Matrix4.compose(newPosition, newRotation, Vector3(1, 1, 1)); + await viewer.setCameraModelMatrix4(newModelMatrix); + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart index b6907d96..2031f72b 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart @@ -5,11 +5,9 @@ class ThermionGestureDetectorMobile extends StatefulWidget { final Widget? child; final ThermionGestureHandler gestureHandler; - const ThermionGestureDetectorMobile({ - Key? key, - required this.gestureHandler, - this.child, - }) : super(key: key); + const ThermionGestureDetectorMobile( + {Key? key, required this.gestureHandler, this.child}) + : super(key: key); @override State createState() => _ThermionGestureDetectorMobileState(); @@ -17,6 +15,13 @@ class ThermionGestureDetectorMobile extends StatefulWidget { class _ThermionGestureDetectorMobileState extends State { + GestureAction current = GestureAction.PAN_CAMERA; + + @override + void initState() { + super.initState(); + } + @override Widget build(BuildContext context) { return Stack(children: [ @@ -26,18 +31,21 @@ class _ThermionGestureDetectorMobileState onTapDown: (details) => widget.gestureHandler.onPointerDown(details.localPosition, 0), onDoubleTap: () { - var current = widget.gestureHandler.getActionForType(GestureType.SCALE); - if(current == GestureAction.PAN_CAMERA) { - widget.gestureHandler.setActionForType(GestureType.SCALE, GestureAction.ROTATE_CAMERA); + if (current == GestureAction.PAN_CAMERA) { + widget.gestureHandler.setActionForType( + GestureType.SCALE1, GestureAction.ROTATE_CAMERA); + current = GestureAction.ROTATE_CAMERA; } else { - widget.gestureHandler.setActionForType(GestureType.SCALE, GestureAction.PAN_CAMERA); + widget.gestureHandler.setActionForType( + GestureType.SCALE1, GestureAction.PAN_CAMERA); + current = GestureAction.PAN_CAMERA; } }, onScaleStart: (details) async { await widget.gestureHandler.onScaleStart(); }, onScaleUpdate: (details) async { - await widget.gestureHandler.onScaleUpdate(); + await widget.gestureHandler.onScaleUpdate(); }, onScaleEnd: (details) async { await widget.gestureHandler.onScaleUpdate(); @@ -45,7 +53,6 @@ class _ThermionGestureDetectorMobileState child: widget.child, ), ), - ]); } } From 51be1bce390c010f928d7b58e7b5566110086bad Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 13:46:41 +0800 Subject: [PATCH 143/232] add pan camera implementation and fix velocity timer --- .../v2/default_pan_camera_delegate.dart | 22 +++++- .../gestures/v2/delegate_gesture_handler.dart | 68 +++++++++++++++++-- 2 files changed, 83 insertions(+), 7 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart index 5c58f14a..a2c9eef0 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart @@ -7,12 +7,28 @@ import 'package:vector_math/vector_math_64.dart'; class DefaultPanCameraDelegate implements PanCameraDelegate { final ThermionViewer viewer; + static const double _panSensitivity = 0.005; + DefaultPanCameraDelegate(this.viewer); @override Future panCamera(Offset delta, Vector2? velocity) async { - // Implement panning logic here - // This is a placeholder implementation - print("Panning camera by $delta"); + double deltaX = delta.dx; + double deltaY = delta.dy; + deltaX *= _panSensitivity * viewer.pixelRatio; + deltaY *= _panSensitivity * viewer.pixelRatio; + + Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); + Vector3 currentPosition = currentModelMatrix.getTranslation(); + Quaternion currentRotation = Quaternion.fromRotation(currentModelMatrix.getRotation()); + + Vector3 right = Vector3(1, 0, 0)..applyQuaternion(currentRotation); + Vector3 up = Vector3(0, 1, 0)..applyQuaternion(currentRotation); + + Vector3 panOffset = right * -deltaX + up * deltaY; + Vector3 newPosition = currentPosition + panOffset; + + Matrix4 newModelMatrix = Matrix4.compose(newPosition, currentRotation, Vector3(1, 1, 1)); + await viewer.setCameraModelMatrix4(newModelMatrix); } } \ No newline at end of file diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart index 84fd329f..e384f737 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart @@ -1,7 +1,11 @@ import 'dart:async'; import 'package:flutter/gestures.dart'; import 'package:logging/logging.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_velocity_delegate.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart'; import 'package:thermion_flutter/thermion_flutter.dart'; class DelegateGestureHandler implements ThermionGestureHandler { @@ -16,6 +20,10 @@ class DelegateGestureHandler implements ThermionGestureHandler { ZoomCameraDelegate? zoomCameraDelegate; VelocityDelegate? velocityDelegate; + // Timer for continuous movement + Timer? _velocityTimer; + static const _velocityUpdateInterval = Duration(milliseconds: 16); // ~60 FPS + DelegateGestureHandler({ required this.viewer, required this.rotateCameraDelegate, @@ -24,11 +32,22 @@ class DelegateGestureHandler implements ThermionGestureHandler { required this.velocityDelegate, }); + factory DelegateGestureHandler.withDefaults(ThermionViewer viewer) => + DelegateGestureHandler( + viewer: viewer, + rotateCameraDelegate: FixedOrbitRotateCameraDelegate(viewer), + panCameraDelegate: DefaultPanCameraDelegate(viewer), + zoomCameraDelegate: DefaultZoomCameraDelegate(viewer), + velocityDelegate: DefaultVelocityDelegate()); + @override Future onPointerDown(Offset localPosition, int buttons) async { velocityDelegate?.stopDeceleration(); + _stopVelocityTimer(); } + GestureType? _lastGestureType; + @override Future onPointerMove( Offset localPosition, Offset delta, int buttons) async { @@ -37,7 +56,7 @@ class DelegateGestureHandler implements ThermionGestureHandler { GestureType gestureType; if (buttons == kPrimaryMouseButton) { gestureType = GestureType.POINTER1_MOVE; - } else if (buttons == kSecondaryMouseButton) { + } else if (buttons == kMiddleMouseButton) { gestureType = GestureType.POINTER2_MOVE; } else { throw Exception("Unsupported button: $buttons"); @@ -51,19 +70,58 @@ class DelegateGestureHandler implements ThermionGestureHandler { await panCameraDelegate?.panCamera(delta, velocityDelegate?.velocity); case GestureAction.ROTATE_CAMERA: _currentState = ThermionGestureState.ROTATING; - await rotateCameraDelegate?.rotateCamera(delta, velocityDelegate?.velocity); + await rotateCameraDelegate?.rotateCamera( + delta, velocityDelegate?.velocity); case null: // ignore; break; default: throw Exception("Unsupported gesture type : $gestureType "); } + + _lastGestureType = gestureType; } @override Future onPointerUp(int buttons) async { _currentState = ThermionGestureState.NULL; velocityDelegate?.startDeceleration(); + _startVelocityTimer(); + } + + void _startVelocityTimer() { + _stopVelocityTimer(); // Ensure any existing timer is stopped + _velocityTimer = Timer.periodic(_velocityUpdateInterval, (timer) { + _applyVelocity(); + }); + } + + void _stopVelocityTimer() { + _velocityTimer?.cancel(); + _velocityTimer = null; + } + + Future _applyVelocity() async { + final velocity = velocityDelegate?.velocity; + if (velocity == null || velocity.length < 0.1) { + _stopVelocityTimer(); + return; + } + + final lastAction = _actions[_lastGestureType]; + switch (lastAction) { + case GestureAction.PAN_CAMERA: + await panCameraDelegate?.panCamera( + Offset(velocity.x, velocity.y), velocity); + case GestureAction.ROTATE_CAMERA: + await rotateCameraDelegate?.rotateCamera( + Offset(velocity.x, velocity.y), velocity); + default: + // Do nothing for other actions + break; + } + + velocityDelegate?.updateVelocity(Offset(velocity.x, velocity.y)); // Gradually reduce velocity } @override @@ -85,7 +143,8 @@ class DelegateGestureHandler implements ThermionGestureHandler { _currentState = ThermionGestureState.ZOOMING; try { - await zoomCameraDelegate?.zoomCamera(scrollDelta, velocityDelegate?.velocity); + await zoomCameraDelegate?.zoomCamera( + scrollDelta, velocityDelegate?.velocity); } catch (e) { _logger.warning("Error during camera zoom: $e"); } finally { @@ -95,7 +154,8 @@ class DelegateGestureHandler implements ThermionGestureHandler { @override void dispose() { - // Clean up any resources if needed + _stopVelocityTimer(); + velocityDelegate?.dispose(); } @override From 3a9bd31919f86bf00036d17423f9a2487e30e3d7 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 13:47:26 +0800 Subject: [PATCH 144/232] remove superseded desktop/mobile gesture detector widget --- ...rmion_gesture_detector_desktop_widget.dart | 37 ------------ ...ermion_gesture_detector_mobile_widget.dart | 58 ------------------- 2 files changed, 95 deletions(-) delete mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_desktop_widget.dart delete mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_desktop_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_desktop_widget.dart deleted file mode 100644 index 38f5ad0e..00000000 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_desktop_widget.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; - -class ThermionGestureDetectorDesktop extends StatelessWidget { - - final ThermionGestureHandler gestureHandler; - - const ThermionGestureDetectorDesktop({ - Key? key, - required this.gestureHandler, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Listener( - onPointerHover: (event) => - gestureHandler.onPointerHover(event.localPosition), - onPointerSignal: (PointerSignalEvent pointerSignal) { - if (pointerSignal is PointerScrollEvent) { - gestureHandler.onPointerScroll( - pointerSignal.localPosition, pointerSignal.scrollDelta.dy); - } - }, - onPointerPanZoomStart: (pzs) { - throw Exception("TODO - is this a pinch zoom on laptop trackpad?"); - }, - onPointerDown: (d) { - gestureHandler.onPointerDown(d.localPosition, d.buttons); - }, - onPointerMove: (d) => - gestureHandler.onPointerMove(d.localPosition, d.delta, d.buttons), - onPointerUp: (d) => gestureHandler.onPointerUp(d.buttons), - child: Container(color: Colors.transparent,), - ); - } -} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart deleted file mode 100644 index 2031f72b..00000000 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/thermion_gesture_detector_mobile_widget.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter/widgets.dart'; -import 'package:thermion_flutter/thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; - -class ThermionGestureDetectorMobile extends StatefulWidget { - final Widget? child; - final ThermionGestureHandler gestureHandler; - - const ThermionGestureDetectorMobile( - {Key? key, required this.gestureHandler, this.child}) - : super(key: key); - - @override - State createState() => _ThermionGestureDetectorMobileState(); -} - -class _ThermionGestureDetectorMobileState - extends State { - GestureAction current = GestureAction.PAN_CAMERA; - - @override - void initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Stack(children: [ - Positioned.fill( - child: GestureDetector( - behavior: HitTestBehavior.translucent, - onTapDown: (details) => - widget.gestureHandler.onPointerDown(details.localPosition, 0), - onDoubleTap: () { - if (current == GestureAction.PAN_CAMERA) { - widget.gestureHandler.setActionForType( - GestureType.SCALE1, GestureAction.ROTATE_CAMERA); - current = GestureAction.ROTATE_CAMERA; - } else { - widget.gestureHandler.setActionForType( - GestureType.SCALE1, GestureAction.PAN_CAMERA); - current = GestureAction.PAN_CAMERA; - } - }, - onScaleStart: (details) async { - await widget.gestureHandler.onScaleStart(); - }, - onScaleUpdate: (details) async { - await widget.gestureHandler.onScaleUpdate(); - }, - onScaleEnd: (details) async { - await widget.gestureHandler.onScaleUpdate(); - }, - child: widget.child, - ), - ), - ]); - } -} From 00d75be479dd1df41b6d2366f06b1ce1efaec861 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 14:25:10 +0800 Subject: [PATCH 145/232] gesture handler improvements --- .../gestures/v2/default_zoom_camera_delegate.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart index 6fde49e5..2cbce35a 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart @@ -7,11 +7,11 @@ import 'package:vector_math/vector_math_64.dart'; class DefaultZoomCameraDelegate implements ZoomCameraDelegate { final ThermionViewer viewer; - final double _zoomSensitivity = 0.0005; + final double zoomSensitivity ; final double? Function(Vector3 cameraPosition)? getDistanceToTarget; - DefaultZoomCameraDelegate(this.viewer, {this.getDistanceToTarget}); + DefaultZoomCameraDelegate(this.viewer, {this.zoomSensitivity = 0.005, this.getDistanceToTarget}); @override Future zoomCamera(double scrollDelta, Vector2? velocity) async { @@ -23,14 +23,14 @@ class DefaultZoomCameraDelegate implements ZoomCameraDelegate { forwardVector.normalize(); double? distanceToTarget = getDistanceToTarget?.call(cameraPosition); - double zoomDistance = scrollDelta * _zoomSensitivity; + double zoomDistance = scrollDelta * zoomSensitivity; if (distanceToTarget != null) { zoomDistance *= distanceToTarget; if (zoomDistance.abs() < 0.0001) { - zoomDistance = scrollDelta * _zoomSensitivity; + zoomDistance = scrollDelta * zoomSensitivity; } } - zoomDistance = max(zoomDistance, scrollDelta * _zoomSensitivity); + zoomDistance = max(zoomDistance, scrollDelta * zoomSensitivity); Vector3 newPosition = cameraPosition + (forwardVector * zoomDistance); await viewer.setCameraPosition(newPosition.x, newPosition.y, newPosition.z); From c99c57e24d76428f5d091396a97f0f5e2e5861ca Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 14:52:20 +0800 Subject: [PATCH 146/232] geometry receives/casts shadows by default --- thermion_dart/native/src/SceneManager.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index f833b732..1351eb8a 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -2390,8 +2390,8 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v builder.boundingBox(geometry->getBoundingBox()) .geometry(0, primitiveType, geometry->vertexBuffer(), geometry->indexBuffer(), 0, numIndices) .culling(true) - .receiveShadows(false) - .castShadows(false); + .receiveShadows(true) + .castShadows(true); if (materialPath) { filament::Material* mat = nullptr; @@ -2460,7 +2460,6 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v ) { return createGeometryWithNormals(vertices, numVertices, nullptr, 0, indices, numIndices, primitiveType, materialPath, keepData); } - } // namespace thermion_filament From aee607908da91a3fc225117ce9622f61a32e7a77 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 15:18:01 +0800 Subject: [PATCH 147/232] remove using namespace filament* --- thermion_dart/native/include/FilamentViewer.hpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index a3a68de6..92c8133c 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -42,8 +42,6 @@ namespace thermion_filament typedef std::chrono::time_point time_point_t; using namespace std::chrono; - using namespace filament; - using namespace filament::math; using namespace gltfio; using namespace camutils; @@ -197,7 +195,7 @@ namespace thermion_filament // background image properties uint32_t _imageHeight = 0; uint32_t _imageWidth = 0; - mat4f _imageScale; + filament::math::mat4f _imageScale; Texture *_imageTexture = nullptr; Texture *_dummyImageTexture = nullptr; utils::Entity _imageEntity; From 70f904d54cee5009401582bd55a6974117833c04 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 15:20:45 +0800 Subject: [PATCH 148/232] allow setting material property by name --- thermion_dart/native/include/SceneManager.hpp | 3 ++ .../native/include/ThermionDartApi.h | 10 ++++++ thermion_dart/native/src/SceneManager.cpp | 35 +++++++++++++++++++ thermion_dart/native/src/ThermionDartApi.cpp | 12 +++++++ 4 files changed, 60 insertions(+) diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 1ee3ad0d..fb23d4b7 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -287,6 +287,9 @@ namespace thermion_filament return _assetLoader->createInstance(asset); } + void setMaterialProperty(EntityId entity, int materialIndex, const char* property, float value); + void setMaterialProperty(EntityId entityId, int materialIndex, const char* property, filament::math::float4 value); + private: gltfio::AssetLoader *_assetLoader = nullptr; const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 3a9218d1..baba1538 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -59,6 +59,13 @@ extern "C" typedef int32_t _ManipulatorMode; typedef struct CameraPtr CameraPtr; + typedef struct { + float x; + float y; + float z; + float w; + } float4; + typedef struct { double col1[4]; double col2[4]; @@ -270,6 +277,9 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible); EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entity, float r, float g, float b); EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entity); + EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char* property, float value); + EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char* property, float4 value); + #ifdef __cplusplus } diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 1351eb8a..80f4490b 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -2460,6 +2460,41 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v ) { return createGeometryWithNormals(vertices, numVertices, nullptr, 0, indices, numIndices, primitiveType, materialPath, keepData); } + + void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char* property, float value) { + auto entity = Entity::import(entityId); + const auto& rm = _engine->getRenderableManager(); + auto renderableInstance = rm.getInstance(entity); + if(!renderableInstance.isValid()) { + Log("ERROR"); + return; + } + auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); + + if(!materialInstance->getMaterial()->hasParameter(property)) { + Log("Parameter %s not found", property); + return; + } + materialInstance->setParameter(property, value); + } + + void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char* property, filament::math::float4 value) { + auto entity = Entity::import(entityId); + const auto& rm = _engine->getRenderableManager(); + auto renderableInstance = rm.getInstance(entity); + if(!renderableInstance.isValid()) { + Log("ERROR"); + return; + } + auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); + + if(!materialInstance->getMaterial()->hasParameter(property)) { + Log("Parameter %s not found", property); + return; + } + materialInstance->setParameter(property, value); + } + } // namespace thermion_filament diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index e4464a00..16d6fbdc 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -943,4 +943,16 @@ extern "C" { ((SceneManager *)sceneManager)->removeStencilHighlight(entityId); } + + EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char* property, float value) { + ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value); + } + + EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char* property, float4 value) { + filament::math::float4 filamentValue { value.x, value.y, value.z, value.w }; + + ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, filamentValue); + } + + } From 820d341f67071c9c7dcae7cacef87526f6d0bd94 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 15:26:44 +0800 Subject: [PATCH 149/232] update bindings --- .../compatibility/native/thermion_dart.g.dart | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart index e38295b3..bc6ac154 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart @@ -1192,6 +1192,28 @@ external void remove_stencil_highlight( int entity, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, + ffi.Pointer, ffi.Float)>(isLeaf: true) +external void set_material_property_float( + ffi.Pointer sceneManager, + int entity, + int materialIndex, + ffi.Pointer property, + double value, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, + ffi.Pointer, float4)>(isLeaf: true) +external void set_material_property_float4( + ffi.Pointer sceneManager, + int entity, + int materialIndex, + ffi.Pointer property, + float4 value, +); + @ffi.Native< ffi.Void Function( ffi.Pointer, @@ -1773,6 +1795,20 @@ final class Aabb2 extends ffi.Struct { final class CameraPtr extends ffi.Opaque {} +final class float4 extends ffi.Struct { + @ffi.Float() + external double x; + + @ffi.Float() + external double y; + + @ffi.Float() + external double z; + + @ffi.Float() + external double w; +} + final class double4x4 extends ffi.Struct { @ffi.Array.multi([4]) external ffi.Array col1; From 6b0f25ca591c2b707dd158df070f9f6dc674ab27 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 15:27:01 +0800 Subject: [PATCH 150/232] remove using namespace filament* --- thermion_dart/native/src/FilamentViewer.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index c55aba86..59cc7988 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -117,7 +117,7 @@ namespace thermion_filament using std::string; - static constexpr float4 sFullScreenTriangleVertices[3] = { + static constexpr filament::math::float4 sFullScreenTriangleVertices[3] = { {-1.0f, -1.0f, 1.0f, 1.0f}, {3.0f, -1.0f, 1.0f, 1.0f}, {-1.0f, 3.0f, 1.0f, 1.0f}}; @@ -315,8 +315,8 @@ namespace thermion_filament .sunAngularRadius(sunAngularRadius) .sunHaloSize(sunHaloSize) .sunHaloFalloff(sunHaloFallof) - .position(math::float3(posX, posY, posZ)) - .direction(math::float3(dirX, dirY, dirZ)) + .position(filament::math::float3(posX, posY, posZ)) + .direction(filament::math::float3(dirX, dirY, dirZ)) .castShadows(shadows) .build(*_engine, light); if (result != LightManager::Builder::Result::Success) @@ -526,7 +526,7 @@ namespace thermion_filament createBackgroundImage(); } _imageMaterial->setDefaultParameter("showImage", 0); - _imageMaterial->setDefaultParameter("backgroundColor", RgbaType::sRGB, float4(r, g, b, a)); + _imageMaterial->setDefaultParameter("backgroundColor", RgbaType::sRGB, filament::math::float4(r, g, b, a)); _imageMaterial->setDefaultParameter("transform", _imageScale); } @@ -547,7 +547,7 @@ namespace thermion_filament .package(IMAGE_IMAGE_DATA, IMAGE_IMAGE_SIZE) .build(*_engine); _imageMaterial->setDefaultParameter("showImage", 0); - _imageMaterial->setDefaultParameter("backgroundColor", RgbaType::sRGB, float4(1.0f, 1.0f, 1.0f, 0.0f)); + _imageMaterial->setDefaultParameter("backgroundColor", RgbaType::sRGB, filament::math::float4(1.0f, 1.0f, 1.0f, 0.0f)); _imageMaterial->setDefaultParameter("image", _dummyImageTexture, _imageSampler); } catch (...) @@ -728,7 +728,7 @@ namespace thermion_filament _imageScale[2][0], _imageScale[2][1], _imageScale[2][2], _imageScale[2][3], _imageScale[3][0], _imageScale[3][1], _imageScale[3][2], _imageScale[3][3]); - auto transform = math::mat4f::translation(math::float3(x, y, 0.0f)) * _imageScale; + auto transform = math::mat4f::translation(filament::math::float3(x, y, 0.0f)) * _imageScale; Log("transform %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f ", transform[0][0], transform[0][1], transform[0][2], transform[0][3], transform[1][0], transform[1][1], transform[1][2], transform[1][3], @@ -1077,7 +1077,7 @@ namespace thermion_filament image::Ktx1Bundle *iblBundle = new image::Ktx1Bundle(static_cast(iblBuffer.data), static_cast(iblBuffer.size)); - math::float3 harmonics[9]; + filament::math::float3 harmonics[9]; iblBundle->getSphericalHarmonics(harmonics); std::vector *callbackData = new std::vector{(void *)_resourceLoaderWrapper, iblBufferCopy}; From 6ef8d19e94771d10c4fe67b3ff6ec279ca4c0cfe Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 15:27:20 +0800 Subject: [PATCH 151/232] (flutter) export delegate gesture handler --- thermion_flutter/thermion_flutter/lib/thermion_flutter.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart b/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart index fc1e3c83..0620499c 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart @@ -4,6 +4,8 @@ export 'thermion/thermion_flutter_plugin.dart'; export 'thermion/widgets/thermion_widget.dart'; export 'thermion/widgets/camera/gestures/thermion_gesture_detector.dart'; export 'thermion/widgets/camera/gestures/thermion_gesture_handler.dart'; +export 'thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart'; + export 'thermion/widgets/camera/camera_orientation_widget.dart'; export 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; export 'package:thermion_dart/thermion_dart.dart'; From ad205679cb64ff42884399b89f663ed607edbcbd Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 15:27:46 +0800 Subject: [PATCH 152/232] allow setting material property by name --- .../lib/thermion_dart/thermion_viewer.dart | 15 ++++++++++ .../thermion_dart/thermion_viewer_ffi.dart | 29 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index e16bde5d..24be69a7 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -593,9 +593,23 @@ abstract class ThermionViewer { /// /// Sets the `baseColorFactor` property for the material at index [materialIndex] in [entity] under node [meshName] to [color]. /// + @Deprecated("Use setMaterialPropertyFloat4 instead") Future setMaterialColor(ThermionEntity entity, String meshName, int materialIndex, double r, double g, double b, double a); + /// + /// Sets the material property [propertyName] under material [materialIndex] for [entity] to [value]. + /// [entity] must have a Renderable attached. + /// + Future setMaterialPropertyFloat4(ThermionEntity entity, String propertyName, + int materialIndex, double f1, double f2, double f3, double f4); + + /// + /// Sets the material property [propertyName] under material [materialIndex] for [entity] to [value]. + /// [entity] must have a Renderable attached. + /// + Future setMaterialPropertyFloat(ThermionEntity entity, String propertyName, int materialIndex, double value); + /// /// Scale [entity] to fit within the unit cube. /// @@ -867,4 +881,5 @@ abstract class ThermionViewer { /// Removes the outline around [entity]. Noop if there was no highlight. /// Future removeStencilHighlight(ThermionEntity entity); + } diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index eaf2fb09..dbed65dc 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -1943,4 +1943,33 @@ class ThermionViewerFFI extends ThermionViewer { Future removeStencilHighlight(ThermionEntity entity) async { remove_stencil_highlight(_sceneManager!, entity); } + + /// + /// Sets the material property [propertyName] under material [materialIndex] for [entity] to [value]. + /// [entity] must have a Renderable attached. + /// + Future setMaterialPropertyFloat(ThermionEntity entity, String propertyName, + int materialIndex, double value) async { + final ptr = propertyName.toNativeUtf8(allocator: allocator); + set_material_property_float( + _sceneManager!, entity, materialIndex, ptr.cast(), value); + allocator.free(ptr); + } + + /// + /// Sets the material property [propertyName] under material [materialIndex] for [entity] to {f1,f2,f3,f4}. + /// [entity] must have a Renderable attached. + /// + Future setMaterialPropertyFloat4(ThermionEntity entity, String propertyName, + int materialIndex, double f1, double f2, double f3, double f4) async { + final ptr = propertyName.toNativeUtf8(allocator: allocator); + var struct = Struct.create(); + struct.x = f1; + struct.y = f2; + struct.z = f3; + struct.w = f3; + set_material_property_float4(_sceneManager!, entity, materialIndex, + ptr.cast(), struct); + allocator.free(ptr); + } } From 315f2b63b9d13bda6b3cf4d5fef42501db3ee2af Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Sep 2024 18:32:02 +0800 Subject: [PATCH 153/232] gesture handler & delegate improvements --- .../picking_camera_gesture_handler.dart | 2 +- .../gestures/thermion_gesture_handler.dart | 24 +- .../gestures/thermion_listener_widget.dart | 2 +- ...fault_keyboard_camera_flight_delegate.dart | 87 ++++++ .../v2/default_pan_camera_delegate.dart | 51 ++-- .../v2/default_zoom_camera_delegate.dart | 32 ++- .../gestures/v2/delegate_gesture_handler.dart | 264 ++++++++++-------- .../widgets/camera/gestures/v2/delegates.dart | 18 +- .../fixed_orbit_camera_rotation_delegate.dart | 125 +++++++-- .../v2/free_flight_camera_delegate.dart | 207 ++++++++++++++ 10 files changed, 603 insertions(+), 209 deletions(-) create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_keyboard_camera_flight_delegate.dart create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart index 8800348b..09f723cf 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/picking_camera_gesture_handler.dart @@ -76,7 +76,7 @@ class PickingCameraGestureHandler implements ThermionGestureHandler { } @override - Future onPointerHover(Offset localPosition) async { + Future onPointerHover(Offset localPosition, Offset delta) async { if (_gizmoAttached) { _gizmo?.checkHover(localPosition.dx, localPosition.dy); } diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart index 29a56121..0306afa4 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart @@ -5,17 +5,18 @@ import 'package:flutter/services.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; enum GestureType { - POINTER1_DOWN, - POINTER1_MOVE, - POINTER1_UP, - POINTER1_HOVER, - POINTER2_DOWN, - POINTER2_MOVE, - POINTER2_UP, - POINTER2_HOVER, + LMB_DOWN, + LMB_HOLD_AND_MOVE, + LMB_UP, + LMB_HOVER, + MMB_DOWN, + MMB_HOLD_AND_MOVE, + MMB_UP, + MMB_HOVER, SCALE1, SCALE2, - POINTER_ZOOM, + SCROLLWHEEL, + POINTER_MOVE } enum GestureAction { @@ -23,7 +24,8 @@ enum GestureAction { ROTATE_CAMERA, ZOOM_CAMERA, TRANSLATE_ENTITY, - ROTATE_ENTITY + ROTATE_ENTITY, + NONE } enum ThermionGestureState { @@ -34,7 +36,7 @@ enum ThermionGestureState { } abstract class ThermionGestureHandler { - Future onPointerHover(Offset localPosition); + Future onPointerHover(Offset localPosition, Offset delta); Future onPointerScroll(Offset localPosition, double scrollDelta); Future onPointerDown(Offset localPosition, int buttons); Future onPointerMove(Offset localPosition, Offset delta, int buttons); diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart index 0a9b82a7..0dcb1642 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_listener_widget.dart @@ -34,7 +34,7 @@ class ThermionListenerWidget extends StatelessWidget { Widget _desktop() { return Listener( onPointerHover: (event) => - gestureHandler.onPointerHover(event.localPosition), + gestureHandler.onPointerHover(event.localPosition, event.delta), onPointerSignal: (PointerSignalEvent pointerSignal) { if (pointerSignal is PointerScrollEvent) { gestureHandler.onPointerScroll( diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_keyboard_camera_flight_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_keyboard_camera_flight_delegate.dart new file mode 100644 index 00000000..4630acbc --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_keyboard_camera_flight_delegate.dart @@ -0,0 +1,87 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:flutter/services.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; +import 'package:vector_math/vector_math_64.dart'; + +class DefaultKeyboardCameraFlightDelegate + { + final ThermionViewer viewer; + + static const double _panSensitivity = 0.005; + static const double _keyMoveSensitivity = 0.1; + + final Map _pressedKeys = {}; + Timer? _moveTimer; + + DefaultKeyboardCameraFlightDelegate(this.viewer) { + _startMoveLoop(); + } + + @override + Future panCamera(Offset delta, Vector2? velocity) async { + double deltaX = delta.dx; + double deltaY = delta.dy; + deltaX *= _panSensitivity * viewer.pixelRatio; + deltaY *= _panSensitivity * viewer.pixelRatio; + + await _moveCamera(deltaX, deltaY, 0); + } + + @override + Future onKeypress(PhysicalKeyboardKey key) async { + _pressedKeys[key] = true; + } + + // New method to handle key release + Future onKeyRelease(PhysicalKeyboardKey key) async { + _pressedKeys.remove(key); + } + + void _startMoveLoop() { + _moveTimer = Timer.periodic( + Duration(milliseconds: 16), (_) => _processKeyboardInput()); + } + + Future _processKeyboardInput() async { + double dx = 0, dy = 0, dz = 0; + + if (_pressedKeys[PhysicalKeyboardKey.keyW] == true) + dz += _keyMoveSensitivity; + if (_pressedKeys[PhysicalKeyboardKey.keyS] == true) + dz -= _keyMoveSensitivity; + if (_pressedKeys[PhysicalKeyboardKey.keyA] == true) + dx -= _keyMoveSensitivity; + if (_pressedKeys[PhysicalKeyboardKey.keyD] == true) + dx += _keyMoveSensitivity; + + if (dx != 0 || dy != 0 || dz != 0) { + await _moveCamera(dx, dy, dz); + } + // Removed _pressedKeys.clear(); from here + } + + Future _moveCamera(double dx, double dy, double dz) async { + Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); + Vector3 currentPosition = currentModelMatrix.getTranslation(); + Quaternion currentRotation = + Quaternion.fromRotation(currentModelMatrix.getRotation()); + + Vector3 forward = Vector3(0, 0, -1)..applyQuaternion(currentRotation); + Vector3 right = Vector3(1, 0, 0)..applyQuaternion(currentRotation); + Vector3 up = Vector3(0, 1, 0)..applyQuaternion(currentRotation); + + Vector3 moveOffset = right * dx + up * dy + forward * dz; + Vector3 newPosition = currentPosition + moveOffset; + + Matrix4 newModelMatrix = + Matrix4.compose(newPosition, currentRotation, Vector3(1, 1, 1)); + await viewer.setCameraModelMatrix4(newModelMatrix); + } + + void dispose() { + _moveTimer?.cancel(); + } +} \ No newline at end of file diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart index a2c9eef0..a9d05751 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart @@ -1,34 +1,35 @@ -import 'dart:ui'; +// import 'dart:ui'; -import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; -import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; -import 'package:vector_math/vector_math_64.dart'; +// import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +// import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; +// import 'package:vector_math/vector_math_64.dart'; -class DefaultPanCameraDelegate implements PanCameraDelegate { - final ThermionViewer viewer; +// class DefaultPanCameraDelegate implements PanCameraDelegate { +// final ThermionViewer viewer; - static const double _panSensitivity = 0.005; +// static const double _panSensitivity = 0.005; - DefaultPanCameraDelegate(this.viewer); +// DefaultPanCameraDelegate(this.viewer); +// static const double _panSensitivity = 0.005; - @override - Future panCamera(Offset delta, Vector2? velocity) async { - double deltaX = delta.dx; - double deltaY = delta.dy; - deltaX *= _panSensitivity * viewer.pixelRatio; - deltaY *= _panSensitivity * viewer.pixelRatio; +// @override +// Future panCamera(Offset delta, Vector2? velocity) async { +// double deltaX = delta.dx; +// double deltaY = delta.dy; +// deltaX *= _panSensitivity * viewer.pixelRatio; +// deltaY *= _panSensitivity * viewer.pixelRatio; - Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); - Vector3 currentPosition = currentModelMatrix.getTranslation(); - Quaternion currentRotation = Quaternion.fromRotation(currentModelMatrix.getRotation()); +// Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); +// Vector3 currentPosition = currentModelMatrix.getTranslation(); +// Quaternion currentRotation = Quaternion.fromRotation(currentModelMatrix.getRotation()); - Vector3 right = Vector3(1, 0, 0)..applyQuaternion(currentRotation); - Vector3 up = Vector3(0, 1, 0)..applyQuaternion(currentRotation); +// Vector3 right = Vector3(1, 0, 0)..applyQuaternion(currentRotation); +// Vector3 up = Vector3(0, 1, 0)..applyQuaternion(currentRotation); - Vector3 panOffset = right * -deltaX + up * deltaY; - Vector3 newPosition = currentPosition + panOffset; +// Vector3 panOffset = right * -deltaX + up * deltaY; +// Vector3 newPosition = currentPosition + panOffset; - Matrix4 newModelMatrix = Matrix4.compose(newPosition, currentRotation, Vector3(1, 1, 1)); - await viewer.setCameraModelMatrix4(newModelMatrix); - } -} \ No newline at end of file +// Matrix4 newModelMatrix = Matrix4.compose(newPosition, currentRotation, Vector3(1, 1, 1)); +// await viewer.setCameraModelMatrix4(newModelMatrix); +// } +// } \ No newline at end of file diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart index 2cbce35a..30c8cd64 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart @@ -5,23 +5,16 @@ import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; import 'package:vector_math/vector_math_64.dart'; -class DefaultZoomCameraDelegate implements ZoomCameraDelegate { +class DefaultZoomCameraDelegate { final ThermionViewer viewer; - final double zoomSensitivity ; + final double zoomSensitivity; final double? Function(Vector3 cameraPosition)? getDistanceToTarget; - DefaultZoomCameraDelegate(this.viewer, {this.zoomSensitivity = 0.005, this.getDistanceToTarget}); - - @override - Future zoomCamera(double scrollDelta, Vector2? velocity) async { - Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); - final cameraRotation = currentModelMatrix.getRotation(); - final cameraPosition = currentModelMatrix.getTranslation(); - - Vector3 forwardVector = cameraRotation.getColumn(2); - forwardVector.normalize(); + DefaultZoomCameraDelegate(this.viewer, + {this.zoomSensitivity = 0.005, this.getDistanceToTarget}); + double calculateZoomDistance(double scrollDelta, Vector2? velocity, Vector3 cameraPosition) { double? distanceToTarget = getDistanceToTarget?.call(cameraPosition); double zoomDistance = scrollDelta * zoomSensitivity; if (distanceToTarget != null) { @@ -30,7 +23,20 @@ class DefaultZoomCameraDelegate implements ZoomCameraDelegate { zoomDistance = scrollDelta * zoomSensitivity; } } - zoomDistance = max(zoomDistance, scrollDelta * zoomSensitivity); + return max(zoomDistance, scrollDelta * zoomSensitivity); + } + + @override + Future zoom(double scrollDelta, Vector2? velocity) async { + Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); + final cameraRotation = currentModelMatrix.getRotation(); + final cameraPosition = currentModelMatrix.getTranslation(); + + Vector3 forwardVector = cameraRotation.getColumn(2); + forwardVector.normalize(); + + var zoomDistance = + calculateZoomDistance(scrollDelta, velocity, cameraPosition); Vector3 newPosition = cameraPosition + (forwardVector * zoomDistance); await viewer.setCameraPosition(newPosition.x, newPosition.y, newPosition.z); diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart index e384f737..142b73aa 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart @@ -1,161 +1,177 @@ import 'dart:async'; import 'package:flutter/gestures.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter/services.dart'; import 'package:logging/logging.dart'; -import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_pan_camera_delegate.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_keyboard_camera_flight_delegate.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_velocity_delegate.dart'; -import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart'; import 'package:thermion_flutter/thermion_flutter.dart'; class DelegateGestureHandler implements ThermionGestureHandler { final ThermionViewer viewer; final Logger _logger = Logger("CustomGestureHandler"); - ThermionGestureState _currentState = ThermionGestureState.NULL; - - // Class-based delegates - RotateCameraDelegate? rotateCameraDelegate; - PanCameraDelegate? panCameraDelegate; - ZoomCameraDelegate? zoomCameraDelegate; + CameraDelegate? cameraDelegate; VelocityDelegate? velocityDelegate; - // Timer for continuous movement - Timer? _velocityTimer; - static const _velocityUpdateInterval = Duration(milliseconds: 16); // ~60 FPS + Ticker? _ticker; + static const _updateInterval = Duration(milliseconds: 16); + + Map _accumulatedDeltas = {}; + double _accumulatedScrollDelta = 0.0; + int _activePointers = 0; + bool _isMiddleMouseButtonPressed = false; + + VoidCallback? _keyboardListenerDisposer; + + final Map _actions = { + GestureType.LMB_HOLD_AND_MOVE: GestureAction.PAN_CAMERA, + GestureType.MMB_HOLD_AND_MOVE: GestureAction.ROTATE_CAMERA, + GestureType.SCROLLWHEEL: GestureAction.ZOOM_CAMERA, + GestureType.POINTER_MOVE: GestureAction.NONE, + }; DelegateGestureHandler({ required this.viewer, - required this.rotateCameraDelegate, - required this.panCameraDelegate, - required this.zoomCameraDelegate, + required this.cameraDelegate, required this.velocityDelegate, - }); - - factory DelegateGestureHandler.withDefaults(ThermionViewer viewer) => - DelegateGestureHandler( - viewer: viewer, - rotateCameraDelegate: FixedOrbitRotateCameraDelegate(viewer), - panCameraDelegate: DefaultPanCameraDelegate(viewer), - zoomCameraDelegate: DefaultZoomCameraDelegate(viewer), - velocityDelegate: DefaultVelocityDelegate()); - - @override - Future onPointerDown(Offset localPosition, int buttons) async { - velocityDelegate?.stopDeceleration(); - _stopVelocityTimer(); + Map? actions, + }) { + _initializeKeyboardListener(); + _initializeTicker(); + if (actions != null) { + _actions.addAll(actions); + } + _initializeAccumulatedDeltas(); } - GestureType? _lastGestureType; + factory DelegateGestureHandler.fixedOrbit(ThermionViewer viewer) => + DelegateGestureHandler( + viewer: viewer, + cameraDelegate: FixedOrbitRotateCameraDelegate(viewer), + velocityDelegate: DefaultVelocityDelegate(), + ); + + factory DelegateGestureHandler.flight(ThermionViewer viewer) => + DelegateGestureHandler( + viewer: viewer, + cameraDelegate: FreeFlightCameraDelegate(viewer), + velocityDelegate: DefaultVelocityDelegate(), + actions: {GestureType.POINTER_MOVE: GestureAction.ROTATE_CAMERA}, + ); + + void _initializeAccumulatedDeltas() { + for (var gestureType in GestureType.values) { + _accumulatedDeltas[gestureType] = Offset.zero; + } + } + + void _initializeTicker() { + _ticker = Ticker(_onTick); + _ticker!.start(); + } + + void _onTick(Duration elapsed) async { + await _applyAccumulatedUpdates(); + } + + Future _applyAccumulatedUpdates() async { + for (var gestureType in GestureType.values) { + Offset delta = _accumulatedDeltas[gestureType] ?? Offset.zero; + if (delta != Offset.zero) { + velocityDelegate?.updateVelocity(delta); + + var action = _actions[gestureType]; + switch (action) { + case GestureAction.PAN_CAMERA: + await cameraDelegate?.pan(delta, velocityDelegate?.velocity); + break; + case GestureAction.ROTATE_CAMERA: + await cameraDelegate?.rotate(delta, velocityDelegate?.velocity); + break; + case GestureAction.NONE: + // Do nothing + break; + default: + _logger.warning("Unsupported gesture action: $action for type: $gestureType"); + break; + } + + _accumulatedDeltas[gestureType] = Offset.zero; + } + } + + if (_accumulatedScrollDelta != 0.0) { + await cameraDelegate?.zoom(_accumulatedScrollDelta, velocityDelegate?.velocity); + _accumulatedScrollDelta = 0.0; + } + } + + @override + Future onPointerDown(Offset localPosition, int buttons) async { + velocityDelegate?.stopDeceleration(); + _activePointers++; + if (buttons & kMiddleMouseButton != 0) { + _isMiddleMouseButtonPressed = true; + } + } @override - Future onPointerMove( - Offset localPosition, Offset delta, int buttons) async { - velocityDelegate?.updateVelocity(delta); - - GestureType gestureType; - if (buttons == kPrimaryMouseButton) { - gestureType = GestureType.POINTER1_MOVE; - } else if (buttons == kMiddleMouseButton) { - gestureType = GestureType.POINTER2_MOVE; + Future onPointerMove(Offset localPosition, Offset delta, int buttons) async { + GestureType gestureType = _getGestureTypeFromButtons(buttons); + if (gestureType == GestureType.MMB_HOLD_AND_MOVE || + (_actions[GestureType.POINTER_MOVE] == GestureAction.ROTATE_CAMERA && gestureType == GestureType.POINTER_MOVE)) { + _accumulatedDeltas[GestureType.MMB_HOLD_AND_MOVE] = (_accumulatedDeltas[GestureType.MMB_HOLD_AND_MOVE] ?? Offset.zero) + delta; } else { - throw Exception("Unsupported button: $buttons"); + _accumulatedDeltas[gestureType] = (_accumulatedDeltas[gestureType] ?? Offset.zero) + delta; } - - var action = _actions[gestureType]; - - switch (action) { - case GestureAction.PAN_CAMERA: - _currentState = ThermionGestureState.PANNING; - await panCameraDelegate?.panCamera(delta, velocityDelegate?.velocity); - case GestureAction.ROTATE_CAMERA: - _currentState = ThermionGestureState.ROTATING; - await rotateCameraDelegate?.rotateCamera( - delta, velocityDelegate?.velocity); - case null: - // ignore; - break; - default: - throw Exception("Unsupported gesture type : $gestureType "); - } - - _lastGestureType = gestureType; } @override Future onPointerUp(int buttons) async { - _currentState = ThermionGestureState.NULL; - velocityDelegate?.startDeceleration(); - _startVelocityTimer(); - } - - void _startVelocityTimer() { - _stopVelocityTimer(); // Ensure any existing timer is stopped - _velocityTimer = Timer.periodic(_velocityUpdateInterval, (timer) { - _applyVelocity(); - }); - } - - void _stopVelocityTimer() { - _velocityTimer?.cancel(); - _velocityTimer = null; - } - - Future _applyVelocity() async { - final velocity = velocityDelegate?.velocity; - if (velocity == null || velocity.length < 0.1) { - _stopVelocityTimer(); - return; + _activePointers--; + if (_activePointers == 0) { + velocityDelegate?.startDeceleration(); } - - final lastAction = _actions[_lastGestureType]; - switch (lastAction) { - case GestureAction.PAN_CAMERA: - await panCameraDelegate?.panCamera( - Offset(velocity.x, velocity.y), velocity); - case GestureAction.ROTATE_CAMERA: - await rotateCameraDelegate?.rotateCamera( - Offset(velocity.x, velocity.y), velocity); - default: - // Do nothing for other actions - break; + if (buttons & kMiddleMouseButton != 0) { + _isMiddleMouseButtonPressed = false; } + } - velocityDelegate?.updateVelocity(Offset(velocity.x, velocity.y)); // Gradually reduce velocity + GestureType _getGestureTypeFromButtons(int buttons) { + if (buttons & kPrimaryMouseButton != 0) return GestureType.LMB_HOLD_AND_MOVE; + if (buttons & kMiddleMouseButton != 0 || _isMiddleMouseButtonPressed) return GestureType.MMB_HOLD_AND_MOVE; + return GestureType.POINTER_MOVE; } @override - Future onPointerHover(Offset localPosition) async { - // TODO, currently noop + Future onPointerHover(Offset localPosition, Offset delta) async { + if (_actions[GestureType.POINTER_MOVE] == GestureAction.ROTATE_CAMERA) { + _accumulatedDeltas[GestureType.POINTER_MOVE] = (_accumulatedDeltas[GestureType.POINTER_MOVE] ?? Offset.zero) + delta; + } } - + @override Future onPointerScroll(Offset localPosition, double scrollDelta) async { - if (_currentState != ThermionGestureState.NULL) { - return; + if (_actions[GestureType.SCROLLWHEEL] != GestureAction.ZOOM_CAMERA) { + throw Exception("Unsupported action: ${_actions[GestureType.SCROLLWHEEL]}"); } - if (_actions[GestureType.POINTER_ZOOM] != GestureAction.ZOOM_CAMERA) { - throw Exception( - "Unsupported action : ${_actions[GestureType.POINTER_ZOOM]}"); - } - - _currentState = ThermionGestureState.ZOOMING; - try { - await zoomCameraDelegate?.zoomCamera( - scrollDelta, velocityDelegate?.velocity); + _accumulatedScrollDelta += scrollDelta; } catch (e) { - _logger.warning("Error during camera zoom: $e"); - } finally { - _currentState = ThermionGestureState.NULL; + _logger.warning("Error during scroll accumulation: $e"); } } @override void dispose() { - _stopVelocityTimer(); velocityDelegate?.dispose(); + _keyboardListenerDisposer?.call(); + _ticker?.dispose(); } @override @@ -170,12 +186,6 @@ class DelegateGestureHandler implements ThermionGestureHandler { @override Future onScaleUpdate() async {} - final _actions = { - GestureType.POINTER1_MOVE: GestureAction.PAN_CAMERA, - GestureType.POINTER2_MOVE: GestureAction.ROTATE_CAMERA, - GestureType.POINTER_ZOOM: GestureAction.ZOOM_CAMERA - }; - @override void setActionForType(GestureType gestureType, GestureAction gestureAction) { _actions[gestureType] = gestureAction; @@ -184,4 +194,22 @@ class DelegateGestureHandler implements ThermionGestureHandler { GestureAction? getActionForType(GestureType gestureType) { return _actions[gestureType]; } -} + + void _initializeKeyboardListener() { + HardwareKeyboard.instance.addHandler(_handleKeyEvent); + _keyboardListenerDisposer = () { + HardwareKeyboard.instance.removeHandler(_handleKeyEvent); + }; + } + + bool _handleKeyEvent(KeyEvent event) { + if (event is KeyDownEvent || event is KeyRepeatEvent) { + cameraDelegate?.onKeypress(event.physicalKey); + return true; + } else if (event is KeyUpEvent) { + cameraDelegate?.onKeyRelease(event.physicalKey); + return true; + } + return false; + } +} \ No newline at end of file diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart index 0f07aa24..f85a7935 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart @@ -1,17 +1,13 @@ import 'dart:ui'; - +import 'package:flutter/services.dart'; import 'package:vector_math/vector_math_64.dart'; -abstract class RotateCameraDelegate { - Future rotateCamera(Offset delta, Vector2? velocity); -} - -abstract class PanCameraDelegate { - Future panCamera(Offset delta, Vector2? velocity); -} - -abstract class ZoomCameraDelegate { - Future zoomCamera(double scrollDelta, Vector2? velocity); +abstract class CameraDelegate { + Future rotate(Offset delta, Vector2? velocity); + Future pan(Offset delta, Vector2? velocity); + Future zoom(double scrollDelta, Vector2? velocity); + Future onKeypress(PhysicalKeyboardKey key); + Future onKeyRelease(PhysicalKeyboardKey key); } abstract class VelocityDelegate { diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart index 15998b9d..24fb612e 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart @@ -1,45 +1,112 @@ +import 'dart:async'; import 'dart:ui'; +import 'package:flutter/src/services/keyboard_key.g.dart'; import 'package:flutter/widgets.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; import 'package:vector_math/vector_math_64.dart'; -class FixedOrbitRotateCameraDelegate implements RotateCameraDelegate { +class FixedOrbitRotateCameraDelegate implements CameraDelegate { final ThermionViewer viewer; static final _up = Vector3(0, 1, 0); static final _forward = Vector3(0, 0, -1); + static final Vector3 _right = Vector3(1, 0, 0); static const double _rotationSensitivity = 0.01; - FixedOrbitRotateCameraDelegate(this.viewer); + late DefaultZoomCameraDelegate _zoomCameraDelegate; + + Offset _accumulatedRotationDelta = Offset.zero; + double _accumulatedZoomDelta = 0.0; + + Timer? _updateTimer; + + FixedOrbitRotateCameraDelegate(this.viewer) { + _zoomCameraDelegate = DefaultZoomCameraDelegate(this.viewer); + _startUpdateTimer(); + } + + void _startUpdateTimer() { + _updateTimer = Timer.periodic(const Duration(milliseconds: 16), (_) { + _applyAccumulatedUpdates(); + }); + } + + void dispose() { + _updateTimer?.cancel(); + } @override - Future rotateCamera(Offset delta, Vector2? velocity) async { - double deltaX = delta.dx; - double deltaY = delta.dy; - deltaX *= _rotationSensitivity * viewer.pixelRatio; - deltaY *= _rotationSensitivity * viewer.pixelRatio; - - Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); - Vector3 currentPosition = currentModelMatrix.getTranslation(); - double distance = currentPosition.length; - Quaternion currentRotation = - Quaternion.fromRotation(currentModelMatrix.getRotation()); - - Quaternion yawRotation = Quaternion.axisAngle(_up, -deltaX); - Vector3 right = _up.cross(_forward)..normalize(); - Quaternion pitchRotation = Quaternion.axisAngle(right, -deltaY); - - Quaternion newRotation = currentRotation * yawRotation * pitchRotation; - newRotation.normalize(); - - Vector3 newPosition = _forward.clone() - ..applyQuaternion(newRotation) - ..scale(-distance); - - Matrix4 newModelMatrix = - Matrix4.compose(newPosition, newRotation, Vector3(1, 1, 1)); - await viewer.setCameraModelMatrix4(newModelMatrix); + Future rotate(Offset delta, Vector2? velocity) async { + _accumulatedRotationDelta += delta; } -} + + @override + Future pan(Offset delta, Vector2? velocity) { + throw UnimplementedError("Not supported in fixed orbit mode"); + } + + @override + Future zoom(double scrollDelta, Vector2? velocity) async { + _accumulatedZoomDelta += scrollDelta; + } + + Future _applyAccumulatedUpdates() async { + if (_accumulatedRotationDelta != Offset.zero || _accumulatedZoomDelta != 0.0) { + Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); + Vector3 currentPosition = currentModelMatrix.getTranslation(); + double distance = currentPosition.length; + Quaternion currentRotation = + Quaternion.fromRotation(currentModelMatrix.getRotation()); + + // Apply rotation + if (_accumulatedRotationDelta != Offset.zero) { + double deltaX = _accumulatedRotationDelta.dx * _rotationSensitivity * viewer.pixelRatio; + double deltaY = _accumulatedRotationDelta.dy * _rotationSensitivity * viewer.pixelRatio; + + Quaternion yawRotation = Quaternion.axisAngle(_up, -deltaX); + Quaternion pitchRotation = Quaternion.axisAngle(_right, -deltaY); + + currentRotation = currentRotation * yawRotation * pitchRotation; + currentRotation.normalize(); + + _accumulatedRotationDelta = Offset.zero; + } + + // Apply zoom + if (_accumulatedZoomDelta != 0.0) { + var zoomDistance = _zoomCameraDelegate.calculateZoomDistance( + _accumulatedZoomDelta, + null, + Vector3.zero() + ); + distance += zoomDistance; + distance = distance.clamp(0.1, 1000.0); // Adjust these limits as needed + + _accumulatedZoomDelta = 0.0; + } + + // Calculate new position + Vector3 newPosition = _forward.clone() + ..applyQuaternion(currentRotation) + ..scale(-distance); + + // Create and set new model matrix + Matrix4 newModelMatrix = + Matrix4.compose(newPosition, currentRotation, Vector3(1, 1, 1)); + await viewer.setCameraModelMatrix4(newModelMatrix); + } + } + + @override + Future onKeyRelease(PhysicalKeyboardKey key) async { + //ignore + } + + @override + Future onKeypress(PhysicalKeyboardKey key) async { + //ignore + } +} \ No newline at end of file diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart new file mode 100644 index 00000000..73bde712 --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart @@ -0,0 +1,207 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:flutter/scheduler.dart'; +import 'package:flutter/services.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; +import 'package:vector_math/vector_math_64.dart'; + +class FreeFlightCameraDelegate implements CameraDelegate { + final ThermionViewer viewer; + final bool lockPitch; + final bool lockYaw; + final bool lockRoll; + final Vector3? minBounds; + final Vector3? maxBounds; + + final double rotationSensitivity; + final double movementSensitivity; + final double zoomSensitivity; + final double panSensitivity; + final double keyMoveSensitivity; + + static final _up = Vector3(0, 1, 0); + static final _forward = Vector3(0, 0, -1); + static final Vector3 _right = Vector3(1, 0, 0); + + Offset _accumulatedRotation = Offset.zero; + Offset _accumulatedPan = Offset.zero; + double _accumulatedZoom = 0.0; + Vector2? _lastVelocity; + + Ticker? _ticker; + Timer? _moveTimer; + final Map _pressedKeys = {}; + + FreeFlightCameraDelegate( + this.viewer, { + this.lockPitch = false, + this.lockYaw = false, + this.lockRoll = false, + this.minBounds, + this.maxBounds, + this.rotationSensitivity = 0.001, + this.movementSensitivity = 0.1, + this.zoomSensitivity = 0.1, + this.panSensitivity = 0.01, + this.keyMoveSensitivity = 0.1, + }) { + _initializeTicker(); + _startMoveLoop(); + } + + void _initializeTicker() { + _ticker = Ticker(_onTick); + _ticker!.start(); + } + + void _startMoveLoop() { + _moveTimer = Timer.periodic( + Duration(milliseconds: 16), (_) => _processKeyboardInput()); + } + + void _onTick(Duration elapsed) { + _applyAccumulatedUpdates(); + } + + Future _applyAccumulatedUpdates() async { + if (_accumulatedRotation != Offset.zero || + _accumulatedPan != Offset.zero || + _accumulatedZoom != 0.0) { + Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); + Vector3 currentPosition = currentModelMatrix.getTranslation(); + Quaternion currentRotation = + Quaternion.fromRotation(currentModelMatrix.getRotation()); + + // Apply rotation + if (_accumulatedRotation != Offset.zero) { + double deltaX = lockYaw ? 0 : _accumulatedRotation.dx * rotationSensitivity * viewer.pixelRatio; + double deltaY = lockPitch ? 0 : _accumulatedRotation.dy * rotationSensitivity * viewer.pixelRatio; + double deltaZ = lockRoll ? 0 : (_accumulatedRotation.dx + _accumulatedRotation.dy) * rotationSensitivity * 0.5 * viewer.pixelRatio; + + Quaternion yawRotation = Quaternion.axisAngle(_up, -deltaX); + Quaternion pitchRotation = Quaternion.axisAngle(_right, -deltaY); + Quaternion rollRotation = Quaternion.axisAngle(_forward, deltaZ); + + currentRotation = currentRotation * yawRotation * pitchRotation * rollRotation; + currentRotation.normalize(); + + _accumulatedRotation = Offset.zero; + } + + // Apply pan + if (_accumulatedPan != Offset.zero) { + Vector3 right = _right.clone()..applyQuaternion(currentRotation); + Vector3 up = _up.clone()..applyQuaternion(currentRotation); + + double deltaX = _accumulatedPan.dx * panSensitivity * viewer.pixelRatio; + double deltaY = _accumulatedPan.dy * panSensitivity * viewer.pixelRatio; + + Vector3 newPosition = currentPosition + right * -deltaX + up * deltaY; + newPosition = _constrainPosition(newPosition); + + currentPosition = newPosition; + + _accumulatedPan = Offset.zero; + } + + // Apply zoom + if (_accumulatedZoom != 0.0) { + Vector3 forward = _forward.clone()..applyQuaternion(currentRotation); + Vector3 newPosition = currentPosition + forward * _accumulatedZoom * zoomSensitivity; + newPosition = _constrainPosition(newPosition); + + currentPosition = newPosition; + _accumulatedZoom = 0.0; + } + + Matrix4 newModelMatrix = + Matrix4.compose(currentPosition, currentRotation, Vector3(1, 1, 1)); + await viewer.setCameraModelMatrix4(newModelMatrix); + } + } + + Vector3 _constrainPosition(Vector3 position) { + if (minBounds != null) { + position.x = position.x.clamp(minBounds!.x, double.infinity); + position.y = position.y.clamp(minBounds!.y, double.infinity); + position.z = position.z.clamp(minBounds!.z, double.infinity); + } + if (maxBounds != null) { + position.x = position.x.clamp(double.negativeInfinity, maxBounds!.x); + position.y = position.y.clamp(double.negativeInfinity, maxBounds!.y); + position.z = position.z.clamp(double.negativeInfinity, maxBounds!.z); + } + return position; + } + + @override + Future rotate(Offset delta, Vector2? velocity) async { + _accumulatedRotation += delta; + _lastVelocity = velocity; + } + + @override + Future pan(Offset delta, Vector2? velocity) async { + _accumulatedPan += delta; + _lastVelocity = velocity; + } + + @override + Future zoom(double scrollDelta, Vector2? velocity) async { + _accumulatedZoom += scrollDelta; + _lastVelocity = velocity; + } + + @override + Future onKeypress(PhysicalKeyboardKey key) async { + _pressedKeys[key] = true; + } + + @override + Future onKeyRelease(PhysicalKeyboardKey key) async { + _pressedKeys.remove(key); + } + + Future _processKeyboardInput() async { + double dx = 0, dy = 0, dz = 0; + + if (_pressedKeys[PhysicalKeyboardKey.keyW] == true) + dz += keyMoveSensitivity; + if (_pressedKeys[PhysicalKeyboardKey.keyS] == true) + dz -= keyMoveSensitivity; + if (_pressedKeys[PhysicalKeyboardKey.keyA] == true) + dx -= keyMoveSensitivity; + if (_pressedKeys[PhysicalKeyboardKey.keyD] == true) + dx += keyMoveSensitivity; + + if (dx != 0 || dy != 0 || dz != 0) { + await _moveCamera(dx, dy, dz); + } + } + + Future _moveCamera(double dx, double dy, double dz) async { + Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); + Vector3 currentPosition = currentModelMatrix.getTranslation(); + Quaternion currentRotation = + Quaternion.fromRotation(currentModelMatrix.getRotation()); + + Vector3 forward = Vector3(0, 0, -1)..applyQuaternion(currentRotation); + Vector3 right = Vector3(1, 0, 0)..applyQuaternion(currentRotation); + Vector3 up = Vector3(0, 1, 0)..applyQuaternion(currentRotation); + + Vector3 moveOffset = right * dx + up * dy + forward * dz; + Vector3 newPosition = currentPosition + moveOffset; + newPosition = _constrainPosition(newPosition); + + Matrix4 newModelMatrix = + Matrix4.compose(newPosition, currentRotation, Vector3(1, 1, 1)); + await viewer.setCameraModelMatrix4(newModelMatrix); + } + + void dispose() { + _ticker?.dispose(); + _moveTimer?.cancel(); + } +} \ No newline at end of file From b73d0e1e9699453d8778dd839be01a29cf81969d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Mon, 16 Sep 2024 11:07:54 +0800 Subject: [PATCH 154/232] restructure viewer/types/helper folders, remove old WASM/web FFI interop, add SceneUpdated stream --- .../compatibility/compatibility.dart | 1 - .../compatibility/web/ffi/allocator.dart | 238 --- .../web/ffi/compatibility_ffi.dart | 118 -- .../compatibility/web/ffi/interop.dart | 16 - .../web/ffi/thermion_dart.g.dart | 1792 ----------------- .../lib/thermion_dart/entities/gizmo.dart | 3 +- thermion_dart/lib/thermion_dart/scene.dart | 259 ++- .../lib/thermion_dart/scene_impl.dart | 125 -- .../lib/thermion_dart/thermion_viewer.dart | 889 +------- .../thermion_dart/utils/dart_resources.dart | 4 +- .../geometry.dart} | 116 +- .../thermion_dart/utils/light_options.dart | 29 - .../{matrix_helper.dart => utils/matrix.dart} | 2 +- .../thermion_dart/utils/using_pointer.dart | 10 - .../lib/thermion_dart/viewer/events.dart | 86 + .../ffi/callbacks.dart} | 6 +- .../ffi}/thermion_dart.g.dart | 0 .../{ => viewer/ffi}/thermion_viewer_ffi.dart | 131 +- .../viewer/shared_types/entities.dart | 9 + .../viewer/shared_types/entity.dart | 0 .../viewer/shared_types/geometry.dart | 19 + .../viewer/shared_types/gltf.dart | 6 + .../viewer/shared_types/light.dart | 7 + .../viewer/shared_types/light_options.dart | 56 + .../viewer/shared_types/manipulator.dart | 4 + .../viewer/shared_types/pick_result.dart | 4 + .../viewer/shared_types/primitive.dart | 10 + .../viewer/shared_types/shadow.dart | 6 + .../viewer/shared_types/shared_types.dart | 10 + .../viewer/shared_types/texture_details.dart | 14 + .../viewer/shared_types/tone_mapper.dart | 1 + .../viewer/thermion_viewer_base.dart | 856 ++++++++ .../{ => viewer}/thermion_viewer_stub.dart | 46 +- .../web}/thermion_viewer_dart_bridge.dart | 6 +- .../web}/thermion_viewer_js.dart | 95 +- .../web}/thermion_viewer_js_shim.dart | 0 .../web}/thermion_viewer_wasm.dart | 82 +- 37 files changed, 1675 insertions(+), 3381 deletions(-) delete mode 100644 thermion_dart/lib/thermion_dart/compatibility/compatibility.dart delete mode 100644 thermion_dart/lib/thermion_dart/compatibility/web/ffi/allocator.dart delete mode 100644 thermion_dart/lib/thermion_dart/compatibility/web/ffi/compatibility_ffi.dart delete mode 100644 thermion_dart/lib/thermion_dart/compatibility/web/ffi/interop.dart delete mode 100644 thermion_dart/lib/thermion_dart/compatibility/web/ffi/thermion_dart.g.dart delete mode 100644 thermion_dart/lib/thermion_dart/scene_impl.dart rename thermion_dart/lib/thermion_dart/{geometry_helper.dart => utils/geometry.dart} (72%) delete mode 100644 thermion_dart/lib/thermion_dart/utils/light_options.dart rename thermion_dart/lib/thermion_dart/{matrix_helper.dart => utils/matrix.dart} (89%) delete mode 100644 thermion_dart/lib/thermion_dart/utils/using_pointer.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/events.dart rename thermion_dart/lib/thermion_dart/{compatibility/native/compatibility.dart => viewer/ffi/callbacks.dart} (95%) rename thermion_dart/lib/thermion_dart/{compatibility/native => viewer/ffi}/thermion_dart.g.dart (100%) rename thermion_dart/lib/thermion_dart/{ => viewer/ffi}/thermion_viewer_ffi.dart (94%) create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/entity.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/gltf.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/light.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/manipulator.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/pick_result.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/primitive.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/shadow.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/shared_types.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/texture_details.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/tone_mapper.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart rename thermion_dart/lib/thermion_dart/{ => viewer}/thermion_viewer_stub.dart (95%) rename thermion_dart/lib/thermion_dart/{compatibility/web/interop => viewer/web}/thermion_viewer_dart_bridge.dart (99%) rename thermion_dart/lib/thermion_dart/{compatibility/web/interop => viewer/web}/thermion_viewer_js.dart (90%) rename thermion_dart/lib/thermion_dart/{compatibility/web/interop => viewer/web}/thermion_viewer_js_shim.dart (100%) rename thermion_dart/lib/thermion_dart/{compatibility/web/interop => viewer/web}/thermion_viewer_wasm.dart (96%) diff --git a/thermion_dart/lib/thermion_dart/compatibility/compatibility.dart b/thermion_dart/lib/thermion_dart/compatibility/compatibility.dart deleted file mode 100644 index a8435873..00000000 --- a/thermion_dart/lib/thermion_dart/compatibility/compatibility.dart +++ /dev/null @@ -1 +0,0 @@ -export 'native/compatibility.dart'; diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/ffi/allocator.dart b/thermion_dart/lib/thermion_dart/compatibility/web/ffi/allocator.dart deleted file mode 100644 index 41d8f6d8..00000000 --- a/thermion_dart/lib/thermion_dart/compatibility/web/ffi/allocator.dart +++ /dev/null @@ -1,238 +0,0 @@ -import 'dart:ffi'; -export "allocator.dart"; -export "thermion_dart.g.dart"; - -import 'dart:convert'; -import 'dart:ffi' as ffi hide Uint8Pointer, FloatPointer; -import 'dart:typed_data'; - -import 'package:thermion_dart/thermion_dart/compatibility/web/ffi/thermion_dart.g.dart'; - -import 'package:ffi/ffi.dart'; -export 'package:ffi/ffi.dart' hide StringUtf8Pointer, Utf8Pointer; -export 'dart:ffi' - hide - Uint8Pointer, - FloatPointer, - DoublePointer, - Int32Pointer, - Int64Pointer, - PointerPointer, - Allocator; - -class Allocator implements ffi.Allocator { - const Allocator(); - @override - ffi.Pointer allocate(int byteCount, - {int? alignment}) { - return thermion_flutter_web_allocate(byteCount).cast(); - } - - @override - void free(ffi.Pointer pointer) { - thermion_flutter_web_free(pointer.cast()); - } -} - -extension CharPointer on ffi.Pointer { - int get value { - return thermion_flutter_web_get(this, 0); - } - - set value(int value) { - thermion_flutter_web_set(this, 0, value); - } - - void operator []=(int index, int value) { - this.elementAt(index).value = value; - } - - ffi.Pointer elementAt(int index) => - ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); -} - -extension IntPointer on ffi.Pointer { - int get value { - return thermion_flutter_web_get_int32(this.cast(), 0); - } - - set value(int value) { - thermion_flutter_web_set_int32(this.cast(), 0, value); - } - - void operator []=(int index, int value) { - this.elementAt(index).value = value; - } - - int operator [](int index) { - return this.elementAt(index).value; - } - - ffi.Pointer elementAt(int index) => - ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); -} - -extension Int32Pointer on ffi.Pointer { - int get value { - return thermion_flutter_web_get_int32(this, 0); - } - - set value(int value) { - thermion_flutter_web_set_int32(this, 0, value); - } - - void operator []=(int index, int value) { - this.elementAt(index).value = value; - } - - int operator [](int index) { - return this.elementAt(index).value; - } - - ffi.Pointer elementAt(int index) => - ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); -} - -extension UInt8Pointer on ffi.Pointer { - int get value { - return thermion_flutter_web_get(this.cast(), 0); - } - - set value(int value) { - thermion_flutter_web_set(this.cast(), 0, value); - } - - void operator []=(int index, int value) { - this.elementAt(index).value = value; - } - - int operator [](int index) { - return this.elementAt(index).value; - } - - ffi.Pointer elementAt(int index) => - ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); -} - -extension PointerPointer - on ffi.Pointer> { - ffi.Pointer get value { - return thermion_flutter_web_get_pointer(cast>(), 0) - .cast(); - } - - set value(ffi.Pointer value) { - thermion_flutter_web_set_pointer( - cast>(), 0, value.cast()); - } - - - ffi.Pointer operator [](int index) { - return this.elementAt(index).value; - } - - void operator []=(int index, ffi.Pointer value) { - this.elementAt(index).value = value; - } - - ffi.Pointer> elementAt(int index) => - ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); -} - -extension FloatPointer on ffi.Pointer { - double get value { - return thermion_flutter_web_get_float(this, 0); - } - - set value(double value) { - thermion_flutter_web_set_float(this, 0, value); - } - - double operator [](int index) { - return this.elementAt(index).value; - } - - void operator []=(int index, double value) { - this.elementAt(index).value = value; - } - - ffi.Pointer elementAt(int index) => - ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); - - Float32List asTypedList(int length) { - var list = Float32List(length); - - for (int i = 0; i < length; i++) { - list[i] = this[i]; - } - return list; - } -} - -extension StringConversion on String { - ffi.Pointer toNativeUtf8({ffi.Allocator? allocator}) { - final units = utf8.encode(this); - final ffi.Pointer result = - allocator!(units.length + 1); - for (int i = 0; i < units.length; i++) { - result.elementAt(i).value = units[i]; - } - result.elementAt(units.length).value = 0; - return result.cast(); - } -} - -extension StringUtf8Pointer on ffi.Pointer { - static int _length(ffi.Pointer codeUnits) { - var length = 0; - while (codeUnits[length] != 0) { - length++; - } - return length; - } - - String toDartString({int? length}) { - final codeUnits = this.cast(); - final list = []; - - if (length != null) { - RangeError.checkNotNegative(length, 'length'); - } else { - length = _length(codeUnits); - } - for (int i = 0; i < length; i++) { - list.add(codeUnits.elementAt(i).value); - } - return utf8.decode(list); - } -} - -extension DoublePointer on ffi.Pointer { - double get value { - return thermion_flutter_web_get_double(this, 0); - } - - set value(double value) { - return thermion_flutter_web_set_double(this, 0, value); - } - - Float64List asTypedList(int length) { - var list = Float64List(length); - - for (int i = 0; i < length; i++) { - list[i] = elementAt(i).value; - } - return list; - } - - double operator [](int index) { - return elementAt(index).value; - } - - void operator []=(int index, double value) { - elementAt(index).value = value; - } - - ffi.Pointer elementAt(int index) => - ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); -} diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/ffi/compatibility_ffi.dart b/thermion_dart/lib/thermion_dart/compatibility/web/ffi/compatibility_ffi.dart deleted file mode 100644 index e9242cc2..00000000 --- a/thermion_dart/lib/thermion_dart/compatibility/web/ffi/compatibility_ffi.dart +++ /dev/null @@ -1,118 +0,0 @@ -import 'dart:async'; -import 'dart:js_interop'; -import 'package:thermion_dart/thermion_dart/compatibility/web/ffi/interop.dart'; - -import "allocator.dart"; - -export "allocator.dart"; -export "thermion_dart.g.dart"; - -export 'package:ffi/ffi.dart' hide StringUtf8Pointer, Utf8Pointer; -export 'dart:ffi' - hide - Uint8Pointer, - FloatPointer, - DoublePointer, - Int32Pointer, - Int64Pointer, - PointerPointer, - Allocator; - -const allocator = Allocator(); - -@AbiSpecificIntegerMapping({ - Abi.androidArm: Uint8(), - Abi.androidArm64: Uint8(), - Abi.androidIA32: Int8(), - Abi.androidX64: Int8(), - Abi.androidRiscv64: Uint8(), - Abi.fuchsiaArm64: Uint8(), - Abi.fuchsiaX64: Int8(), - Abi.fuchsiaRiscv64: Uint8(), - Abi.iosArm: Int8(), - Abi.iosArm64: Int8(), - Abi.iosX64: Int8(), - Abi.linuxArm: Uint8(), - Abi.linuxArm64: Uint8(), - Abi.linuxIA32: Int8(), - Abi.linuxX64: Int8(), - Abi.linuxRiscv32: Uint8(), - Abi.linuxRiscv64: Uint8(), - Abi.macosArm64: Int8(), - Abi.macosX64: Int8(), - Abi.windowsArm64: Int8(), - Abi.windowsIA32: Int8(), - Abi.windowsX64: Int8(), -}) -final class FooChar extends AbiSpecificInteger { - const FooChar(); -} - -class Compatibility { - final _foo = FooChar(); -} - -Future withVoidCallback( - Function(Pointer>) func) async { - JSArray retVal = createVoidCallback(); - var promise = retVal.toDart[0] as JSPromise; - var fnPtrAddress = retVal.toDart[1] as JSNumber; - var fnPtr = Pointer>.fromAddress( - fnPtrAddress.toDartInt); - func(fnPtr); - await promise.toDart; -} - -Future withVoidPointerCallback( - void Function(Pointer)>>) - func) async { - JSArray retVal = createVoidPointerCallback(); - var promise = retVal.toDart[0] as JSPromise; - - var fnPtrAddress = retVal.toDart[1] as JSNumber; - var fnPtr = Pointer)>>.fromAddress( - fnPtrAddress.toDartInt); - func(fnPtr); - final addr = await promise.toDart; - return addr.toDartInt; -} - -Future withBoolCallback( - Function(Pointer>) func) async { - JSArray retVal = createBoolCallback(); - var promise = retVal.toDart[0] as JSPromise; - - var fnPtrAddress = retVal.toDart[1] as JSNumber; - var fnPtr = Pointer>.fromAddress( - fnPtrAddress.toDartInt); - func(fnPtr); - final addr = await promise.toDart; - return addr.toDart; -} - -Future withIntCallback( - Function(Pointer>) func) async { - JSArray retVal = createBoolCallback(); - var promise = retVal.toDart[0] as JSPromise; - - var fnPtrAddress = retVal.toDart[1] as JSNumber; - var fnPtr = Pointer>.fromAddress( - fnPtrAddress.toDartInt); - func(fnPtr); - final addr = await promise.toDart; - return addr.toDartInt; -} - -Future withCharPtrCallback( - Function(Pointer)>>) - func) async { - JSArray retVal = createVoidPointerCallback(); - var promise = retVal.toDart[0] as JSPromise; - - var fnPtrAddress = retVal.toDart[1] as JSNumber; - var fnPtr = Pointer)>>.fromAddress( - fnPtrAddress.toDartInt); - func(fnPtr); - final addr = await promise.toDart; - return Pointer.fromAddress(addr.toDartInt).toDartString(); -} diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/ffi/interop.dart b/thermion_dart/lib/thermion_dart/compatibility/web/ffi/interop.dart deleted file mode 100644 index 4773d252..00000000 --- a/thermion_dart/lib/thermion_dart/compatibility/web/ffi/interop.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'dart:js_interop'; - -@JS() -external JSArray createIntCallback(); - -@JS() -external JSArray createBoolCallback(); - -@JS() -external JSArray createVoidPointerCallback(); - -@JS() -external JSArray createVoidCallback(); - - - diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/web/ffi/thermion_dart.g.dart deleted file mode 100644 index c1bf6de3..00000000 --- a/thermion_dart/lib/thermion_dart/compatibility/web/ffi/thermion_dart.g.dart +++ /dev/null @@ -1,1792 +0,0 @@ -// AUTO GENERATED FILE, DO NOT EDIT. -// -// Generated by `package:ffigen`. -// ignore_for_file: type=lint -import 'dart:ffi' as ffi; - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Int32, ffi.Pointer)>( - symbol: '_thermion_flutter_web_load_resource_callback', - assetId: 'thermion_dart') -external void thermion_flutter_web_load_resource_callback( - ffi.Pointer data, - int length, - ffi.Pointer context, -); - -@ffi.Native, ffi.Int32)>( - symbol: '_thermion_flutter_web_get', assetId: 'thermion_dart') -external int thermion_flutter_web_get( - ffi.Pointer ptr, - int offset, -); - -@ffi.Native, ffi.Int32)>( - symbol: '_thermion_flutter_web_get_float', assetId: 'thermion_dart') -external double thermion_flutter_web_get_float( - ffi.Pointer ptr, - int offset, -); - -@ffi.Native, ffi.Int32)>( - symbol: '_thermion_flutter_web_get_double', assetId: 'thermion_dart') -external double thermion_flutter_web_get_double( - ffi.Pointer ptr, - int offset, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer>, ffi.Int32)>( - symbol: '_thermion_flutter_web_get_pointer', assetId: 'thermion_dart') -external ffi.Pointer thermion_flutter_web_get_pointer( - ffi.Pointer> ptr, - int offset, -); - -@ffi.Native, ffi.Int32, ffi.Int32)>( - symbol: '_thermion_flutter_web_set', assetId: 'thermion_dart') -external void thermion_flutter_web_set( - ffi.Pointer ptr, - int offset, - int val, -); - -@ffi.Native, ffi.Int32, ffi.Float)>( - symbol: '_thermion_flutter_web_set_float', assetId: 'thermion_dart') -external void thermion_flutter_web_set_float( - ffi.Pointer ptr, - int offset, - double val, -); - -@ffi.Native, ffi.Int32, ffi.Double)>( - symbol: '_thermion_flutter_web_set_double', assetId: 'thermion_dart') -external void thermion_flutter_web_set_double( - ffi.Pointer ptr, - int offset, - double val, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer>, ffi.Int32, - ffi.Pointer)>( - symbol: '_thermion_flutter_web_set_pointer', assetId: 'thermion_dart') -external void thermion_flutter_web_set_pointer( - ffi.Pointer> ptr, - int offset, - ffi.Pointer val, -); - -@ffi.Native, ffi.Int32)>( - symbol: '_thermion_flutter_web_get_int32', assetId: 'thermion_dart') -external int thermion_flutter_web_get_int32( - ffi.Pointer ptr, - int offset, -); - -@ffi.Native, ffi.Int32, ffi.Int32)>( - symbol: '_thermion_flutter_web_set_int32', assetId: 'thermion_dart') -external void thermion_flutter_web_set_int32( - ffi.Pointer ptr, - int offset, - int value, -); - -@ffi.Native>)>( - symbol: '_thermion_flutter_web_get_address', assetId: 'thermion_dart') -external int thermion_flutter_web_get_address( - ffi.Pointer> out, -); - -@ffi.Native Function(ffi.Int32)>( - symbol: '_thermion_flutter_web_allocate', assetId: 'thermion_dart') -external ffi.Pointer thermion_flutter_web_allocate( - int size, -); - -@ffi.Native)>( - symbol: '_thermion_flutter_web_free', assetId: 'thermion_dart') -external void thermion_flutter_web_free( - ffi.Pointer ptr, -); - -@ffi.Native( - symbol: '_thermion_dart_web_create_gl_context', assetId: 'thermion_dart') -external int thermion_dart_web_create_gl_context(); - -@ffi.Native Function()>( - symbol: '_thermion_dart_web_get_resource_loader_wrapper', - assetId: 'thermion_dart') -external ffi.Pointer thermion_dart_web_get_resource_loader_wrapper(); - -@ffi.Native< - ffi.Pointer Function(LoadFilamentResourceFromOwner, - FreeFilamentResourceFromOwner, ffi.Pointer)>( - symbol: '_make_resource_loader', assetId: 'thermion_dart') -external ffi.Pointer make_resource_loader( - LoadFilamentResourceFromOwner loadFn, - FreeFilamentResourceFromOwner freeFn, - ffi.Pointer owner, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>( - symbol: '_create_filament_viewer', assetId: 'thermion_dart') -external ffi.Pointer create_filament_viewer( - ffi.Pointer context, - ffi.Pointer loader, - ffi.Pointer platform, - ffi.Pointer uberArchivePath, -); - -@ffi.Native)>( - symbol: '_destroy_filament_viewer', assetId: 'thermion_dart') -external void destroy_filament_viewer( - ffi.Pointer viewer, -); - -@ffi.Native Function(ffi.Pointer)>( - symbol: '_get_scene_manager', assetId: 'thermion_dart') -external ffi.Pointer get_scene_manager( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.IntPtr, ffi.Uint32, - ffi.Uint32)>(symbol: '_create_render_target', assetId: 'thermion_dart') -external void create_render_target( - ffi.Pointer viewer, - int texture, - int width, - int height, -); - -@ffi.Native)>( - symbol: '_clear_background_image', assetId: 'thermion_dart') -external void clear_background_image( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Bool)>(symbol: '_set_background_image', assetId: 'thermion_dart') -external void set_background_image( - ffi.Pointer viewer, - ffi.Pointer path, - bool fillHeight, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>( - symbol: '_set_background_image_position', assetId: 'thermion_dart') -external void set_background_image_position( - ffi.Pointer viewer, - double x, - double y, - bool clamp, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, - ffi.Float)>(symbol: '_set_background_color', assetId: 'thermion_dart') -external void set_background_color( - ffi.Pointer viewer, - double r, - double g, - double b, - double a, -); - -@ffi.Native, ffi.Int)>( - symbol: '_set_tone_mapping', assetId: 'thermion_dart') -external void set_tone_mapping( - ffi.Pointer viewer, - int toneMapping, -); - -@ffi.Native, ffi.Float)>( - symbol: '_set_bloom', assetId: 'thermion_dart') -external void set_bloom( - ffi.Pointer viewer, - double strength, -); - -@ffi.Native, ffi.Pointer)>( - symbol: '_load_skybox', assetId: 'thermion_dart') -external void load_skybox( - ffi.Pointer viewer, - ffi.Pointer skyboxPath, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Float)>(symbol: '_load_ibl', assetId: 'thermion_dart') -external void load_ibl( - ffi.Pointer viewer, - ffi.Pointer iblPath, - double intensity, -); - -@ffi.Native, ffi.Pointer)>( - symbol: '_rotate_ibl', assetId: 'thermion_dart') -external void rotate_ibl( - ffi.Pointer viewer, - ffi.Pointer rotationMatrix, -); - -@ffi.Native)>( - symbol: '_remove_skybox', assetId: 'thermion_dart') -external void remove_skybox( - ffi.Pointer viewer, -); - -@ffi.Native)>( - symbol: '_remove_ibl', assetId: 'thermion_dart') -external void remove_ibl( - ffi.Pointer viewer, -); - -@ffi.Native< - EntityId Function( - ffi.Pointer, - ffi.Uint8, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Bool)>(symbol: '_add_light', assetId: 'thermion_dart') -external int add_light( - ffi.Pointer viewer, - int type, - double colour, - double intensity, - double posX, - double posY, - double posZ, - double dirX, - double dirY, - double dirZ, - double falloffRadius, - double spotLightConeInner, - double spotLightConeOuter, - double sunAngularRadius, - double sunHaloSize, - double sunHaloFallof, - bool shadows, -); - -@ffi.Native, EntityId)>( - symbol: '_remove_light', assetId: 'thermion_dart') -external void remove_light( - ffi.Pointer viewer, - int entityId, -); - -@ffi.Native)>( - symbol: '_clear_lights', assetId: 'thermion_dart') -external void clear_lights( - ffi.Pointer viewer, -); - -@ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, - ffi.Int)>(symbol: '_load_glb', assetId: 'thermion_dart') -external int load_glb( - ffi.Pointer sceneManager, - ffi.Pointer assetPath, - int numInstances, -); - -@ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, - ffi.Size)>(symbol: '_load_glb_from_buffer', assetId: 'thermion_dart') -external int load_glb_from_buffer( - ffi.Pointer sceneManager, - ffi.Pointer data, - int length, -); - -@ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer)>(symbol: '_load_gltf', assetId: 'thermion_dart') -external int load_gltf( - ffi.Pointer sceneManager, - ffi.Pointer assetPath, - ffi.Pointer relativePath, -); - -@ffi.Native, EntityId)>( - symbol: '_create_instance', assetId: 'thermion_dart') -external int create_instance( - ffi.Pointer sceneManager, - int id, -); - -@ffi.Native, EntityId)>( - symbol: '_get_instance_count', assetId: 'thermion_dart') -external int get_instance_count( - ffi.Pointer sceneManager, - int entityId, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Pointer)>( - symbol: '_get_instances', assetId: 'thermion_dart') -external void get_instances( - ffi.Pointer sceneManager, - int entityId, - ffi.Pointer out, -); - -@ffi.Native)>( - symbol: '_set_main_camera', assetId: 'thermion_dart') -external void set_main_camera( - ffi.Pointer viewer, -); - -@ffi.Native)>( - symbol: '_get_main_camera', assetId: 'thermion_dart') -external int get_main_camera( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Bool Function(ffi.Pointer, EntityId, - ffi.Pointer)>(symbol: '_set_camera', assetId: 'thermion_dart') -external bool set_camera( - ffi.Pointer viewer, - int entity, - ffi.Pointer nodeName, -); - -@ffi.Native, ffi.Bool)>( - symbol: '_set_view_frustum_culling', assetId: 'thermion_dart') -external void set_view_frustum_culling( - ffi.Pointer viewer, - bool enabled, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Uint64, - ffi.Pointer, - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer buf, ffi.Size size, - ffi.Pointer data)>>, - ffi.Pointer)>(symbol: '_render', assetId: 'thermion_dart') -external void render( - ffi.Pointer viewer, - int frameTimeInNanos, - ffi.Pointer pixelBuffer, - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer buf, ffi.Size size, - ffi.Pointer data)>> - callback, - ffi.Pointer data, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Uint32, - ffi.Uint32)>(symbol: '_create_swap_chain', assetId: 'thermion_dart') -external void create_swap_chain( - ffi.Pointer viewer, - ffi.Pointer window, - int width, - int height, -); - -@ffi.Native)>( - symbol: '_destroy_swap_chain', assetId: 'thermion_dart') -external void destroy_swap_chain( - ffi.Pointer viewer, -); - -@ffi.Native, ffi.Float)>( - symbol: '_set_frame_interval', assetId: 'thermion_dart') -external void set_frame_interval( - ffi.Pointer viewer, - double interval, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Uint32, ffi.Uint32, ffi.Float)>( - symbol: '_update_viewport_and_camera_projection', assetId: 'thermion_dart') -external void update_viewport_and_camera_projection( - ffi.Pointer viewer, - int width, - int height, - double scaleFactor, -); - -@ffi.Native)>( - symbol: '_scroll_begin', assetId: 'thermion_dart') -external void scroll_begin( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, - ffi.Float)>(symbol: '_scroll_update', assetId: 'thermion_dart') -external void scroll_update( - ffi.Pointer viewer, - double x, - double y, - double z, -); - -@ffi.Native)>( - symbol: '_scroll_end', assetId: 'thermion_dart') -external void scroll_end( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, - ffi.Bool)>(symbol: '_grab_begin', assetId: 'thermion_dart') -external void grab_begin( - ffi.Pointer viewer, - double x, - double y, - bool pan, -); - -@ffi.Native, ffi.Float, ffi.Float)>( - symbol: '_grab_update', assetId: 'thermion_dart') -external void grab_update( - ffi.Pointer viewer, - double x, - double y, -); - -@ffi.Native)>( - symbol: '_grab_end', assetId: 'thermion_dart') -external void grab_end( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Pointer, - ffi.Pointer, - ffi.Int)>(symbol: '_apply_weights', assetId: 'thermion_dart') -external void apply_weights( - ffi.Pointer sceneManager, - int entity, - ffi.Pointer entityName, - ffi.Pointer weights, - int count, -); - -@ffi.Native< - ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Int)>(symbol: '_set_morph_target_weights', assetId: 'thermion_dart') -external bool set_morph_target_weights( - ffi.Pointer sceneManager, - int entity, - ffi.Pointer morphData, - int numWeights, -); - -@ffi.Native< - ffi.Bool Function( - ffi.Pointer, - EntityId, - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Float)>(symbol: '_set_morph_animation', assetId: 'thermion_dart') -external bool set_morph_animation( - ffi.Pointer sceneManager, - int entity, - ffi.Pointer morphData, - ffi.Pointer morphIndices, - int numMorphTargets, - int numFrames, - double frameLengthInMs, -); - -@ffi.Native, EntityId)>( - symbol: '_reset_to_rest_pose', assetId: 'thermion_dart') -external void reset_to_rest_pose( - ffi.Pointer sceneManager, - int asset, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Int, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float)>(symbol: '_add_bone_animation', assetId: 'thermion_dart') -external void add_bone_animation( - ffi.Pointer sceneManager, - int entity, - int skinIndex, - int boneIndex, - ffi.Pointer frameData, - int numFrames, - double frameLengthInMs, - double fadeOutInSecs, - double fadeInInSecs, - double maxDelta, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Pointer)>( - symbol: '_get_local_transform', assetId: 'thermion_dart') -external void get_local_transform( - ffi.Pointer sceneManager, - int entityId, - ffi.Pointer arg2, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Int, - ffi.Pointer, - ffi.Int)>(symbol: '_get_rest_local_transforms', assetId: 'thermion_dart') -external void get_rest_local_transforms( - ffi.Pointer sceneManager, - int entityId, - int skinIndex, - ffi.Pointer out, - int numBones, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Pointer)>( - symbol: '_get_world_transform', assetId: 'thermion_dart') -external void get_world_transform( - ffi.Pointer sceneManager, - int entityId, - ffi.Pointer arg2, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, - ffi.Pointer)>( - symbol: '_get_inverse_bind_matrix', assetId: 'thermion_dart') -external void get_inverse_bind_matrix( - ffi.Pointer sceneManager, - int entityId, - int skinIndex, - int boneIndex, - ffi.Pointer arg4, -); - -@ffi.Native< - ffi.Bool Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, - ffi.Pointer)>( - symbol: '_set_bone_transform', assetId: 'thermion_dart') -external bool set_bone_transform( - ffi.Pointer sceneManager, - int entity, - int skinIndex, - int boneIndex, - ffi.Pointer transform, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Int, - ffi.Bool, - ffi.Bool, - ffi.Bool, - ffi.Float)>(symbol: '_play_animation', assetId: 'thermion_dart') -external void play_animation( - ffi.Pointer sceneManager, - int entity, - int index, - bool loop, - bool reverse, - bool replaceActive, - double crossfade, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>( - symbol: '_set_animation_frame', assetId: 'thermion_dart') -external void set_animation_frame( - ffi.Pointer sceneManager, - int entity, - int animationIndex, - int animationFrame, -); - -@ffi.Native, EntityId, ffi.Int)>( - symbol: '_stop_animation', assetId: 'thermion_dart') -external void stop_animation( - ffi.Pointer sceneManager, - int entity, - int index, -); - -@ffi.Native, EntityId)>( - symbol: '_get_animation_count', assetId: 'thermion_dart') -external int get_animation_count( - ffi.Pointer sceneManager, - int asset, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Int)>(symbol: '_get_animation_name', assetId: 'thermion_dart') -external void get_animation_name( - ffi.Pointer sceneManager, - int entity, - ffi.Pointer outPtr, - int index, -); - -@ffi.Native, EntityId, ffi.Int)>( - symbol: '_get_animation_duration', assetId: 'thermion_dart') -external double get_animation_duration( - ffi.Pointer sceneManager, - int entity, - int index, -); - -@ffi.Native, EntityId, ffi.Int)>( - symbol: '_get_bone_count', assetId: 'thermion_dart') -external int get_bone_count( - ffi.Pointer sceneManager, - int assetEntity, - int skinIndex, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Pointer>, - ffi.Int)>(symbol: '_get_bone_names', assetId: 'thermion_dart') -external void get_bone_names( - ffi.Pointer sceneManager, - int assetEntity, - ffi.Pointer> outPtr, - int skinIndex, -); - -@ffi.Native< - EntityId Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>( - symbol: '_get_bone', assetId: 'thermion_dart') -external int get_bone( - ffi.Pointer sceneManager, - int entityId, - int skinIndex, - int boneIndex, -); - -@ffi.Native< - ffi.Bool Function( - ffi.Pointer, EntityId, ffi.Pointer)>( - symbol: '_set_transform', assetId: 'thermion_dart') -external bool set_transform( - ffi.Pointer sceneManager, - int entityId, - ffi.Pointer transform, -); - -@ffi.Native, EntityId)>( - symbol: '_update_bone_matrices', assetId: 'thermion_dart') -external bool update_bone_matrices( - ffi.Pointer sceneManager, - int entityId, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - EntityId, - ffi.Pointer, - ffi.Int)>(symbol: '_get_morph_target_name', assetId: 'thermion_dart') -external void get_morph_target_name( - ffi.Pointer sceneManager, - int assetEntity, - int childEntity, - ffi.Pointer outPtr, - int index, -); - -@ffi.Native, EntityId, EntityId)>( - symbol: '_get_morph_target_name_count', assetId: 'thermion_dart') -external int get_morph_target_name_count( - ffi.Pointer sceneManager, - int assetEntity, - int childEntity, -); - -@ffi.Native, EntityId)>( - symbol: '_remove_entity', assetId: 'thermion_dart') -external void remove_entity( - ffi.Pointer viewer, - int asset, -); - -@ffi.Native)>( - symbol: '_clear_entities', assetId: 'thermion_dart') -external void clear_entities( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Bool Function( - ffi.Pointer, - EntityId, - ffi.Pointer, - ffi.Int, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float)>(symbol: '_set_material_color', assetId: 'thermion_dart') -external bool set_material_color( - ffi.Pointer sceneManager, - int entity, - ffi.Pointer meshName, - int materialIndex, - double r, - double g, - double b, - double a, -); - -@ffi.Native, EntityId)>( - symbol: '_transform_to_unit_cube', assetId: 'thermion_dart') -external void transform_to_unit_cube( - ffi.Pointer sceneManager, - int asset, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Bool)>(symbol: '_queue_position_update', assetId: 'thermion_dart') -external void queue_position_update( - ffi.Pointer sceneManager, - int entity, - double x, - double y, - double z, - bool relative, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Bool)>(symbol: '_queue_rotation_update', assetId: 'thermion_dart') -external void queue_rotation_update( - ffi.Pointer sceneManager, - int entity, - double rads, - double x, - double y, - double z, - double w, - bool relative, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, - ffi.Float)>(symbol: '_set_position', assetId: 'thermion_dart') -external void set_position( - ffi.Pointer sceneManager, - int entity, - double x, - double y, - double z, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float)>(symbol: '_set_rotation', assetId: 'thermion_dart') -external void set_rotation( - ffi.Pointer sceneManager, - int entity, - double rads, - double x, - double y, - double z, - double w, -); - -@ffi.Native, EntityId, ffi.Float)>( - symbol: '_set_scale', assetId: 'thermion_dart') -external void set_scale( - ffi.Pointer sceneManager, - int entity, - double scale, -); - -@ffi.Native, EntityId)>( - symbol: '_move_camera_to_asset', assetId: 'thermion_dart') -external void move_camera_to_asset( - ffi.Pointer viewer, - int asset, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, - ffi.Float)>(symbol: '_set_camera_exposure', assetId: 'thermion_dart') -external void set_camera_exposure( - ffi.Pointer viewer, - double aperture, - double shutterSpeed, - double sensitivity, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, - ffi.Float)>(symbol: '_set_camera_position', assetId: 'thermion_dart') -external void set_camera_position( - ffi.Pointer viewer, - double x, - double y, - double z, -); - -@ffi.Native)>( - symbol: '_get_camera_position', assetId: 'thermion_dart') -external void get_camera_position( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, - ffi.Float)>(symbol: '_set_camera_rotation', assetId: 'thermion_dart') -external void set_camera_rotation( - ffi.Pointer viewer, - double w, - double x, - double y, - double z, -); - -@ffi.Native, ffi.Pointer)>( - symbol: '_set_camera_model_matrix', assetId: 'thermion_dart') -external void set_camera_model_matrix( - ffi.Pointer viewer, - ffi.Pointer matrix, -); - -@ffi.Native Function(ffi.Pointer)>( - symbol: '_get_camera_model_matrix', assetId: 'thermion_dart') -external ffi.Pointer get_camera_model_matrix( - ffi.Pointer viewer, -); - -@ffi.Native Function(ffi.Pointer)>( - symbol: '_get_camera_view_matrix', assetId: 'thermion_dart') -external ffi.Pointer get_camera_view_matrix( - ffi.Pointer viewer, -); - -@ffi.Native Function(ffi.Pointer)>( - symbol: '_get_camera_projection_matrix', assetId: 'thermion_dart') -external ffi.Pointer get_camera_projection_matrix( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Double, ffi.Double)>( - symbol: '_set_camera_projection_matrix', assetId: 'thermion_dart') -external void set_camera_projection_matrix( - ffi.Pointer viewer, - ffi.Pointer matrix, - double near, - double far, -); - -@ffi.Native, ffi.Double, ffi.Double)>( - symbol: '_set_camera_culling', assetId: 'thermion_dart') -external void set_camera_culling( - ffi.Pointer viewer, - double near, - double far, -); - -@ffi.Native)>( - symbol: '_get_camera_culling_near', assetId: 'thermion_dart') -external double get_camera_culling_near( - ffi.Pointer viewer, -); - -@ffi.Native)>( - symbol: '_get_camera_culling_far', assetId: 'thermion_dart') -external double get_camera_culling_far( - ffi.Pointer viewer, -); - -@ffi.Native Function(ffi.Pointer)>( - symbol: '_get_camera_culling_projection_matrix', assetId: 'thermion_dart') -external ffi.Pointer get_camera_culling_projection_matrix( - ffi.Pointer viewer, -); - -@ffi.Native Function(ffi.Pointer)>( - symbol: '_get_camera_frustum', assetId: 'thermion_dart') -external ffi.Pointer get_camera_frustum( - ffi.Pointer viewer, -); - -@ffi.Native, ffi.Float, ffi.Float)>( - symbol: '_set_camera_fov', assetId: 'thermion_dart') -external void set_camera_fov( - ffi.Pointer viewer, - double fovInDegrees, - double aspect, -); - -@ffi.Native, ffi.Float)>( - symbol: '_set_camera_focal_length', assetId: 'thermion_dart') -external void set_camera_focal_length( - ffi.Pointer viewer, - double focalLength, -); - -@ffi.Native, ffi.Float)>( - symbol: '_set_camera_focus_distance', assetId: 'thermion_dart') -external void set_camera_focus_distance( - ffi.Pointer viewer, - double focusDistance, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, _ManipulatorMode, ffi.Double, - ffi.Double, ffi.Double)>( - symbol: '_set_camera_manipulator_options', assetId: 'thermion_dart') -external void set_camera_manipulator_options( - ffi.Pointer viewer, - int mode, - double orbitSpeedX, - double orbitSpeedY, - double zoomSpeed, -); - -@ffi.Native< - ffi.Int Function(ffi.Pointer, EntityId, - ffi.Pointer)>(symbol: '_hide_mesh', assetId: 'thermion_dart') -external int hide_mesh( - ffi.Pointer sceneManager, - int entity, - ffi.Pointer meshName, -); - -@ffi.Native< - ffi.Int Function(ffi.Pointer, EntityId, - ffi.Pointer)>(symbol: '_reveal_mesh', assetId: 'thermion_dart') -external int reveal_mesh( - ffi.Pointer sceneManager, - int entity, - ffi.Pointer meshName, -); - -@ffi.Native, ffi.Bool)>( - symbol: '_set_post_processing', assetId: 'thermion_dart') -external void set_post_processing( - ffi.Pointer viewer, - bool enabled, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Bool, ffi.Bool, ffi.Bool)>( - symbol: '_set_antialiasing', assetId: 'thermion_dart') -external void set_antialiasing( - ffi.Pointer viewer, - bool msaa, - bool fxaa, - bool taa, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function( - EntityId entityId, ffi.Int x, ffi.Int y)>>)>( - symbol: '_filament_pick', assetId: 'thermion_dart') -external void filament_pick( - ffi.Pointer viewer, - int x, - int y, - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function(EntityId entityId, ffi.Int x, ffi.Int y)>> - callback, -); - -@ffi.Native Function(ffi.Pointer, EntityId)>( - symbol: '_get_name_for_entity', assetId: 'thermion_dart') -external ffi.Pointer get_name_for_entity( - ffi.Pointer sceneManager, - int entityId, -); - -@ffi.Native< - EntityId Function( - ffi.Pointer, EntityId, ffi.Pointer)>( - symbol: '_find_child_entity_by_name', assetId: 'thermion_dart') -external int find_child_entity_by_name( - ffi.Pointer sceneManager, - int parent, - ffi.Pointer name, -); - -@ffi.Native, EntityId, ffi.Bool)>( - symbol: '_get_entity_count', assetId: 'thermion_dart') -external int get_entity_count( - ffi.Pointer sceneManager, - int target, - bool renderableOnly, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Bool, ffi.Pointer)>( - symbol: '_get_entities', assetId: 'thermion_dart') -external void get_entities( - ffi.Pointer sceneManager, - int target, - bool renderableOnly, - ffi.Pointer out, -); - -@ffi.Native< - ffi.Pointer Function(ffi.Pointer, EntityId, ffi.Int, - ffi.Bool)>(symbol: '_get_entity_name_at', assetId: 'thermion_dart') -external ffi.Pointer get_entity_name_at( - ffi.Pointer sceneManager, - int target, - int index, - bool renderableOnly, -); - -@ffi.Native, ffi.Bool)>( - symbol: '_set_recording', assetId: 'thermion_dart') -external void set_recording( - ffi.Pointer viewer, - bool recording, -); - -@ffi.Native, ffi.Pointer)>( - symbol: '_set_recording_output_directory', assetId: 'thermion_dart') -external void set_recording_output_directory( - ffi.Pointer viewer, - ffi.Pointer outputDirectory, -); - -@ffi.Native(symbol: '_ios_dummy', assetId: 'thermion_dart') -external void ios_dummy(); - -@ffi.Native)>( - symbol: '_thermion_flutter_free', assetId: 'thermion_dart') -external void thermion_flutter_free( - ffi.Pointer ptr, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function(EntityId entityId1, EntityId entityId2)>>, - ffi.Bool)>(symbol: '_add_collision_component', assetId: 'thermion_dart') -external void add_collision_component( - ffi.Pointer sceneManager, - int entityId, - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function(EntityId entityId1, EntityId entityId2)>> - callback, - bool affectsCollidingTransform, -); - -@ffi.Native, EntityId)>( - symbol: '_remove_collision_component', assetId: 'thermion_dart') -external void remove_collision_component( - ffi.Pointer sceneManager, - int entityId, -); - -@ffi.Native, EntityId)>( - symbol: '_add_animation_component', assetId: 'thermion_dart') -external bool add_animation_component( - ffi.Pointer sceneManager, - int entityId, -); - -@ffi.Native, EntityId)>( - symbol: '_remove_animation_component', assetId: 'thermion_dart') -external void remove_animation_component( - ffi.Pointer sceneManager, - int entityId, -); - -@ffi.Native< - EntityId Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Pointer)>( - symbol: '_create_geometry', assetId: 'thermion_dart') -external int create_geometry( - ffi.Pointer viewer, - ffi.Pointer vertices, - int numVertices, - ffi.Pointer indices, - int numIndices, - int primitiveType, - ffi.Pointer materialPath, -); - -@ffi.Native, EntityId)>( - symbol: '_get_parent', assetId: 'thermion_dart') -external int get_parent( - ffi.Pointer sceneManager, - int child, -); - -@ffi.Native, EntityId, EntityId)>( - symbol: '_set_parent', assetId: 'thermion_dart') -external void set_parent( - ffi.Pointer sceneManager, - int child, - int parent, -); - -@ffi.Native, EntityId)>( - symbol: '_test_collisions', assetId: 'thermion_dart') -external void test_collisions( - ffi.Pointer sceneManager, - int entity, -); - -@ffi.Native, EntityId, ffi.Int)>( - symbol: '_set_priority', assetId: 'thermion_dart') -external void set_priority( - ffi.Pointer sceneManager, - int entityId, - int priority, -); - -@ffi.Native, ffi.Pointer)>( - symbol: '_get_gizmo', assetId: 'thermion_dart') -external void get_gizmo( - ffi.Pointer sceneManager, - ffi.Pointer out, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi - .Pointer< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer renderCallbackOwner)>>, - ffi.Pointer, - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer viewer)>>)>( - symbol: '_create_filament_viewer_ffi', assetId: 'thermion_dart') -external void create_filament_viewer_ffi( - ffi.Pointer context, - ffi.Pointer platform, - ffi.Pointer uberArchivePath, - ffi.Pointer loader, - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer renderCallbackOwner)>> - renderCallback, - ffi.Pointer renderCallbackOwner, - ffi.Pointer< - ffi.NativeFunction viewer)>> - callback, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Uint32, - ffi.Uint32, - ffi.Pointer>)>( - symbol: '_create_swap_chain_ffi', assetId: 'thermion_dart') -external void create_swap_chain_ffi( - ffi.Pointer viewer, - ffi.Pointer surface, - int width, - int height, - ffi.Pointer> onComplete, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, - ffi.Pointer>)>( - symbol: '_destroy_swap_chain_ffi', assetId: 'thermion_dart') -external void destroy_swap_chain_ffi( - ffi.Pointer viewer, - ffi.Pointer> onComplete, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.IntPtr, ffi.Uint32, - ffi.Uint32, ffi.Pointer>)>( - symbol: '_create_render_target_ffi', assetId: 'thermion_dart') -external void create_render_target_ffi( - ffi.Pointer viewer, - int nativeTextureId, - int width, - int height, - ffi.Pointer> onComplete, -); - -@ffi.Native)>( - symbol: '_destroy_filament_viewer_ffi', assetId: 'thermion_dart') -external void destroy_filament_viewer_ffi( - ffi.Pointer viewer, -); - -@ffi.Native)>( - symbol: '_render_ffi', assetId: 'thermion_dart') -external void render_ffi( - ffi.Pointer viewer, -); - -@ffi.Native( - symbol: '_make_render_callback_fn_pointer', assetId: 'thermion_dart') -external FilamentRenderCallback make_render_callback_fn_pointer( - FilamentRenderCallback arg0, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Bool, - ffi.Pointer>)>( - symbol: '_set_rendering_ffi', assetId: 'thermion_dart') -external void set_rendering_ffi( - ffi.Pointer viewer, - bool rendering, - ffi.Pointer> onComplete, -); - -@ffi.Native, ffi.Float)>( - symbol: '_set_frame_interval_ffi', assetId: 'thermion_dart') -external void set_frame_interval_ffi( - ffi.Pointer viewer, - double frameInterval, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Uint32, ffi.Uint32, - ffi.Float, ffi.Pointer>)>( - symbol: '_update_viewport_and_camera_projection_ffi', - assetId: 'thermion_dart') -external void update_viewport_and_camera_projection_ffi( - ffi.Pointer viewer, - int width, - int height, - double scaleFactor, - ffi.Pointer> onComplete, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>( - symbol: '_set_background_color_ffi', assetId: 'thermion_dart') -external void set_background_color_ffi( - ffi.Pointer viewer, - double r, - double g, - double b, - double a, -); - -@ffi.Native)>( - symbol: '_clear_background_image_ffi', assetId: 'thermion_dart') -external void clear_background_image_ffi( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Bool, ffi.Pointer>)>( - symbol: '_set_background_image_ffi', assetId: 'thermion_dart') -external void set_background_image_ffi( - ffi.Pointer viewer, - ffi.Pointer path, - bool fillHeight, - ffi.Pointer> onComplete, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>( - symbol: '_set_background_image_position_ffi', assetId: 'thermion_dart') -external void set_background_image_position_ffi( - ffi.Pointer viewer, - double x, - double y, - bool clamp, -); - -@ffi.Native, ffi.Int)>( - symbol: '_set_tone_mapping_ffi', assetId: 'thermion_dart') -external void set_tone_mapping_ffi( - ffi.Pointer viewer, - int toneMapping, -); - -@ffi.Native, ffi.Float)>( - symbol: '_set_bloom_ffi', assetId: 'thermion_dart') -external void set_bloom_ffi( - ffi.Pointer viewer, - double strength, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer>)>( - symbol: '_load_skybox_ffi', assetId: 'thermion_dart') -external void load_skybox_ffi( - ffi.Pointer viewer, - ffi.Pointer skyboxPath, - ffi.Pointer> onComplete, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Float)>(symbol: '_load_ibl_ffi', assetId: 'thermion_dart') -external void load_ibl_ffi( - ffi.Pointer viewer, - ffi.Pointer iblPath, - double intensity, -); - -@ffi.Native)>( - symbol: '_remove_skybox_ffi', assetId: 'thermion_dart') -external void remove_skybox_ffi( - ffi.Pointer viewer, -); - -@ffi.Native)>( - symbol: '_remove_ibl_ffi', assetId: 'thermion_dart') -external void remove_ibl_ffi( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Uint8, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Bool, - ffi.Pointer>)>( - symbol: '_add_light_ffi', assetId: 'thermion_dart') -external void add_light_ffi( - ffi.Pointer viewer, - int type, - double colour, - double intensity, - double posX, - double posY, - double posZ, - double dirX, - double dirY, - double dirZ, - double falloffRadius, - double spotLightConeInner, - double spotLightConeOuter, - double sunAngularRadius, - double sunHaloSize, - double sunHaloFallof, - bool shadows, - ffi.Pointer> callback, -); - -@ffi.Native, EntityId)>( - symbol: '_remove_light_ffi', assetId: 'thermion_dart') -external void remove_light_ffi( - ffi.Pointer viewer, - int entityId, -); - -@ffi.Native)>( - symbol: '_clear_lights_ffi', assetId: 'thermion_dart') -external void clear_lights_ffi( - ffi.Pointer viewer, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Int, - ffi.Pointer>)>( - symbol: '_load_glb_ffi', assetId: 'thermion_dart') -external void load_glb_ffi( - ffi.Pointer sceneManager, - ffi.Pointer assetPath, - int numInstances, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Size, - ffi.Int, - ffi.Pointer>)>( - symbol: '_load_glb_from_buffer_ffi', assetId: 'thermion_dart') -external void load_glb_from_buffer_ffi( - ffi.Pointer sceneManager, - ffi.Pointer data, - int length, - int numInstances, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer>)>( - symbol: '_load_gltf_ffi', assetId: 'thermion_dart') -external void load_gltf_ffi( - ffi.Pointer sceneManager, - ffi.Pointer assetPath, - ffi.Pointer relativePath, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>( - symbol: '_create_instance_ffi', assetId: 'thermion_dart') -external void create_instance_ffi( - ffi.Pointer sceneManager, - int entityId, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>( - symbol: '_remove_entity_ffi', assetId: 'thermion_dart') -external void remove_entity_ffi( - ffi.Pointer viewer, - int asset, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, - ffi.Pointer>)>( - symbol: '_clear_entities_ffi', assetId: 'thermion_dart') -external void clear_entities_ffi( - ffi.Pointer viewer, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Pointer, - ffi.Pointer>)>( - symbol: '_set_camera_ffi', assetId: 'thermion_dart') -external void set_camera_ffi( - ffi.Pointer viewer, - int asset, - ffi.Pointer nodeName, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Pointer, - ffi.Pointer, - ffi.Int)>(symbol: '_apply_weights_ffi', assetId: 'thermion_dart') -external void apply_weights_ffi( - ffi.Pointer sceneManager, - int asset, - ffi.Pointer entityName, - ffi.Pointer weights, - int count, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>( - symbol: '_set_animation_frame_ffi', assetId: 'thermion_dart') -external void set_animation_frame_ffi( - ffi.Pointer sceneManager, - int asset, - int animationIndex, - int animationFrame, -); - -@ffi.Native, EntityId, ffi.Int)>( - symbol: '_stop_animation_ffi', assetId: 'thermion_dart') -external void stop_animation_ffi( - ffi.Pointer sceneManager, - int asset, - int index, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>( - symbol: '_get_animation_count_ffi', assetId: 'thermion_dart') -external void get_animation_count_ffi( - ffi.Pointer sceneManager, - int asset, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Pointer, - ffi.Int, - ffi.Pointer>)>( - symbol: '_get_animation_name_ffi', assetId: 'thermion_dart') -external void get_animation_name_ffi( - ffi.Pointer sceneManager, - int asset, - ffi.Pointer outPtr, - int index, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - EntityId, - ffi.Pointer, - ffi.Int, - ffi.Pointer>)>( - symbol: '_get_morph_target_name_ffi', assetId: 'thermion_dart') -external void get_morph_target_name_ffi( - ffi.Pointer sceneManager, - int assetEntity, - int childEntity, - ffi.Pointer outPtr, - int index, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, EntityId, - ffi.Pointer>)>( - symbol: '_get_morph_target_name_count_ffi', assetId: 'thermion_dart') -external void get_morph_target_name_count_ffi( - ffi.Pointer sceneManager, - int asset, - int childEntity, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Pointer, - ffi.Int, - ffi.Pointer>)>( - symbol: '_set_morph_target_weights_ffi', assetId: 'thermion_dart') -external void set_morph_target_weights_ffi( - ffi.Pointer sceneManager, - int asset, - ffi.Pointer morphData, - int numWeights, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>( - symbol: '_update_bone_matrices_ffi', assetId: 'thermion_dart') -external void update_bone_matrices_ffi( - ffi.Pointer sceneManager, - int asset, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Int, - ffi.Int, - ffi.Pointer, - ffi.Pointer>)>( - symbol: '_set_bone_transform_ffi', assetId: 'thermion_dart') -external void set_bone_transform_ffi( - ffi.Pointer sceneManager, - int asset, - int skinIndex, - int boneIndex, - ffi.Pointer transform, - ffi.Pointer> callback, -); - -@ffi.Native, ffi.Bool)>( - symbol: '_set_post_processing_ffi', assetId: 'thermion_dart') -external void set_post_processing_ffi( - ffi.Pointer viewer, - bool enabled, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>( - symbol: '_reset_to_rest_pose_ffi', assetId: 'thermion_dart') -external void reset_to_rest_pose_ffi( - ffi.Pointer sceneManager, - int entityId, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Pointer, - ffi.Pointer>)>( - symbol: '_create_geometry_ffi', assetId: 'thermion_dart') -external void create_geometry_ffi( - ffi.Pointer viewer, - ffi.Pointer vertices, - int numVertices, - ffi.Pointer indices, - int numIndices, - int primitiveType, - ffi.Pointer materialPath, - ffi.Pointer> callback, -); - -typedef LoadFilamentResourceFromOwner - = ffi.Pointer>; -typedef LoadFilamentResourceFromOwnerFunction = ResourceBuffer Function( - ffi.Pointer, ffi.Pointer); - -final class ResourceBuffer extends ffi.Struct { - external ffi.Pointer data; - - @ffi.Int32() - external int size; - - @ffi.Int32() - external int id; -} - -typedef FreeFilamentResourceFromOwner - = ffi.Pointer>; -typedef FreeFilamentResourceFromOwnerFunction = ffi.Void Function( - ResourceBuffer, ffi.Pointer); -typedef DartFreeFilamentResourceFromOwnerFunction = void Function( - ResourceBuffer, ffi.Pointer); - -/// This header replicates most of the methods in ThermionDartApi.h. -/// It represents the interface for: -/// - invoking those methods that must be called on the main Filament engine thread -/// - setting up a render loop -typedef EntityId = ffi.Int32; -typedef DartEntityId = int; -typedef _ManipulatorMode = ffi.Int32; -typedef Dart_ManipulatorMode = int; -typedef FilamentRenderCallback - = ffi.Pointer>; -typedef FilamentRenderCallbackFunction = ffi.Void Function( - ffi.Pointer owner); -typedef ThermionDartRenderCallbackFunction = void Function( - ffi.Pointer owner); - -const int __bool_true_false_are_defined = 1; - -const int true1 = 1; - -const int false1 = 0; diff --git a/thermion_dart/lib/thermion_dart/entities/gizmo.dart b/thermion_dart/lib/thermion_dart/entities/gizmo.dart index 29998407..2cde276e 100644 --- a/thermion_dart/lib/thermion_dart/entities/gizmo.dart +++ b/thermion_dart/lib/thermion_dart/entities/gizmo.dart @@ -86,7 +86,6 @@ class Gizmo extends AbstractGizmo { } Future attach(ThermionEntity entity) async { - print("Attaching"); _activeAxis = null; if (entity == _activeEntity) { return; @@ -102,7 +101,7 @@ class Gizmo extends AbstractGizmo { } _activeEntity = entity; await _viewer.setGizmoVisibility(true); - await _viewer.setParent(center, entity, preserveScaling: true); + await _viewer.setParent(center, entity, preserveScaling: false); _boundingBoxController.sink.add(await _viewer.getViewportBoundingBox(x)); } diff --git a/thermion_dart/lib/thermion_dart/scene.dart b/thermion_dart/lib/thermion_dart/scene.dart index 76d86d43..12f1b330 100644 --- a/thermion_dart/lib/thermion_dart/scene.dart +++ b/thermion_dart/lib/thermion_dart/scene.dart @@ -1,48 +1,233 @@ +import 'dart:convert'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; -import 'dart:async'; +import 'package:vector_math/vector_math_64.dart'; -/// -/// For now, this class just holds the entities that have been loaded (though not necessarily visible in the Filament Scene). -/// -abstract class Scene { - /// - /// The last entity clicked/tapped in the viewport (internally, the result of calling pick); - ThermionEntity? selected; +class SceneV2 { + final Map assets; + final List lights; + List cameras; + final List entities; + EnvironmentInfo? environment; - /// - /// A Stream updated whenever an entity is added/removed from the scene. - /// - Stream get onUpdated; + SceneV2({ + Map? assets, + List? lights, + List? cameras, + List? entities, + this.environment, + }) : assets = assets ?? {}, + lights = lights ?? [], + cameras = cameras ?? [], + entities = entities ?? []; - /// - /// A Stream containing every ThermionEntity added to the scene (i.e. via [loadGlb], [loadGltf] or [addLight]). - /// This is provided for convenience so you can set listeners in front-end widgets that can respond to entity loads without manually passing around the ThermionEntity returned from those methods. - /// - Stream get onLoad; + void addAsset(String uri, AssetType type) { + assets[uri] = AssetInfo(uri: uri, type: type); + } - /// - /// A Stream containing every ThermionEntity removed from the scene (i.e. via [removeEntity], [clearEntities], [removeLight] or [clearLights]). + void addLight(LightInfo light) { + lights.add(light); + } - Stream get onUnload; + void clearAssets() { + assets.clear(); + } - /// - /// Lists all light entities currently loaded (not necessarily active in the scene). Does not account for instances. - /// - Iterable listLights(); + void clearLights() { + lights.clear(); + } - /// - /// Lists all entities currently loaded (not necessarily active in the scene). Does not account for instances. - /// - Iterable listEntities(); + void setCamera(Matrix4 modelMatrix, Matrix4 projectionMatrix) { + var camera = cameras.firstWhere((cam) => cam.isActive); + camera.modelMatrix = modelMatrix; + camera.projectionMatrix = projectionMatrix; + } - /// - /// Attach the gizmo to the specified entity. - /// - void select(ThermionEntity entity); + void addEntity(String assetUri, Matrix4 transform) { + if (assets.containsKey(assetUri)) { + entities.add(EntityInfo(assetUri: assetUri, transform: transform)); + } else { + throw Exception('Asset not found: $assetUri'); + } + } - /// - /// - /// - void registerEntity(ThermionEntity entity); + void setEnvironment(String? skyboxUri, String? iblUri) { + environment = EnvironmentInfo(skyboxUri: skyboxUri, iblUri: iblUri); + } -} \ No newline at end of file + Map toJson() => { + 'assets': assets.map((key, value) => MapEntry(key, value.toJson())), + 'lights': lights.map((light) => light.toJson()).toList(), + 'cameras': cameras.map((camera) => camera.toJson()), + 'entities': entities.map((entity) => entity.toJson()).toList(), + 'environment': environment?.toJson(), + }; + + String toJsonString() => jsonEncode(toJson()); + + static SceneV2 fromJson(Map json) { + return SceneV2( + assets: (json['assets'] as Map).map( + (key, value) => MapEntry(key, AssetInfo.fromJson(value)), + ), + lights: (json['lights'] as List) + .map((light) => LightInfo.fromJson(light)) + .toList(), + cameras: json['cameras'].map((camera) => CameraInfo.fromJson), + entities: (json['entities'] as List) + .map((entity) => EntityInfo.fromJson(entity)) + .toList(), + environment: json['environment'] != null + ? EnvironmentInfo.fromJson(json['environment']) + : null, + ); + } + + static SceneV2 fromJsonString(String jsonString) => + fromJson(jsonDecode(jsonString)); +} + +class AssetInfo { + final String uri; + final AssetType type; + + AssetInfo({required this.uri, required this.type}); + + Map toJson() => { + 'uri': uri, + 'type': type.toString().split('.').last, + }; + + static AssetInfo fromJson(Map json) { + return AssetInfo( + uri: json['uri'], + type: AssetType.values.firstWhere( + (e) => e.toString().split('.').last == json['type'], + orElse: () => AssetType.glb), + ); + } +} + +enum AssetType { glb, gltf, geometryPrimitive } + +class LightInfo { + final LightType type; + final Vector3 position; + final Vector3 direction; + final Color color; + final double intensity; + + LightInfo({ + required this.type, + required this.position, + required this.direction, + required this.color, + required this.intensity, + }); + + Map toJson() => { + 'type': type.toString().split('.').last, + 'position': [position.x, position.y, position.z], + 'direction': [direction.x, direction.y, direction.z], + 'color': color.toJson(), + 'intensity': intensity, + }; + + static LightInfo fromJson(Map json) { + return LightInfo( + type: LightType.values.firstWhere((e) => e.name == json['type']), + position: Vector3.array(json['position'].cast()), + direction: Vector3.array(json['direction'].cast()), + color: Color.fromJson(json['color']), + intensity: json['intensity'], + ); + } +} + +class CameraInfo { + final bool isActive; + Matrix4 modelMatrix; + Matrix4 projectionMatrix; + + CameraInfo( + {required this.isActive, + required this.modelMatrix, + required this.projectionMatrix}); + + Map toJson() => { + 'modelMatrix': modelMatrix.storage, + 'projectionMatrix': projectionMatrix.storage, + 'isActive': isActive, + }; + + static CameraInfo fromJson(Map json) { + return CameraInfo( + modelMatrix: + Matrix4.fromFloat64List(json['modelMatrix'].cast()), + projectionMatrix: + Matrix4.fromFloat64List(json['modelMatrix'].cast()), + isActive: json["isActive"]); + } +} + +class EntityInfo { + final String assetUri; + final Matrix4 transform; + + EntityInfo({required this.assetUri, required this.transform}); + + Map toJson() => { + 'assetUri': assetUri, + 'transform': transform.storage, + }; + + static EntityInfo fromJson(Map json) { + return EntityInfo( + assetUri: json['assetUri'], + transform: Matrix4.fromList(List.from(json['transform'])), + ); + } +} + +class EnvironmentInfo { + final String? skyboxUri; + final String? iblUri; + + EnvironmentInfo({this.skyboxUri, this.iblUri}); + + Map toJson() => { + 'skyboxUri': skyboxUri, + 'iblUri': iblUri, + }; + + static EnvironmentInfo fromJson(Map json) { + return EnvironmentInfo( + skyboxUri: json['skyboxUri'], + iblUri: json['iblUri'], + ); + } +} + +class Color { + final double r; + final double g; + final double b; + final double a; + + Color({required this.r, required this.g, required this.b, this.a = 1.0}); + + Map toJson() => { + 'r': r, + 'g': g, + 'b': b, + 'a': a, + }; + + static Color fromJson(Map json) { + return Color( + r: json['r'], + g: json['g'], + b: json['b'], + a: json['a'], + ); + } +} diff --git a/thermion_dart/lib/thermion_dart/scene_impl.dart b/thermion_dart/lib/thermion_dart/scene_impl.dart deleted file mode 100644 index a31c8848..00000000 --- a/thermion_dart/lib/thermion_dart/scene_impl.dart +++ /dev/null @@ -1,125 +0,0 @@ -import 'dart:async'; -import 'package:thermion_dart/thermion_dart/scene.dart'; -import 'thermion_viewer.dart'; - -/// -/// For now, this class just holds the entities that have been loaded (though not necessarily visible in the Filament Scene). -/// -class SceneImpl extends Scene { - ThermionViewer controller; - - SceneImpl(this.controller); - - @override - ThermionEntity? selected; - - final _onUpdatedController = StreamController.broadcast(); - @override - Stream get onUpdated => _onUpdatedController.stream; - - final _onLoadController = StreamController.broadcast(); - @override - Stream get onLoad => _onLoadController.stream; - - final _onUnloadController = StreamController.broadcast(); - @override - Stream get onUnload => _onUnloadController.stream; - - final _lights = {}; - final _entities = {}; - - void registerLight(ThermionEntity entity) { - _lights.add(entity); - _onLoadController.sink.add(entity); - _onUpdatedController.add(true); - } - - void unregisterLight(ThermionEntity entity) async { - var children = await controller.getChildEntities(entity, true); - if (selected == entity || children.contains(selected)) { - selected = null; - controller.gizmo?.detach(); - } - _lights.remove(entity); - _onUnloadController.add(entity); - _onUpdatedController.add(true); - } - - void unregisterEntity(ThermionEntity entity) async { - var children = await controller.getChildEntities(entity, true); - if (selected == entity || children.contains(selected)) { - selected = null; - - controller.gizmo?.detach(); - } - _entities.remove(entity); - _onUnloadController.add(entity); - _onUpdatedController.add(true); - } - - void registerEntity(ThermionEntity entity) { - _entities.add(entity); - _onLoadController.sink.add(entity); - _onUpdatedController.add(true); - } - - void clearLights() { - for (final light in _lights) { - if (selected == light) { - selected = null; - controller.gizmo?.detach(); - } - _onUnloadController.add(light); - } - - _lights.clear(); - _onUpdatedController.add(true); - } - - void clearEntities() { - for (final entity in _entities) { - if (selected == entity) { - selected = null; - controller.gizmo?.detach(); - } - _onUnloadController.add(entity); - } - _entities.clear(); - _onUpdatedController.add(true); - } - - /// - /// Lists all entities currently loaded (not necessarily active in the scene). - /// - Iterable listLights() { - return _lights; - } - - @override - Iterable listEntities() { - return _entities; - } - - void registerSelected(ThermionEntity entity) { - selected = entity; - _onUpdatedController.add(true); - } - - void unregisterSelected() { - selected = null; - _onUpdatedController.add(true); - } - - @override - void select(ThermionEntity entity) { - selected = entity; - controller.gizmo?.attach(entity); - _onUpdatedController.add(true); - } - - Future dispose() async { - await _onLoadController.close(); - await _onUnloadController.close(); - await _onUpdatedController.close(); - } -} diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index 24be69a7..48a17df7 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -1,885 +1,6 @@ -import 'dart:math'; -import 'dart:typed_data'; +library thermion_viewer; -import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; -import 'package:thermion_dart/thermion_dart/scene.dart'; -import 'package:vector_math/vector_math_64.dart'; -import 'dart:async'; -import 'package:animation_tools_dart/animation_tools_dart.dart'; - -// a handle that can be safely passed back to the rendering layer to manipulate an Entity -typedef ThermionEntity = int; - -// "picking" means clicking/tapping on the viewport, and unprojecting the X/Y coordinate to determine whether any renderable entities were present at those coordinates. -typedef FilamentPickResult = ({ThermionEntity entity, double x, double y}); - -enum LightType { - SUN, //!< Directional light that also draws a sun's disk in the sky. - DIRECTIONAL, //!< Directional light, emits light in a given direction. - POINT, //!< Point light, emits light from a position, in all directions. - FOCUSED_SPOT, //!< Physically correct spot light. - SPOT, -} - -enum ShadowType { - PCF, //!< percentage-closer filtered shadows (default) - VSM, //!< variance shadows - DPCF, //!< PCF with contact hardening simulation - PCSS, //!< PCF with soft shadows and contact hardening -} - -// copied from filament/backened/DriverEnums.h -enum PrimitiveType { - // don't change the enums values (made to match GL) - POINTS, //!< points - LINES, //!< lines - UNUSED1, - LINE_STRIP, //!< line strip - TRIANGLES, //!< triangles - TRIANGLE_STRIP, //!< triangle strip -} - -enum ToneMapper { ACES, FILMIC, LINEAR } - -// see filament Manipulator.h for more details -enum ManipulatorMode { ORBIT, MAP, FREE_FLIGHT } - -class TextureDetails { - final int textureId; - - // both width and height are in physical, not logical pixels - final int width; - final int height; - - TextureDetails( - {required this.textureId, required this.width, required this.height}); -} - -abstract class ThermionViewer { - Future get initialized; - - /// - /// The current dimensions of the viewport (in physical pixels). - /// - var viewportDimensions = (0.0,0.0); - - /// - /// The current ratio of logical to physical pixels. - /// - late double pixelRatio; - - /// - /// The result(s) of calling [pick] (see below). - /// This may be a broadcast stream, so you should ensure you have subscribed to this stream before calling [pick]. - /// If [pick] is called without an active subscription to this stream, the results will be silently discarded. - /// - Stream get pickResult; - - /// - /// The result(s) of calling [pickGizmo] (see below). - /// - Stream get gizmoPickResult; - - /// - /// Whether the controller is currently rendering at [framerate]. - /// - bool get rendering; - - /// - /// Set to true to continuously render the scene at the framerate specified by [setFrameRate] (60 fps by default). - /// - Future setRendering(bool render); - - /// - /// Render a single frame. - /// - Future render(); - - /// - /// Render a single frame to the viewport and copy the pixel buffer to [out]. - /// - Future capture(); - - /// - /// Sets the framerate for continuous rendering when [setRendering] is enabled. - /// - Future setFrameRate(int framerate); - - /// - /// Destroys/disposes the viewer (including the entire scene). You cannot use the viewer after calling this method. - /// - Future dispose(); - - /// - /// Set the background image to [path] (which should have a file extension .png, .jpg, or .ktx). - /// This will be rendered at the maximum depth (i.e. behind all other objects including the skybox). - /// If [fillHeight] is false, the image will be rendered at its original size. Note this may cause issues with pixel density so be sure to specify the correct resolution - /// If [fillHeight] is true, the image will be stretched/compressed to fit the height of the viewport. - /// - Future setBackgroundImage(String path, {bool fillHeight = false}); - - /// - /// Moves the background image to the relative offset from the origin (bottom-left) specified by [x] and [y]. - /// If [clamp] is true, the image cannot be positioned outside the bounds of the viewport. - /// - Future setBackgroundImagePosition(double x, double y, {bool clamp = false}); - - /// - /// Removes the background image. - /// - Future clearBackgroundImage(); - - /// - /// Sets the color for the background plane (positioned at the maximum depth, i.e. behind all other objects including the skybox). - /// - Future setBackgroundColor(double r, double g, double b, double alpha); - - /// - /// Load a skybox from [skyboxPath] (which must be a .ktx file) - /// - Future loadSkybox(String skyboxPath); - - /// - /// Removes the skybox from the scene. - /// - Future removeSkybox(); - - /// - /// Creates an indirect light by loading the reflections/irradiance from the KTX file. - /// Only one indirect light can be active at any given time; if an indirect light has already been loaded, it will be replaced. - /// - Future loadIbl(String lightingPath, {double intensity = 30000}); - - /// - /// Creates a indirect light with the given color. - /// Only one indirect light can be active at any given time; if an indirect light has already been loaded, it will be replaced. - /// - Future createIbl(double r, double g, double b, double intensity); - - /// - /// Rotates the IBL & skybox. - /// - Future rotateIbl(Matrix3 rotation); - - /// - /// Removes the image-based light from the scene. - /// - Future removeIbl(); - - /// - /// Add a light to the scene. - /// See LightManager.h for details - /// Note that [sunAngularRadius] is in degrees, - /// whereas [spotLightConeInner] and [spotLightConeOuter] are in radians - /// - Future addLight( - LightType type, - double colour, - double intensity, - double posX, - double posY, - double posZ, - double dirX, - double dirY, - double dirZ, - {double falloffRadius = 1.0, - double spotLightConeInner = pi / 8, - double spotLightConeOuter = pi / 4, - double sunAngularRadius = 0.545, - double sunHaloSize = 10.0, - double sunHaloFallof = 80.0, - bool castShadows = true}); - - Future removeLight(ThermionEntity light); - - /// - /// Remove all lights (excluding IBL) from the scene. - /// - Future clearLights(); - - /// - /// Load the .glb asset at the given path and insert into the scene. - /// Specify [numInstances] to create multiple instances (this is more efficient than dynamically instantating at a later time). You can then retrieve the created instances with [getInstances]. - /// If you want to be able to call [createInstance] at a later time, you must pass true for [keepData]. - /// If [keepData] is false, the source glTF data will be released and [createInstance] will throw an exception. - /// - Future loadGlb(String path, - {int numInstances = 1, bool keepData = false}); - - /// - /// Load the .glb asset from the specified buffer and insert into the scene. - /// Specify [numInstances] to create multiple instances (this is more efficient than dynamically instantating at a later time). You can then retrieve the created instances with [getInstances]. - /// If you want to be able to call [createInstance] at a later time, you must pass true for [keepData]. - /// If [keepData] is false, the source glTF data will be released and [createInstance] will throw an exception. - /// - Future loadGlbFromBuffer(Uint8List data, - {int numInstances = 1, bool keepData = false}); - - /// - /// Create a new instance of [entity]. - /// - Future createInstance(ThermionEntity entity); - - /// - /// Returns the number of instances of the asset associated with [entity]. - /// - Future getInstanceCount(ThermionEntity entity); - - /// - /// Returns all instances of [entity]. - /// - Future> getInstances(ThermionEntity entity); - - /// - /// Load the .gltf asset at the given path and insert into the scene. - /// [relativeResourcePath] is the folder path where the glTF resources are stored; - /// this is usually the parent directory of the .gltf file itself. - /// - /// See [loadGlb] for an explanation of [keepData]. - /// - Future loadGltf(String path, String relativeResourcePath, - {bool keepData = false}); - - /// - /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. - /// - Future panStart(double x, double y); - - /// - /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. - /// - Future panUpdate(double x, double y); - - /// - /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. - /// - Future panEnd(); - - /// - /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. - /// - Future rotateStart(double x, double y); - - /// - /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. - /// - Future rotateUpdate(double x, double y); - - /// - /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. - /// - Future rotateEnd(); - - /// - /// Set the weights for all morph targets in [entity] to [weights]. - /// Note that [weights] must contain values for ALL morph targets, but no exception will be thrown if you don't do so (you'll just get incorrect results). - /// If you only want to set one value, set all others to zero (check [getMorphTargetNames] if you need the get a list of all morph targets). - /// IMPORTANT - this accepts the actual ThermionEntity with the relevant morph targets (unlike [getMorphTargetNames], which uses the parent entity and the child mesh name). - /// Use [getChildEntityByName] if you are setting the weights for a child mesh. - /// - Future setMorphTargetWeights(ThermionEntity entity, List weights); - - /// - /// Gets the names of all morph targets for the child renderable [childEntity] under [entity]. - /// - Future> getMorphTargetNames( - ThermionEntity entity, ThermionEntity childEntity); - - /// - /// Gets the names of all bones for the armature at [skinIndex] under the specified [entity]. - /// - Future> getBoneNames(ThermionEntity entity, {int skinIndex = 0}); - - /// - /// Gets the names of all glTF animations embedded in the specified entity. - /// - Future> getAnimationNames(ThermionEntity entity); - - /// - /// Returns the length (in seconds) of the animation at the given index. - /// - Future getAnimationDuration( - ThermionEntity entity, int animationIndex); - - /// - /// Animate the morph targets in [entity]. See [MorphTargetAnimation] for an explanation as to how to construct the animation frame data. - /// This method will check the morph target names specified in [animation] against the morph target names that actually exist exist under [meshName] in [entity], - /// throwing an exception if any cannot be found. - /// It is permissible for [animation] to omit any targets that do exist under [meshName]; these simply won't be animated. - /// - Future setMorphAnimationData( - ThermionEntity entity, MorphAnimationData animation, - {List? targetMeshNames}); - - /// - /// Clear all current morph animations for [entity]. - /// - Future clearMorphAnimationData(ThermionEntity entity); - - /// - /// Resets all bones in the given entity to their rest pose. - /// This should be done before every call to addBoneAnimation. - /// - Future resetBones(ThermionEntity entity); - - /// - /// Enqueues and plays the [animation] for the specified bone(s). - /// By default, frame data is interpreted as being in *parent* bone space; - /// a 45 degree around Y means the bone will rotate 45 degrees around the - /// Y axis of the parent bone *in its current orientation*. - /// (i.e NOT the parent bone's rest position!). - /// Currently, only [Space.ParentBone] and [Space.Model] are supported; if you want - /// to transform to another space, you will need to do so manually. - /// - /// [fadeInInSecs]/[fadeOutInSecs]/[maxDelta] are used to cross-fade between - /// the current active glTF animation ("animation1") and the animation you - /// set via this method ("animation2"). The bone orientations will be - /// linearly interpolated between animation1 and animation2; at time 0, - /// the orientation will be 100% animation1, at time [fadeInInSecs], the - /// animation will be ((1 - maxDelta) * animation1) + (maxDelta * animation2). - /// This will be applied in reverse after [fadeOutInSecs]. - /// - /// - Future addBoneAnimation(ThermionEntity entity, BoneAnimationData animation, - {int skinIndex = 0, - double fadeInInSecs = 0.0, - double fadeOutInSecs = 0.0, - double maxDelta = 1.0}); - - /// - /// Gets the entity representing the bone at [boneIndex]/[skinIndex]. - /// The returned entity is only intended for use with [getWorldTransform]. - /// - Future getBone(ThermionEntity parent, int boneIndex, - {int skinIndex = 0}); - - /// - /// Gets the local (relative to parent) transform for [entity]. - /// - Future getLocalTransform(ThermionEntity entity); - - /// - /// Gets the world transform for [entity]. - /// - Future getWorldTransform(ThermionEntity entity); - - /// - /// Gets the inverse bind (pose) matrix for the bone. - /// Note that [parent] must be the ThermionEntity returned by [loadGlb/loadGltf], not any other method ([getChildEntity] etc). - /// This is because all joint information is internally stored with the parent entity. - /// - Future getInverseBindMatrix(ThermionEntity parent, int boneIndex, - {int skinIndex = 0}); - - /// - /// Sets the transform (relative to its parent) for [entity]. - /// - Future setTransform(ThermionEntity entity, Matrix4 transform); - - /// - /// Updates the bone matrices for [entity] (which must be the ThermionEntity - /// returned by [loadGlb/loadGltf]). - /// Under the hood, this just calls [updateBoneMatrices] on the Animator - /// instance of the relevant FilamentInstance (which uses the local - /// bone transform and the inverse bind matrix to set the bone matrix). - /// - Future updateBoneMatrices(ThermionEntity entity); - - /// - /// Directly set the bone matrix for the bone at the given index. - /// Don't call this manually unless you know what you're doing. - /// - Future setBoneTransform( - ThermionEntity entity, int boneIndex, Matrix4 transform, - {int skinIndex = 0}); - - /// - /// Removes/destroys the specified entity from the scene. - /// [entity] will no longer be a valid handle after this method is called; ensure you immediately discard all references once this method is complete. - /// - Future removeEntity(ThermionEntity entity); - - /// - /// Removes/destroys all renderable entities from the scene (including cameras). - /// All [ThermionEntity] handles will no longer be valid after this method is called; ensure you immediately discard all references to all entities once this method is complete. - /// - Future clearEntities(); - - /// - /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. - /// - Future zoomBegin(); - - /// - /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. - /// - Future zoomUpdate(double x, double y, double z); - - /// - /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. - /// - Future zoomEnd(); - - /// - /// Schedules the glTF animation at [index] in [entity] to start playing on the next frame. - /// - Future playAnimation(ThermionEntity entity, int index, - {bool loop = false, - bool reverse = false, - bool replaceActive = true, - double crossfade = 0.0, - double startOffset = 0.0}); - - /// - /// Schedules the glTF animation at [index] in [entity] to start playing on the next frame. - /// - Future playAnimationByName(ThermionEntity entity, String name, - {bool loop = false, - bool reverse = false, - bool replaceActive = true, - double crossfade = 0.0}); - - Future setAnimationFrame( - ThermionEntity entity, int index, int animationFrame); - - Future stopAnimation(ThermionEntity entity, int animationIndex); - Future stopAnimationByName(ThermionEntity entity, String name); - - /// - /// Sets the current scene camera to the glTF camera under [name] in [entity]. - /// - Future setCamera(ThermionEntity entity, String? name); - - /// - /// Sets the current scene camera to the main camera (which is always available and added to every scene by default). - /// - Future setMainCamera(); - - /// - /// Returns the entity associated with the main camera. - /// - Future getMainCamera(); - - /// - /// Sets the horizontal field of view (if [horizontal] is true) or vertical field of view for the currently active camera to [degrees]. - /// The aspect ratio of the current viewport is used. - /// - Future setCameraFov(double degrees, {bool horizontal = true}); - - /// - /// Gets the field of view (in degrees). - /// - Future getCameraFov(bool horizontal); - - /// - /// Sets the tone mapping (requires postprocessing). - /// - Future setToneMapping(ToneMapper mapper); - - /// - /// Sets the strength of the bloom. - /// - Future setBloom(double bloom); - - /// - /// Sets the focal length of the camera. Default value is 28.0. - /// - Future setCameraFocalLength(double focalLength); - - /// - /// Sets the distance (in world units) to the near/far planes for the active camera. Default values are 0.05/1000.0. See Camera.h for details. - /// - Future setCameraCulling(double near, double far); - - /// - /// Get the distance (in world units) to the near plane for the active camera. - /// - @Deprecated("Use getCameraNear") - Future getCameraCullingNear(); - - /// - /// Get the distance (in world units) to the near plane for the active camera. - /// - Future getCameraNear(); - - /// - /// Get the distance (in world units) to the far culling plane for the active camera. - /// - Future getCameraCullingFar(); - - /// - /// - /// - Future setCameraLensProjection(double near, double far, double aspect, double focalLength); - - /// - /// Sets the focus distance for the camera. - /// - Future setCameraFocusDistance(double focusDistance); - - /// - /// Get the camera position in world space. - /// - Future getCameraPosition(); - - /// - /// Get the camera's model matrix. - /// - Future getCameraModelMatrix(); - - /// - /// Get the camera's view matrix. See Camera.h for more details. - /// - Future getCameraViewMatrix(); - - /// - /// Get the camera's projection matrix. See Camera.h for more details. - /// - Future getCameraProjectionMatrix(); - - /// - /// Get the camera's culling projection matrix. See Camera.h for more details. - /// - Future getCameraCullingProjectionMatrix(); - - /// - /// Get the camera's culling frustum in world space. Returns a (vector_math) [Frustum] instance where plane0-plane6 define the left, right, bottom, top, far and near planes respectively. - /// See Camera.h and (filament) Frustum.h for more details. - /// - Future getCameraFrustum(); - - /// - /// Set the camera position in world space. Note this is not persistent - any viewport navigation will reset the camera transform. - /// - Future setCameraPosition(double x, double y, double z); - - /// - /// Get the camera rotation matrix. - /// - Future getCameraRotation(); - - /// - /// Repositions the camera to the last vertex of the bounding box of [entity], looking at the penultimate vertex. - /// - Future moveCameraToAsset(ThermionEntity entity); - - /// - /// Enables/disables frustum culling. Currently we don't expose a method for manipulating the camera projection/culling matrices so this is your only option to deal with unwanted near/far clipping. - /// - Future setViewFrustumCulling(bool enabled); - - /// - /// Sets the camera exposure. - /// - Future setCameraExposure( - double aperture, double shutterSpeed, double sensitivity); - - /// - /// Rotate the camera by [rads] around the given axis. - /// - Future setCameraRotation(Quaternion quaternion); - - /// - /// Sets the camera model matrix. - /// - @Deprecated("Will be superseded by setCameraModelMatrix4") - Future setCameraModelMatrix(List matrix); - - /// - /// Sets the camera model matrix. - /// - Future setCameraModelMatrix4(Matrix4 matrix); - - /// - /// Sets the `baseColorFactor` property for the material at index [materialIndex] in [entity] under node [meshName] to [color]. - /// - @Deprecated("Use setMaterialPropertyFloat4 instead") - Future setMaterialColor(ThermionEntity entity, String meshName, - int materialIndex, double r, double g, double b, double a); - - /// - /// Sets the material property [propertyName] under material [materialIndex] for [entity] to [value]. - /// [entity] must have a Renderable attached. - /// - Future setMaterialPropertyFloat4(ThermionEntity entity, String propertyName, - int materialIndex, double f1, double f2, double f3, double f4); - - /// - /// Sets the material property [propertyName] under material [materialIndex] for [entity] to [value]. - /// [entity] must have a Renderable attached. - /// - Future setMaterialPropertyFloat(ThermionEntity entity, String propertyName, int materialIndex, double value); - - /// - /// Scale [entity] to fit within the unit cube. - /// - Future transformToUnitCube(ThermionEntity entity); - - /// - /// Directly sets the world space position for [entity] to the given coordinates. - /// - Future setPosition(ThermionEntity entity, double x, double y, double z); - - /// - /// Set the world space position for [lightEntity] to the given coordinates. - /// - Future setLightPosition( - ThermionEntity lightEntity, double x, double y, double z); - - /// - /// Sets the world space direction for [lightEntity] to the given vector. - /// - Future setLightDirection(ThermionEntity lightEntity, Vector3 direction); - - /// - /// Directly sets the scale for [entity], skipping all collision detection. - /// - Future setScale(ThermionEntity entity, double scale); - - /// - /// Directly sets the rotation for [entity] to [rads] around the axis {x,y,z}, skipping all collision detection. - /// - Future setRotation( - ThermionEntity entity, double rads, double x, double y, double z); - - /// - /// Queues an update to the worldspace position for [entity] to {x,y,z}. - /// The actual update will occur on the next frame, and will be subject to collision detection. - /// - Future queuePositionUpdate( - ThermionEntity entity, double x, double y, double z, - {bool relative = false}); - - /// - /// TODO - /// - Future queuePositionUpdateFromViewportCoords( - ThermionEntity entity, double x, double y); - - /// - /// TODO - /// - Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, - double viewportX, double viewportY, double x, double y, double z); - - /// - /// Queues an update to the worldspace rotation for [entity]. - /// The actual update will occur on the next frame, and will be subject to collision detection. - /// - Future queueRotationUpdate( - ThermionEntity entity, double rads, double x, double y, double z, - {bool relative = false}); - - /// - /// Same as [queueRotationUpdate]. - /// - Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion quat, - {bool relative = false}); - - /// - /// Enable/disable postprocessing (disabled by default). - /// - Future setPostProcessing(bool enabled); - - /// - /// Enable/disable shadows (disabled by default). - /// - Future setShadowsEnabled(bool enabled); - - /// - /// Set shadow type. - /// - Future setShadowType(ShadowType shadowType); - - /// - /// Set soft shadow options (ShadowType DPCF and PCSS) - /// - Future setSoftShadowOptions(double penumbraScale, double penumbraRatioScale); - - /// - /// Set antialiasing options. - /// - Future setAntiAliasing(bool msaa, bool fxaa, bool taa); - - /// - /// Sets the rotation for [entity] to the specified quaternion. - /// - Future setRotationQuat(ThermionEntity entity, Quaternion rotation); - - /// - /// Reveal the node [meshName] under [entity]. Only applicable if [hide] had previously been called; this is a no-op otherwise. - /// - Future reveal(ThermionEntity entity, String? meshName); - - /// - /// If [meshName] is provided, hide the node [meshName] under [entity], otherwise hide the root node for [entity]. - /// The entity still exists in memory, but is no longer being rendered into the scene. Call [reveal] to re-commence rendering. - /// - Future hide(ThermionEntity entity, String? meshName); - - /// - /// Used to select the entity in the scene at the given viewport coordinates. - /// Called by `FilamentGestureDetector` on a mouse/finger down event. You probably don't want to call this yourself. - /// This is asynchronous and will require 2-3 frames to complete - subscribe to the [pickResult] stream to receive the results of this method. - /// [x] and [y] must be in local logical coordinates (i.e. where 0,0 is at top-left of the ThermionWidget). - /// - void pick(int x, int y); - - /// - /// Used to test whether a Gizmo is at the given viewport coordinates. - /// Called by `FilamentGestureDetector` on a mouse/finger down event. You probably don't want to call this yourself. - /// This is asynchronous and will require 2-3 frames to complete - subscribe to the [gizmoPickResult] stream to receive the results of this method. - /// [x] and [y] must be in local logical coordinates (i.e. where 0,0 is at top-left of the ThermionWidget). - /// - void pickGizmo(int x, int y); - - /// - /// Retrieves the name assigned to the given ThermionEntity (usually corresponds to the glTF mesh name). - /// - String? getNameForEntity(ThermionEntity entity); - - /// - /// Sets the options for manipulating the camera via the viewport. - /// ManipulatorMode.FREE_FLIGHT and ManipulatorMode.MAP are currently unsupported and will throw an exception. - /// - @Deprecated("Use ThermionGestureHandler instead") - Future setCameraManipulatorOptions( - {ManipulatorMode mode = ManipulatorMode.ORBIT, - double orbitSpeedX = 0.01, - double orbitSpeedY = 0.01, - double zoomSpeed = 0.01}); - - /// - /// Returns all child entities under [parent]. - /// - Future> getChildEntities( - ThermionEntity parent, bool renderableOnly); - - /// - /// Finds the child entity named [childName] associated with the given parent. - /// Usually, [parent] will be the return value from [loadGlb]/[loadGltf] and [childName] will be the name of a node/mesh. - /// - Future getChildEntity( - ThermionEntity parent, String childName); - - /// - /// List the name of all child entities under the given entity. - /// - Future> getChildEntityNames(ThermionEntity entity, - {bool renderableOnly = true}); - - /// - /// If [recording] is set to true, each frame the framebuffer/texture will be written to /tmp/output_*.png. - /// This will impact performance; handle with care. - /// - Future setRecording(bool recording); - - /// - /// Sets the output directory where recorded PNGs will be placed. - /// - Future setRecordingOutputDirectory(String outputDirectory); - - /// - /// An [entity] will only be animatable after an animation component is attached. - /// Any calls to [playAnimation]/[setBoneAnimation]/[setMorphAnimation] will have no visual effect until [addAnimationComponent] has been called on the instance. - /// - Future addAnimationComponent(ThermionEntity entity); - - /// - /// Removes an animation component from [entity]. - /// - Future removeAnimationComponent(ThermionEntity entity); - - /// - /// Makes [entity] collidable. - /// This allows you to call [testCollisions] with any other entity ("entity B") to see if [entity] has collided with entity B. The callback will be invoked if so. - /// Alternatively, if [affectsTransform] is true and this entity collides with another entity, any queued position updates to the latter entity will be ignored. - /// - Future addCollisionComponent(ThermionEntity entity, - {void Function(int entityId1, int entityId2)? callback, - bool affectsTransform = false}); - - /// - /// Removes the collision component from [entity], meaning this will no longer be tested when [testCollisions] or [queuePositionUpdate] is called with another entity. - /// - Future removeCollisionComponent(ThermionEntity entity); - - /// - /// Creates a (renderable) entity with the specified geometry and adds to the scene. - /// - Future createGeometry(List vertices, List indices, - {String? materialPath, - List? normals, - PrimitiveType primitiveType = PrimitiveType.TRIANGLES}); - - /// - /// Gets the parent entity of [entity]. Returns null if the entity has no parent. - /// - Future getParent(ThermionEntity entity); - - /// - /// Gets the ancestor (ultimate parent) entity of [entity]. Returns null if the entity has no parent. - /// - Future getAncestor(ThermionEntity entity); - - /// - /// Sets the parent transform of [child] to [parent]. - /// - Future setParent(ThermionEntity child, ThermionEntity parent, - {bool preserveScaling}); - - /// - /// Test all collidable entities against this entity to see if any have collided. - /// This method returns void; the relevant callback passed to [addCollisionComponent] will be fired if a collision is detected. - /// - Future testCollisions(ThermionEntity entity); - - /// - /// Sets the draw priority for the given entity. See RenderableManager.h for more details. - /// - Future setPriority(ThermionEntity entityId, int priority); - - /// - /// The Scene holds all loaded entities/lights. - /// - Scene get scene; - - /// - /// The gizmo for translating/rotating objects. Only one gizmo is present in the scene. - /// - AbstractGizmo? get gizmo; - - /// - /// Register a callback to be invoked when this viewer is disposed. - /// - void onDispose(Future Function() callback); - - /// - /// Gets the 2D bounding box (in viewport coordinates) for the given entity. - /// - Future getViewportBoundingBox(ThermionEntity entity); - - /// - /// Filament assigns renderables to a numeric layer. - /// We place all scene assets in layer 0 (enabled by default), gizmos in layer 1 (enabled by default), world grid in layer 2 (disabled by default). - /// Use this method to toggle visibility of the respective layer. - /// - Future setLayerEnabled(int layer, bool enabled); - - /// - /// Show/hide the translation gizmo. - /// - Future setGizmoVisibility(bool visible); - - /// - /// Renders an outline around [entity] with the given color. - /// - Future setStencilHighlight(ThermionEntity entity, - {double r = 1.0, double g = 0.0, double b = 0.0}); - - /// - /// Removes the outline around [entity]. Noop if there was no highlight. - /// - Future removeStencilHighlight(ThermionEntity entity); - -} +export 'viewer/thermion_viewer_base.dart'; +export 'viewer/thermion_viewer_stub.dart' + if (dart.library.io) 'viewer/ffi/thermion_viewer_ffi.dart' + if (dart.library.js_interop) 'viewer/web/thermion_viewer_wasm.dart'; diff --git a/thermion_dart/lib/thermion_dart/utils/dart_resources.dart b/thermion_dart/lib/thermion_dart/utils/dart_resources.dart index e9b0f71d..fafe69de 100644 --- a/thermion_dart/lib/thermion_dart/utils/dart_resources.dart +++ b/thermion_dart/lib/thermion_dart/utils/dart_resources.dart @@ -1,6 +1,8 @@ import 'dart:ffi'; import 'dart:io'; -import '../compatibility/compatibility.dart'; + +import 'package:ffi/ffi.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_dart.g.dart'; class DartResourceLoader { static final _assets = {}; diff --git a/thermion_dart/lib/thermion_dart/geometry_helper.dart b/thermion_dart/lib/thermion_dart/utils/geometry.dart similarity index 72% rename from thermion_dart/lib/thermion_dart/geometry_helper.dart rename to thermion_dart/lib/thermion_dart/utils/geometry.dart index 8ddd1aa4..62660536 100644 --- a/thermion_dart/lib/thermion_dart/geometry_helper.dart +++ b/thermion_dart/lib/thermion_dart/utils/geometry.dart @@ -1,26 +1,14 @@ import 'dart:math'; -class Geometry { - final List vertices; - final List indices; - final List? normals; - - Geometry(this.vertices, this.indices, this.normals); - - void scale(double factor) { - for (int i = 0; i < vertices.length; i++) { - vertices[i] = vertices[i] * factor; - } - } -} +import 'package:thermion_dart/thermion_dart/viewer/shared_types/geometry.dart'; class GeometryHelper { -static Geometry sphere() { + static Geometry sphere({bool normals = true, bool uvs = true}) { int latitudeBands = 20; int longitudeBands = 20; List vertices = []; - List normals = []; + List _normals = []; List indices = []; for (int latNumber = 0; latNumber <= latitudeBands; latNumber++) { @@ -38,7 +26,7 @@ static Geometry sphere() { double z = sinPhi * sinTheta; vertices.addAll([x, y, z]); - normals.addAll([ + _normals.addAll([ x, y, z @@ -56,10 +44,10 @@ static Geometry sphere() { } } - return Geometry(vertices, indices, normals); + return Geometry(vertices, indices, normals: normals ? _normals : null); } - static Geometry cube() { + static Geometry cube({bool normals = true, bool uvs = true}) { final vertices = [ // Front face -1, -1, 1, @@ -98,7 +86,7 @@ static Geometry sphere() { -1, 1, -1, ]; - final normals = [ + final _normals = [ // Front face 0, 0, 1, 0, 0, 1, @@ -136,7 +124,7 @@ static Geometry sphere() { -1, 0, 0, ]; - final indices = [ + final indices = [ // Front face 0, 1, 2, 0, 2, 3, // Back face @@ -150,13 +138,13 @@ static Geometry sphere() { // Left face 20, 21, 22, 20, 22, 23 ]; - return Geometry(vertices, indices, normals); + return Geometry(vertices, indices, normals: normals ? _normals : null); } - static Geometry cylinder({double radius = 1.0, double length = 1.0}) { + static Geometry cylinder({double radius = 1.0, double length = 1.0, bool normals = true, bool uvs = true }) { int segments = 32; List vertices = []; - List normals = []; + List _normals = []; List indices = []; // Create vertices and normals @@ -167,11 +155,11 @@ static Geometry sphere() { // Top circle vertices.addAll([x, length / 2, z]); - normals.addAll([x / radius, 0, z / radius]); + _normals.addAll([x / radius, 0, z / radius]); // Bottom circle vertices.addAll([x, -length / 2, z]); - normals.addAll([x / radius, 0, z / radius]); + _normals.addAll([x / radius, 0, z / radius]); } // Create indices @@ -192,23 +180,23 @@ static Geometry sphere() { // Add center vertices and normals for top and bottom faces vertices.addAll([0, length / 2, 0]); // Top center - normals.addAll([0, 1, 0]); + _normals.addAll([0, 1, 0]); vertices.addAll([0, -length / 2, 0]); // Bottom center - normals.addAll([0, -1, 0]); + _normals.addAll([0, -1, 0]); // Add top and bottom face normals for (int i = 0; i <= segments; i++) { - normals.addAll([0, 1, 0]); // Top face normal - normals.addAll([0, -1, 0]); // Bottom face normal + _normals.addAll([0, 1, 0]); // Top face normal + _normals.addAll([0, -1, 0]); // Bottom face normal } - return Geometry(vertices, indices, normals); + return Geometry(vertices, indices, normals: normals ? _normals : null); } - static Geometry conic({double radius = 1.0, double length = 1.0}) { + static Geometry conic({double radius = 1.0, double length = 1.0, bool normals = true, bool uvs = true}) { int segments = 32; List vertices = []; - List normals = []; + List _normals = []; List indices = []; // Create vertices and normals @@ -219,53 +207,73 @@ static Geometry sphere() { // Base circle vertices.addAll([x, 0, z]); - + // Calculate normal for the side double nx = x / sqrt(x * x + length * length); double nz = z / sqrt(z * z + length * length); double ny = radius / sqrt(radius * radius + length * length); - normals.addAll([nx, ny, nz]); + _normals.addAll([nx, ny, nz]); } // Apex vertices.addAll([0, length, 0]); - normals.addAll([0, 1, 0]); // Normal at apex points straight up + _normals.addAll([0, 1, 0]); // Normal at apex points straight up // Create indices for (int i = 0; i < segments; i++) { - // Base face - indices.addAll([i, i + 1, segments + 1]); - // Side faces + // Base face (fixed to counterclockwise) + indices.addAll([segments + 1, i + 1, i]); + // Side faces (already correct) indices.addAll([i, segments, i + 1]); } // Add base face normals for (int i = 0; i <= segments; i++) { - normals.addAll([0, -1, 0]); // Base face normal + _normals.addAll([0, -1, 0]); // Base face normal } - return Geometry(vertices, indices, normals); + return Geometry(vertices, indices, normals: normals ? _normals : null); } - static Geometry plane({double width = 1.0, double height = 1.0}) { + static Geometry plane({double width = 1.0, double height = 1.0, bool normals = true, bool uvs = true}) { List vertices = [ - -width / 2, 0, -height / 2, - width / 2, 0, -height / 2, - width / 2, 0, height / 2, - -width / 2, 0, height / 2, + -width / 2, + 0, + -height / 2, + width / 2, + 0, + -height / 2, + width / 2, + 0, + height / 2, + -width / 2, + 0, + height / 2, ]; - List normals = [ - 0, 1, 0, - 0, 1, 0, - 0, 1, 0, - 0, 1, 0, + List _normals = [ + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, ]; List indices = [ - 0, 1, 2, - 0, 2, 3, + 0, + 2, + 1, + 0, + 3, + 2, ]; - return Geometry(vertices, indices, normals); + return Geometry(vertices, indices, normals: normals ? _normals : null); } -} \ No newline at end of file +} diff --git a/thermion_dart/lib/thermion_dart/utils/light_options.dart b/thermion_dart/lib/thermion_dart/utils/light_options.dart deleted file mode 100644 index 76f7b187..00000000 --- a/thermion_dart/lib/thermion_dart/utils/light_options.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:vector_math/vector_math_64.dart' as v; - -class LightOptions { - String? iblPath; - double iblIntensity; - int directionalType; - double directionalColor; - double directionalIntensity; - bool directionalCastShadows; - late v.Vector3 directionalPosition; - late v.Vector3 directionalDirection; - - LightOptions( - {required this.iblPath, - required this.iblIntensity, - required this.directionalType, - required this.directionalColor, - required this.directionalIntensity, - required this.directionalCastShadows, - v.Vector3? directionalDirection, - v.Vector3? directionalPosition}) { - this.directionalDirection = directionalDirection == null - ? v.Vector3(0, -1, 0) - : directionalDirection; - this.directionalPosition = directionalPosition == null - ? v.Vector3(0, 100, 0) - : directionalPosition; - } -} diff --git a/thermion_dart/lib/thermion_dart/matrix_helper.dart b/thermion_dart/lib/thermion_dart/utils/matrix.dart similarity index 89% rename from thermion_dart/lib/thermion_dart/matrix_helper.dart rename to thermion_dart/lib/thermion_dart/utils/matrix.dart index d384fc1b..42c5647a 100644 --- a/thermion_dart/lib/thermion_dart/matrix_helper.dart +++ b/thermion_dart/lib/thermion_dart/utils/matrix.dart @@ -1,5 +1,5 @@ // Helper function to convert double4x4 to Matrix4 -import 'package:thermion_dart/thermion_dart/compatibility/native/thermion_dart.g.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_dart.g.dart'; import 'package:vector_math/vector_math_64.dart'; import 'dart:ffi'; diff --git a/thermion_dart/lib/thermion_dart/utils/using_pointer.dart b/thermion_dart/lib/thermion_dart/utils/using_pointer.dart deleted file mode 100644 index d192ec03..00000000 --- a/thermion_dart/lib/thermion_dart/utils/using_pointer.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'dart:ffi'; - -import 'package:ffi/ffi.dart'; - -final allocator = calloc; - -void using(Pointer ptr, Future Function(Pointer ptr) function) async { - await function.call(ptr); - allocator.free(ptr); -} diff --git a/thermion_dart/lib/thermion_dart/viewer/events.dart b/thermion_dart/lib/thermion_dart/viewer/events.dart new file mode 100644 index 00000000..eddf168e --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/events.dart @@ -0,0 +1,86 @@ +import 'package:thermion_dart/thermion_dart/viewer/shared_types/entities.dart'; +import 'shared_types/shared_types.dart'; + +/// +/// To ensure we can easily store/recreate a particular, [ThermionViewer] will raise an event whenever an +/// entity is added/removed. +/// +enum EventType { EntityAdded, EntityRemoved, EntityHidden, EntityRevealed, ClearLights } + +/// +/// An "entity added" event must provide sufficient detail to enable that asset to be reloaded in future. +/// This requires a bit more legwork because entities may be lights (direct/indirect), geometry or gltf. +/// +enum EntityType { Geometry, Gltf, DirectLight, IBL } + +class SceneUpdateEvent { + late final ThermionEntity? entity; + late final EventType eventType; + + EntityType get addedEntityType { + if (_directLight != null) { + return EntityType.DirectLight; + } else if (_ibl != null) { + return EntityType.IBL; + } else if (_gltf != null) { + return EntityType.Gltf; + } else if (_geometry != null) { + return EntityType.Geometry; + } else { + throw Exception("Unknown entity type"); + } + } + + DirectLight? _directLight; + IBL? _ibl; + GLTF? _gltf; + Geometry? _geometry; + + SceneUpdateEvent.remove(this.entity) { + this.eventType = EventType.EntityRemoved; + } + + SceneUpdateEvent.reveal(this.entity) { + this.eventType = EventType.EntityRevealed; + } + + SceneUpdateEvent.hide(this.entity) { + this.eventType = EventType.EntityHidden; + } + + SceneUpdateEvent.addDirectLight(this.entity, this._directLight) { + this.eventType = EventType.EntityAdded; + } + + SceneUpdateEvent.addIbl(this.entity, this._ibl) { + this.eventType = EventType.EntityAdded; + } + + SceneUpdateEvent.addGltf(this.entity, this._gltf) { + this.eventType = EventType.EntityAdded; + } + + SceneUpdateEvent.addGeometry(this.entity, this._geometry) { + this.eventType = EventType.EntityAdded; + } + + SceneUpdateEvent.clearLights() { + this.eventType = EventType.ClearLights; + } + + DirectLight getDirectLight() { + return _directLight!; + } + + IBL getAsIBL() { + return _ibl!; + } + + GLTF getAsGLTF() { + return _gltf!; + } + + Geometry getAsGeometry() { + return _geometry!; + } +} diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/compatibility.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/callbacks.dart similarity index 95% rename from thermion_dart/lib/thermion_dart/compatibility/native/compatibility.dart rename to thermion_dart/lib/thermion_dart/viewer/ffi/callbacks.dart index 453f3bb4..c3bd3157 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/compatibility.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/callbacks.dart @@ -8,6 +8,11 @@ export 'thermion_dart.g.dart'; final allocator = calloc; +void using(Pointer ptr, Future Function(Pointer ptr) function) async { + await function.call(ptr); + allocator.free(ptr); +} + Future withVoidCallback( Function(Pointer>) func) async { final completer = Completer(); @@ -82,4 +87,3 @@ Future withCharPtrCallback( return completer.future; } -class Compatibility {} diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart similarity index 100% rename from thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart rename to thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart similarity index 94% rename from thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart rename to thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index dbed65dc..42c6e9de 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -1,19 +1,18 @@ import 'dart:async'; +import 'dart:ffi'; import 'dart:math'; import 'dart:typed_data'; import 'package:animation_tools_dart/animation_tools_dart.dart'; -import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; import 'package:thermion_dart/thermion_dart/entities/gizmo.dart'; -import 'package:thermion_dart/thermion_dart/matrix_helper.dart'; -import 'package:thermion_dart/thermion_dart/scene.dart'; + +import 'package:thermion_dart/thermion_dart/utils/matrix.dart'; +import 'package:thermion_dart/thermion_dart/viewer/events.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/callbacks.dart'; import 'package:vector_math/vector_math_64.dart'; import 'package:vector_math/vector_math_64.dart' as v64; -import 'thermion_viewer.dart'; -import 'scene_impl.dart'; +import '../thermion_viewer_base.dart'; import 'package:logging/logging.dart'; -typedef ThermionViewerImpl = ThermionViewerFFI; - // ignore: constant_identifier_names const ThermionEntity _FILAMENT_ASSET_ERROR = 0; @@ -26,9 +25,6 @@ double kFocalLength = 28.0; class ThermionViewerFFI extends ThermionViewer { final _logger = Logger("ThermionViewerFFI"); - SceneImpl? _scene; - Scene get scene => _scene!; - double pixelRatio = 1.0; Pointer? _sceneManager; @@ -48,12 +44,22 @@ class ThermionViewerFFI extends ThermionViewer { final _pickResultController = StreamController.broadcast(); + /// + /// + /// @override Stream get gizmoPickResult => _gizmoPickResultController.stream; final _gizmoPickResultController = StreamController.broadcast(); + /// + /// + /// + Stream get sceneUpdated => + _sceneUpdateEventController.stream; + final _sceneUpdateEventController = StreamController.broadcast(); + final Pointer resourceLoader; var _driver = nullptr.cast(); @@ -150,7 +156,6 @@ class ThermionViewerFFI extends ThermionViewer { } _sceneManager = get_scene_manager(_viewer!); - _scene = SceneImpl(this); await setCameraManipulatorOptions(zoomSpeed: 1.0); @@ -229,13 +234,14 @@ class ThermionViewerFFI extends ThermionViewer { await setRendering(false); await clearEntities(); await clearLights(); - await _scene!.dispose(); - _scene = null; + destroy_filament_viewer_ffi(_viewer!); _sceneManager = null; _viewer = null; await _pickResultController.close(); + await _gizmoPickResultController.close(); + await _sceneUpdateEventController.close(); for (final callback in _onDispose) { await callback.call(); @@ -393,7 +399,38 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("Failed to add light to scene"); } - _scene!.registerLight(entity); + return entity; + } + + /// + /// + /// + @override + Future addDirectLight(DirectLight directLight) async { + var entity = await withIntCallback((callback) => add_light_ffi( + _viewer!, + directLight.type.index, + directLight.color, + directLight.intensity, + directLight.position.x, + directLight.position.y, + directLight.position.z, + directLight.direction.x, + directLight.direction.y, + directLight.direction.z, + directLight.falloffRadius, + directLight.spotLightConeInner, + directLight.spotLightConeOuter, + directLight.sunAngularRadius, + directLight.sunHaloSize, + directLight.sunHaloFallof, + directLight.castShadows, + callback)); + if (entity == _FILAMENT_ASSET_ERROR) { + throw Exception("Failed to add light to scene"); + } + _sceneUpdateEventController + .add(SceneUpdateEvent.addDirectLight(entity, directLight)); return entity; } @@ -402,8 +439,8 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future removeLight(ThermionEntity entity) async { - _scene!.unregisterLight(entity); remove_light_ffi(_viewer!, entity); + _sceneUpdateEventController.add(SceneUpdateEvent.remove(entity)); } /// @@ -413,7 +450,7 @@ class ThermionViewerFFI extends ThermionViewer { Future clearLights() async { clear_lights_ffi(_viewer!); - _scene!.clearLights(); + _sceneUpdateEventController.add(SceneUpdateEvent.clearLights()); } /// @@ -468,7 +505,9 @@ class ThermionViewerFFI extends ThermionViewer { if (entity == _FILAMENT_ASSET_ERROR) { throw Exception("An error occurred loading the asset at $path"); } - _scene!.registerEntity(entity); + + _sceneUpdateEventController + .add(SceneUpdateEvent.addGltf(entity, GLTF(path, numInstances))); return entity; } @@ -494,7 +533,6 @@ class ThermionViewerFFI extends ThermionViewer { if (entity == _FILAMENT_ASSET_ERROR) { throw Exception("An error occurred loading GLB from buffer"); } - _scene!.registerEntity(entity); return entity; } @@ -514,7 +552,6 @@ class ThermionViewerFFI extends ThermionViewer { if (entity == _FILAMENT_ASSET_ERROR) { throw Exception("An error occurred loading the asset at $path"); } - _scene!.registerEntity(entity); return entity; } @@ -995,10 +1032,9 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future removeEntity(ThermionEntity entity) async { - _scene!.unregisterEntity(entity); - await withVoidCallback( (callback) => remove_entity_ffi(_viewer!, entity, callback)); + _sceneUpdateEventController.add(SceneUpdateEvent.remove(entity)); } /// @@ -1012,7 +1048,6 @@ class ThermionViewerFFI extends ThermionViewer { await withVoidCallback((callback) { clear_entities_ffi(_viewer!, callback); }); - _scene!.clearEntities(); } /// @@ -1498,7 +1533,6 @@ class ThermionViewerFFI extends ThermionViewer { x: (x / pixelRatio).toDouble(), y: (viewportDimensions.$2 - y) / pixelRatio )); - _scene!.registerSelected(entityId); } void _onGizmoPickResult(ThermionEntity entityId, int x, int y) { @@ -1519,8 +1553,6 @@ class ThermionViewerFFI extends ThermionViewer { /// @override void pick(int x, int y) async { - _scene!.unregisterSelected(); - x = (x * pixelRatio).ceil(); y = (viewportDimensions.$2 - (y * pixelRatio)).ceil(); @@ -1787,33 +1819,29 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future createGeometry( - List vertices, List indices, - {String? materialPath, - List? normals, - bool keepData = false, - PrimitiveType primitiveType = PrimitiveType.TRIANGLES}) async { + Future createGeometry(Geometry geometry, + {bool keepData = false}) async { if (_viewer == null) { throw Exception("Viewer must not be null"); } final materialPathPtr = - materialPath?.toNativeUtf8(allocator: allocator) ?? nullptr; - final vertexPtr = allocator(vertices.length); - final indicesPtr = allocator(indices.length); - for (int i = 0; i < vertices.length; i++) { - vertexPtr[i] = vertices[i]; + geometry.materialPath?.toNativeUtf8(allocator: allocator) ?? nullptr; + final vertexPtr = allocator(geometry.vertices.length); + final indicesPtr = allocator(geometry.indices.length); + for (int i = 0; i < geometry.vertices.length; i++) { + vertexPtr[i] = geometry.vertices[i]; } - for (int i = 0; i < indices.length; i++) { - (indicesPtr + i).value = indices[i]; + for (int i = 0; i < geometry.indices.length; i++) { + (indicesPtr + i).value = geometry.indices[i]; } var normalsPtr = nullptr.cast(); - if (normals != null) { - normalsPtr = allocator(normals.length); - for (int i = 0; i < normals.length; i++) { - normalsPtr[i] = normals[i]; + if (geometry.normals != null) { + normalsPtr = allocator(geometry.normals!.length); + for (int i = 0; i < geometry.normals!.length; i++) { + normalsPtr[i] = geometry.normals![i]; } } @@ -1821,12 +1849,12 @@ class ThermionViewerFFI extends ThermionViewer { create_geometry_with_normals_ffi( _sceneManager!, vertexPtr, - vertices.length, + geometry.vertices.length, normalsPtr, - normals?.length ?? 0, + geometry.normals?.length ?? 0, indicesPtr, - indices.length, - primitiveType.index, + geometry.indices.length, + geometry.primitiveType.index, materialPathPtr.cast(), keepData, callback)); @@ -1834,16 +1862,17 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("Failed to create geometry"); } - _scene!.registerEntity(entity); - allocator.free(materialPathPtr); allocator.free(vertexPtr); allocator.free(indicesPtr); - if (normals != null) { + if (geometry.normals != null) { allocator.free(normalsPtr); } + _sceneUpdateEventController + .add(SceneUpdateEvent.addGeometry(entity, geometry)); + return entity; } @@ -1968,8 +1997,8 @@ class ThermionViewerFFI extends ThermionViewer { struct.y = f2; struct.z = f3; struct.w = f3; - set_material_property_float4(_sceneManager!, entity, materialIndex, - ptr.cast(), struct); + set_material_property_float4( + _sceneManager!, entity, materialIndex, ptr.cast(), struct); allocator.free(ptr); } } diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart new file mode 100644 index 00000000..637bb800 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart @@ -0,0 +1,9 @@ +library; + +export 'geometry.dart'; +export 'gltf.dart'; + +export 'light_options.dart'; + +// a handle that can be safely passed back to the rendering layer to manipulate an Entity +typedef ThermionEntity = int; diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/entity.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/entity.dart new file mode 100644 index 00000000..e69de29b diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart new file mode 100644 index 00000000..b6fa4f96 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart @@ -0,0 +1,19 @@ +import 'package:thermion_dart/thermion_dart/viewer/thermion_viewer_base.dart'; + +class Geometry { + final List vertices; + final List indices; + final List? normals; + final List<(double, double)>? uvs; + final PrimitiveType primitiveType; + final String? materialPath; + + Geometry(this.vertices, this.indices, { this.normals=null, this.uvs=null, + this.primitiveType = PrimitiveType.TRIANGLES, this.materialPath = null}); + + void scale(double factor) { + for (int i = 0; i < vertices.length; i++) { + vertices[i] = vertices[i] * factor; + } + } +} diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/gltf.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/gltf.dart new file mode 100644 index 00000000..1189c38e --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/gltf.dart @@ -0,0 +1,6 @@ +class GLTF { + final String uri; + final int numInstances; + + GLTF(this.uri, this.numInstances); +} diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/light.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/light.dart new file mode 100644 index 00000000..9075911b --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/light.dart @@ -0,0 +1,7 @@ +enum LightType { + SUN, //!< Directional light that also draws a sun's disk in the sky. + DIRECTIONAL, //!< Directional light, emits light in a given direction. + POINT, //!< Point light, emits light from a position, in all directions. + FOCUSED_SPOT, //!< Physically correct spot light. + SPOT, +} \ No newline at end of file diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart new file mode 100644 index 00000000..1bbe3c84 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart @@ -0,0 +1,56 @@ +import 'dart:math'; +import 'package:vector_math/vector_math_64.dart' as v; +import 'package:vector_math/vector_math_64.dart'; +import 'light.dart'; + +class IBL { + String? iblPath; + final double iblIntensity; + + IBL(this.iblIntensity); +} + +class DirectLight { + final LightType type; + final double color; + final double intensity; + final bool castShadows; + late final v.Vector3 position; + late final v.Vector3 direction; + final double falloffRadius; + final double spotLightConeInner; + final double spotLightConeOuter; + final double sunAngularRadius; + final double sunHaloSize; + final double sunHaloFallof; + + DirectLight({ + required this.type, + required this.color, + required this.intensity, + this.castShadows = false, + required this.direction, + required this.position, + this.falloffRadius = 1.0, + this.spotLightConeInner = pi / 8, + this.spotLightConeOuter = pi / 4, + this.sunAngularRadius = 0.545, + this.sunHaloSize = 10.0, + this.sunHaloFallof = 80.0, + }); +DirectLight.point({ + double color = 6500, + double intensity = 100000, + bool castShadows = false, + Vector3? position, + double falloffRadius = 1.0, +}) : this( + type: LightType.POINT, + color: color, + intensity: intensity, + castShadows: castShadows, + position: position ?? Vector3(0, 1, 0), + direction: Vector3.zero(), + falloffRadius: falloffRadius, +); +} diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/manipulator.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/manipulator.dart new file mode 100644 index 00000000..21350980 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/manipulator.dart @@ -0,0 +1,4 @@ +// see filament Manipulator.h for more details +@Deprecated( + "This is used the native pointer manipulator Prefer ThermionGestureHandler instead") +enum ManipulatorMode { ORBIT, MAP, FREE_FLIGHT } diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/pick_result.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/pick_result.dart new file mode 100644 index 00000000..a3d9ac31 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/pick_result.dart @@ -0,0 +1,4 @@ +// "picking" means clicking/tapping on the viewport, and unprojecting the X/Y coordinate to determine whether any renderable entities were present at those coordinates. +import 'package:thermion_dart/thermion_dart/viewer/shared_types/shared_types.dart'; + +typedef FilamentPickResult = ({ThermionEntity entity, double x, double y}); \ No newline at end of file diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/primitive.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/primitive.dart new file mode 100644 index 00000000..6763d0a0 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/primitive.dart @@ -0,0 +1,10 @@ +// copied from filament/backened/DriverEnums.h +enum PrimitiveType { + // don't change the enums values (made to match GL) + POINTS, //!< points + LINES, //!< lines + UNUSED1, + LINE_STRIP, //!< line strip + TRIANGLES, //!< triangles + TRIANGLE_STRIP, //!< triangle strip +} \ No newline at end of file diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/shadow.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/shadow.dart new file mode 100644 index 00000000..a8ac9ba5 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/shadow.dart @@ -0,0 +1,6 @@ +enum ShadowType { + PCF, //!< percentage-closer filtered shadows (default) + VSM, //!< variance shadows + DPCF, //!< PCF with contact hardening simulation + PCSS, //!< PCF with soft shadows and contact hardening +} \ No newline at end of file diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/shared_types.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/shared_types.dart new file mode 100644 index 00000000..c41d441e --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/shared_types.dart @@ -0,0 +1,10 @@ +library shared_types; + +export 'entities.dart'; +export 'light.dart'; +export 'shadow.dart'; +export 'manipulator.dart'; +export 'pick_result.dart'; +export 'primitive.dart'; +export 'texture_details.dart'; +export 'tone_mapper.dart'; diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/texture_details.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/texture_details.dart new file mode 100644 index 00000000..ffbcdfa9 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/texture_details.dart @@ -0,0 +1,14 @@ +/// +/// This represents the backing "surface" that we render into. +/// "Texture" here is a misnomer as it is only a render target texture on certain platforms. +/// +class TextureDetails { + final int textureId; + + // both width and height are in physical, not logical pixels + final int width; + final int height; + + TextureDetails( + {required this.textureId, required this.width, required this.height}); +} diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/tone_mapper.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/tone_mapper.dart new file mode 100644 index 00000000..a6e1ca69 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/tone_mapper.dart @@ -0,0 +1 @@ +enum ToneMapper { ACES, FILMIC, LINEAR } diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart new file mode 100644 index 00000000..621e64c5 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart @@ -0,0 +1,856 @@ +import 'package:thermion_dart/thermion_dart/viewer/events.dart'; + +import 'shared_types/shared_types.dart'; +export 'shared_types/shared_types.dart'; + +import 'dart:math'; +import 'dart:typed_data'; +import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; +import 'package:vector_math/vector_math_64.dart'; +import 'dart:async'; +import 'package:animation_tools_dart/animation_tools_dart.dart'; + +abstract class ThermionViewer { + + /// + /// A Future that resolves when the underlying rendering context has been successfully created. + /// + Future get initialized; + + /// + /// The current dimensions of the viewport (in physical pixels). + /// + var viewportDimensions = (0.0, 0.0); + + /// + /// The current ratio of logical to physical pixels. + /// + late double pixelRatio; + + /// + /// The result(s) of calling [pick] (see below). + /// This may be a broadcast stream, so you should ensure you have subscribed to this stream before calling [pick]. + /// If [pick] is called without an active subscription to this stream, the results will be silently discarded. + /// + Stream get pickResult; + + /// + /// The result(s) of calling [pickGizmo] (see below). + /// + Stream get gizmoPickResult; + + /// + /// A Stream containing entities added/removed to/from to the scene. + /// + Stream get sceneUpdated; + + /// + /// Whether the controller is currently rendering at [framerate]. + /// + bool get rendering; + + /// + /// Set to true to continuously render the scene at the framerate specified by [setFrameRate] (60 fps by default). + /// + Future setRendering(bool render); + + /// + /// Render a single frame. + /// + Future render(); + + /// + /// Render a single frame to the viewport and copy the pixel buffer to [out]. + /// + Future capture(); + + /// + /// Sets the framerate for continuous rendering when [setRendering] is enabled. + /// + Future setFrameRate(int framerate); + + /// + /// Destroys/disposes the viewer (including the entire scene). You cannot use the viewer after calling this method. + /// + Future dispose(); + + /// + /// Set the background image to [path] (which should have a file extension .png, .jpg, or .ktx). + /// This will be rendered at the maximum depth (i.e. behind all other objects including the skybox). + /// If [fillHeight] is false, the image will be rendered at its original size. Note this may cause issues with pixel density so be sure to specify the correct resolution + /// If [fillHeight] is true, the image will be stretched/compressed to fit the height of the viewport. + /// + Future setBackgroundImage(String path, {bool fillHeight = false}); + + /// + /// Moves the background image to the relative offset from the origin (bottom-left) specified by [x] and [y]. + /// If [clamp] is true, the image cannot be positioned outside the bounds of the viewport. + /// + Future setBackgroundImagePosition(double x, double y, {bool clamp = false}); + + /// + /// Removes the background image. + /// + Future clearBackgroundImage(); + + /// + /// Sets the color for the background plane (positioned at the maximum depth, i.e. behind all other objects including the skybox). + /// + Future setBackgroundColor(double r, double g, double b, double alpha); + + /// + /// Load a skybox from [skyboxPath] (which must be a .ktx file) + /// + Future loadSkybox(String skyboxPath); + + /// + /// Removes the skybox from the scene. + /// + Future removeSkybox(); + + /// + /// Creates an indirect light by loading the reflections/irradiance from the KTX file. + /// Only one indirect light can be active at any given time; if an indirect light has already been loaded, it will be replaced. + /// + Future loadIbl(String lightingPath, {double intensity = 30000}); + + /// + /// Creates a indirect light with the given color. + /// Only one indirect light can be active at any given time; if an indirect light has already been loaded, it will be replaced. + /// + Future createIbl(double r, double g, double b, double intensity); + + /// + /// Rotates the IBL & skybox. + /// + Future rotateIbl(Matrix3 rotation); + + /// + /// Removes the image-based light from the scene. + /// + Future removeIbl(); + + /// + /// Add a light to the scene. + /// See LightManager.h for details + /// Note that [sunAngularRadius] is in degrees, + /// whereas [spotLightConeInner] and [spotLightConeOuter] are in radians + /// + @Deprecated("This will be removed in future versions. Use addDirectLight instead.") + Future addLight( + LightType type, + double colour, + double intensity, + double posX, + double posY, + double posZ, + double dirX, + double dirY, + double dirZ, + {double falloffRadius = 1.0, + double spotLightConeInner = pi / 8, + double spotLightConeOuter = pi / 4, + double sunAngularRadius = 0.545, + double sunHaloSize = 10.0, + double sunHaloFallof = 80.0, + bool castShadows = true}); + + /// + /// Adds a direct light to the scene. + /// See LightManager.h for details + /// Note that [sunAngularRadius] is in degrees, + /// whereas [spotLightConeInner] and [spotLightConeOuter] are in radians + /// + Future addDirectLight( + DirectLight light); + + /// + /// Remove a light from the scene. + /// + Future removeLight(ThermionEntity light); + + /// + /// Remove all lights (excluding IBL) from the scene. + /// + Future clearLights(); + + /// + /// Load the .glb asset at the given path and insert into the scene. + /// Specify [numInstances] to create multiple instances (this is more efficient than dynamically instantating at a later time). You can then retrieve the created instances with [getInstances]. + /// If you want to be able to call [createInstance] at a later time, you must pass true for [keepData]. + /// If [keepData] is false, the source glTF data will be released and [createInstance] will throw an exception. + /// + Future loadGlb(String path, + {int numInstances = 1, bool keepData = false}); + + /// + /// Load the .glb asset from the specified buffer and insert into the scene. + /// Specify [numInstances] to create multiple instances (this is more efficient than dynamically instantating at a later time). You can then retrieve the created instances with [getInstances]. + /// If you want to be able to call [createInstance] at a later time, you must pass true for [keepData]. + /// If [keepData] is false, the source glTF data will be released and [createInstance] will throw an exception. + /// + Future loadGlbFromBuffer(Uint8List data, + {int numInstances = 1, bool keepData = false}); + + /// + /// Create a new instance of [entity]. + /// + Future createInstance(ThermionEntity entity); + + /// + /// Returns the number of instances of the asset associated with [entity]. + /// + Future getInstanceCount(ThermionEntity entity); + + /// + /// Returns all instances of [entity]. + /// + Future> getInstances(ThermionEntity entity); + + /// + /// Load the .gltf asset at the given path and insert into the scene. + /// [relativeResourcePath] is the folder path where the glTF resources are stored; + /// this is usually the parent directory of the .gltf file itself. + /// + /// See [loadGlb] for an explanation of [keepData]. + /// + Future loadGltf(String path, String relativeResourcePath, + {bool keepData = false}); + + /// + /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. + /// + Future panStart(double x, double y); + + /// + /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. + /// + Future panUpdate(double x, double y); + + /// + /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. + /// + Future panEnd(); + + /// + /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. + /// + Future rotateStart(double x, double y); + + /// + /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. + /// + Future rotateUpdate(double x, double y); + + /// + /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. + /// + Future rotateEnd(); + + /// + /// Set the weights for all morph targets in [entity] to [weights]. + /// Note that [weights] must contain values for ALL morph targets, but no exception will be thrown if you don't do so (you'll just get incorrect results). + /// If you only want to set one value, set all others to zero (check [getMorphTargetNames] if you need the get a list of all morph targets). + /// IMPORTANT - this accepts the actual ThermionEntity with the relevant morph targets (unlike [getMorphTargetNames], which uses the parent entity and the child mesh name). + /// Use [getChildEntityByName] if you are setting the weights for a child mesh. + /// + Future setMorphTargetWeights(ThermionEntity entity, List weights); + + /// + /// Gets the names of all morph targets for the child renderable [childEntity] under [entity]. + /// + Future> getMorphTargetNames( + ThermionEntity entity, ThermionEntity childEntity); + + /// + /// Gets the names of all bones for the armature at [skinIndex] under the specified [entity]. + /// + Future> getBoneNames(ThermionEntity entity, {int skinIndex = 0}); + + /// + /// Gets the names of all glTF animations embedded in the specified entity. + /// + Future> getAnimationNames(ThermionEntity entity); + + /// + /// Returns the length (in seconds) of the animation at the given index. + /// + Future getAnimationDuration( + ThermionEntity entity, int animationIndex); + + /// + /// Animate the morph targets in [entity]. See [MorphTargetAnimation] for an explanation as to how to construct the animation frame data. + /// This method will check the morph target names specified in [animation] against the morph target names that actually exist exist under [meshName] in [entity], + /// throwing an exception if any cannot be found. + /// It is permissible for [animation] to omit any targets that do exist under [meshName]; these simply won't be animated. + /// + Future setMorphAnimationData( + ThermionEntity entity, MorphAnimationData animation, + {List? targetMeshNames}); + + /// + /// Clear all current morph animations for [entity]. + /// + Future clearMorphAnimationData(ThermionEntity entity); + + /// + /// Resets all bones in the given entity to their rest pose. + /// This should be done before every call to addBoneAnimation. + /// + Future resetBones(ThermionEntity entity); + + /// + /// Enqueues and plays the [animation] for the specified bone(s). + /// By default, frame data is interpreted as being in *parent* bone space; + /// a 45 degree around Y means the bone will rotate 45 degrees around the + /// Y axis of the parent bone *in its current orientation*. + /// (i.e NOT the parent bone's rest position!). + /// Currently, only [Space.ParentBone] and [Space.Model] are supported; if you want + /// to transform to another space, you will need to do so manually. + /// + /// [fadeInInSecs]/[fadeOutInSecs]/[maxDelta] are used to cross-fade between + /// the current active glTF animation ("animation1") and the animation you + /// set via this method ("animation2"). The bone orientations will be + /// linearly interpolated between animation1 and animation2; at time 0, + /// the orientation will be 100% animation1, at time [fadeInInSecs], the + /// animation will be ((1 - maxDelta) * animation1) + (maxDelta * animation2). + /// This will be applied in reverse after [fadeOutInSecs]. + /// + /// + Future addBoneAnimation(ThermionEntity entity, BoneAnimationData animation, + {int skinIndex = 0, + double fadeInInSecs = 0.0, + double fadeOutInSecs = 0.0, + double maxDelta = 1.0}); + + /// + /// Gets the entity representing the bone at [boneIndex]/[skinIndex]. + /// The returned entity is only intended for use with [getWorldTransform]. + /// + Future getBone(ThermionEntity parent, int boneIndex, + {int skinIndex = 0}); + + /// + /// Gets the local (relative to parent) transform for [entity]. + /// + Future getLocalTransform(ThermionEntity entity); + + /// + /// Gets the world transform for [entity]. + /// + Future getWorldTransform(ThermionEntity entity); + + /// + /// Gets the inverse bind (pose) matrix for the bone. + /// Note that [parent] must be the ThermionEntity returned by [loadGlb/loadGltf], not any other method ([getChildEntity] etc). + /// This is because all joint information is internally stored with the parent entity. + /// + Future getInverseBindMatrix(ThermionEntity parent, int boneIndex, + {int skinIndex = 0}); + + /// + /// Sets the transform (relative to its parent) for [entity]. + /// + Future setTransform(ThermionEntity entity, Matrix4 transform); + + /// + /// Updates the bone matrices for [entity] (which must be the ThermionEntity + /// returned by [loadGlb/loadGltf]). + /// Under the hood, this just calls [updateBoneMatrices] on the Animator + /// instance of the relevant FilamentInstance (which uses the local + /// bone transform and the inverse bind matrix to set the bone matrix). + /// + Future updateBoneMatrices(ThermionEntity entity); + + /// + /// Directly set the bone matrix for the bone at the given index. + /// Don't call this manually unless you know what you're doing. + /// + Future setBoneTransform( + ThermionEntity entity, int boneIndex, Matrix4 transform, + {int skinIndex = 0}); + + /// + /// Removes/destroys the specified entity from the scene. + /// [entity] will no longer be a valid handle after this method is called; ensure you immediately discard all references once this method is complete. + /// + Future removeEntity(ThermionEntity entity); + + /// + /// Removes/destroys all renderable entities from the scene (including cameras). + /// All [ThermionEntity] handles will no longer be valid after this method is called; ensure you immediately discard all references to all entities once this method is complete. + /// + Future clearEntities(); + + /// + /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. + /// + Future zoomBegin(); + + /// + /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. + /// + Future zoomUpdate(double x, double y, double z); + + /// + /// Called by `FilamentGestureDetector`. You probably don't want to call this yourself. + /// + Future zoomEnd(); + + /// + /// Schedules the glTF animation at [index] in [entity] to start playing on the next frame. + /// + Future playAnimation(ThermionEntity entity, int index, + {bool loop = false, + bool reverse = false, + bool replaceActive = true, + double crossfade = 0.0, + double startOffset = 0.0}); + + /// + /// Schedules the glTF animation at [index] in [entity] to start playing on the next frame. + /// + Future playAnimationByName(ThermionEntity entity, String name, + {bool loop = false, + bool reverse = false, + bool replaceActive = true, + double crossfade = 0.0}); + + Future setAnimationFrame( + ThermionEntity entity, int index, int animationFrame); + + Future stopAnimation(ThermionEntity entity, int animationIndex); + Future stopAnimationByName(ThermionEntity entity, String name); + + /// + /// Sets the current scene camera to the glTF camera under [name] in [entity]. + /// + Future setCamera(ThermionEntity entity, String? name); + + /// + /// Sets the current scene camera to the main camera (which is always available and added to every scene by default). + /// + Future setMainCamera(); + + /// + /// Returns the entity associated with the main camera. + /// + Future getMainCamera(); + + /// + /// Sets the horizontal field of view (if [horizontal] is true) or vertical field of view for the currently active camera to [degrees]. + /// The aspect ratio of the current viewport is used. + /// + Future setCameraFov(double degrees, {bool horizontal = true}); + + /// + /// Gets the field of view (in degrees). + /// + Future getCameraFov(bool horizontal); + + /// + /// Sets the tone mapping (requires postprocessing). + /// + Future setToneMapping(ToneMapper mapper); + + /// + /// Sets the strength of the bloom. + /// + Future setBloom(double bloom); + + /// + /// Sets the focal length of the camera. Default value is 28.0. + /// + Future setCameraFocalLength(double focalLength); + + /// + /// Sets the distance (in world units) to the near/far planes for the active camera. Default values are 0.05/1000.0. See Camera.h for details. + /// + Future setCameraCulling(double near, double far); + + /// + /// Get the distance (in world units) to the near plane for the active camera. + /// + @Deprecated("Use getCameraNear") + Future getCameraCullingNear(); + + /// + /// Get the distance (in world units) to the near plane for the active camera. + /// + Future getCameraNear(); + + /// + /// Get the distance (in world units) to the far culling plane for the active camera. + /// + Future getCameraCullingFar(); + + /// + /// + /// + Future setCameraLensProjection( + double near, double far, double aspect, double focalLength); + + /// + /// Sets the focus distance for the camera. + /// + Future setCameraFocusDistance(double focusDistance); + + /// + /// Get the camera position in world space. + /// + Future getCameraPosition(); + + /// + /// Get the camera's model matrix. + /// + Future getCameraModelMatrix(); + + /// + /// Get the camera's view matrix. See Camera.h for more details. + /// + Future getCameraViewMatrix(); + + /// + /// Get the camera's projection matrix. See Camera.h for more details. + /// + Future getCameraProjectionMatrix(); + + /// + /// Get the camera's culling projection matrix. See Camera.h for more details. + /// + Future getCameraCullingProjectionMatrix(); + + /// + /// Get the camera's culling frustum in world space. Returns a (vector_math) [Frustum] instance where plane0-plane6 define the left, right, bottom, top, far and near planes respectively. + /// See Camera.h and (filament) Frustum.h for more details. + /// + Future getCameraFrustum(); + + /// + /// Set the camera position in world space. Note this is not persistent - any viewport navigation will reset the camera transform. + /// + Future setCameraPosition(double x, double y, double z); + + /// + /// Get the camera rotation matrix. + /// + Future getCameraRotation(); + + /// + /// Repositions the camera to the last vertex of the bounding box of [entity], looking at the penultimate vertex. + /// + Future moveCameraToAsset(ThermionEntity entity); + + /// + /// Enables/disables frustum culling. Currently we don't expose a method for manipulating the camera projection/culling matrices so this is your only option to deal with unwanted near/far clipping. + /// + Future setViewFrustumCulling(bool enabled); + + /// + /// Sets the camera exposure. + /// + Future setCameraExposure( + double aperture, double shutterSpeed, double sensitivity); + + /// + /// Rotate the camera by [rads] around the given axis. + /// + Future setCameraRotation(Quaternion quaternion); + + /// + /// Sets the camera model matrix. + /// + @Deprecated("Will be superseded by setCameraModelMatrix4") + Future setCameraModelMatrix(List matrix); + + /// + /// Sets the camera model matrix. + /// + Future setCameraModelMatrix4(Matrix4 matrix); + + /// + /// Sets the `baseColorFactor` property for the material at index [materialIndex] in [entity] under node [meshName] to [color]. + /// + @Deprecated("Use setMaterialPropertyFloat4 instead") + Future setMaterialColor(ThermionEntity entity, String meshName, + int materialIndex, double r, double g, double b, double a); + + /// + /// Sets the material property [propertyName] under material [materialIndex] for [entity] to [value]. + /// [entity] must have a Renderable attached. + /// + Future setMaterialPropertyFloat4(ThermionEntity entity, String propertyName, + int materialIndex, double f1, double f2, double f3, double f4); + + /// + /// Sets the material property [propertyName] under material [materialIndex] for [entity] to [value]. + /// [entity] must have a Renderable attached. + /// + Future setMaterialPropertyFloat(ThermionEntity entity, String propertyName, + int materialIndex, double value); + + /// + /// Scale [entity] to fit within the unit cube. + /// + Future transformToUnitCube(ThermionEntity entity); + + /// + /// Directly sets the world space position for [entity] to the given coordinates. + /// + Future setPosition(ThermionEntity entity, double x, double y, double z); + + /// + /// Set the world space position for [lightEntity] to the given coordinates. + /// + Future setLightPosition( + ThermionEntity lightEntity, double x, double y, double z); + + /// + /// Sets the world space direction for [lightEntity] to the given vector. + /// + Future setLightDirection(ThermionEntity lightEntity, Vector3 direction); + + /// + /// Directly sets the scale for [entity], skipping all collision detection. + /// + Future setScale(ThermionEntity entity, double scale); + + /// + /// Directly sets the rotation for [entity] to [rads] around the axis {x,y,z}, skipping all collision detection. + /// + Future setRotation( + ThermionEntity entity, double rads, double x, double y, double z); + + /// + /// Queues an update to the worldspace position for [entity] to {x,y,z}. + /// The actual update will occur on the next frame, and will be subject to collision detection. + /// + Future queuePositionUpdate( + ThermionEntity entity, double x, double y, double z, + {bool relative = false}); + + /// + /// TODO + /// + Future queuePositionUpdateFromViewportCoords( + ThermionEntity entity, double x, double y); + + /// + /// TODO + /// + Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, + double viewportX, double viewportY, double x, double y, double z); + + /// + /// Queues an update to the worldspace rotation for [entity]. + /// The actual update will occur on the next frame, and will be subject to collision detection. + /// + Future queueRotationUpdate( + ThermionEntity entity, double rads, double x, double y, double z, + {bool relative = false}); + + /// + /// Same as [queueRotationUpdate]. + /// + Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion quat, + {bool relative = false}); + + /// + /// Enable/disable postprocessing (disabled by default). + /// + Future setPostProcessing(bool enabled); + + /// + /// Enable/disable shadows (disabled by default). + /// + Future setShadowsEnabled(bool enabled); + + /// + /// Set shadow type. + /// + Future setShadowType(ShadowType shadowType); + + /// + /// Set soft shadow options (ShadowType DPCF and PCSS) + /// + Future setSoftShadowOptions(double penumbraScale, double penumbraRatioScale); + + /// + /// Set antialiasing options. + /// + Future setAntiAliasing(bool msaa, bool fxaa, bool taa); + + /// + /// Sets the rotation for [entity] to the specified quaternion. + /// + Future setRotationQuat(ThermionEntity entity, Quaternion rotation); + + /// + /// Reveal the node [meshName] under [entity]. Only applicable if [hide] had previously been called; this is a no-op otherwise. + /// + Future reveal(ThermionEntity entity, String? meshName); + + /// + /// If [meshName] is provided, hide the node [meshName] under [entity], otherwise hide the root node for [entity]. + /// The entity still exists in memory, but is no longer being rendered into the scene. Call [reveal] to re-commence rendering. + /// + Future hide(ThermionEntity entity, String? meshName); + + /// + /// Used to select the entity in the scene at the given viewport coordinates. + /// Called by `FilamentGestureDetector` on a mouse/finger down event. You probably don't want to call this yourself. + /// This is asynchronous and will require 2-3 frames to complete - subscribe to the [pickResult] stream to receive the results of this method. + /// [x] and [y] must be in local logical coordinates (i.e. where 0,0 is at top-left of the ThermionWidget). + /// + void pick(int x, int y); + + /// + /// Used to test whether a Gizmo is at the given viewport coordinates. + /// Called by `FilamentGestureDetector` on a mouse/finger down event. You probably don't want to call this yourself. + /// This is asynchronous and will require 2-3 frames to complete - subscribe to the [gizmoPickResult] stream to receive the results of this method. + /// [x] and [y] must be in local logical coordinates (i.e. where 0,0 is at top-left of the ThermionWidget). + /// + void pickGizmo(int x, int y); + + /// + /// Retrieves the name assigned to the given ThermionEntity (usually corresponds to the glTF mesh name). + /// + String? getNameForEntity(ThermionEntity entity); + + /// + /// Sets the options for manipulating the camera via the viewport. + /// ManipulatorMode.FREE_FLIGHT and ManipulatorMode.MAP are currently unsupported and will throw an exception. + /// + @Deprecated("Use ThermionGestureHandler instead") + Future setCameraManipulatorOptions( + {ManipulatorMode mode = ManipulatorMode.ORBIT, + double orbitSpeedX = 0.01, + double orbitSpeedY = 0.01, + double zoomSpeed = 0.01}); + + /// + /// Returns all child entities under [parent]. + /// + Future> getChildEntities( + ThermionEntity parent, bool renderableOnly); + + /// + /// Finds the child entity named [childName] associated with the given parent. + /// Usually, [parent] will be the return value from [loadGlb]/[loadGltf] and [childName] will be the name of a node/mesh. + /// + Future getChildEntity( + ThermionEntity parent, String childName); + + /// + /// List the name of all child entities under the given entity. + /// + Future> getChildEntityNames(ThermionEntity entity, + {bool renderableOnly = true}); + + /// + /// If [recording] is set to true, each frame the framebuffer/texture will be written to /tmp/output_*.png. + /// This will impact performance; handle with care. + /// + Future setRecording(bool recording); + + /// + /// Sets the output directory where recorded PNGs will be placed. + /// + Future setRecordingOutputDirectory(String outputDirectory); + + /// + /// An [entity] will only be animatable after an animation component is attached. + /// Any calls to [playAnimation]/[setBoneAnimation]/[setMorphAnimation] will have no visual effect until [addAnimationComponent] has been called on the instance. + /// + Future addAnimationComponent(ThermionEntity entity); + + /// + /// Removes an animation component from [entity]. + /// + Future removeAnimationComponent(ThermionEntity entity); + + /// + /// Makes [entity] collidable. + /// This allows you to call [testCollisions] with any other entity ("entity B") to see if [entity] has collided with entity B. The callback will be invoked if so. + /// Alternatively, if [affectsTransform] is true and this entity collides with another entity, any queued position updates to the latter entity will be ignored. + /// + Future addCollisionComponent(ThermionEntity entity, + {void Function(int entityId1, int entityId2)? callback, + bool affectsTransform = false}); + + /// + /// Removes the collision component from [entity], meaning this will no longer be tested when [testCollisions] or [queuePositionUpdate] is called with another entity. + /// + Future removeCollisionComponent(ThermionEntity entity); + + /// + /// Creates a (renderable) entity with the specified geometry and adds to the scene. + /// If [keepData] is true, the source data will not be released. + /// + Future createGeometry(Geometry geometry, { bool keepData= false}); + + /// + /// Gets the parent entity of [entity]. Returns null if the entity has no parent. + /// + Future getParent(ThermionEntity entity); + + /// + /// Gets the ancestor (ultimate parent) entity of [entity]. Returns null if the entity has no parent. + /// + Future getAncestor(ThermionEntity entity); + + /// + /// Sets the parent transform of [child] to [parent]. + /// + Future setParent(ThermionEntity child, ThermionEntity parent, + {bool preserveScaling}); + + /// + /// Test all collidable entities against this entity to see if any have collided. + /// This method returns void; the relevant callback passed to [addCollisionComponent] will be fired if a collision is detected. + /// + Future testCollisions(ThermionEntity entity); + + /// + /// Sets the draw priority for the given entity. See RenderableManager.h for more details. + /// + Future setPriority(ThermionEntity entityId, int priority); + + /// + /// The gizmo for translating/rotating objects. Only one gizmo is present in the scene. + /// + AbstractGizmo? get gizmo; + + /// + /// Register a callback to be invoked when this viewer is disposed. + /// + void onDispose(Future Function() callback); + + /// + /// Gets the 2D bounding box (in viewport coordinates) for the given entity. + /// + Future getViewportBoundingBox(ThermionEntity entity); + + /// + /// Filament assigns renderables to a numeric layer. + /// We place all scene assets in layer 0 (enabled by default), gizmos in layer 1 (enabled by default), world grid in layer 2 (disabled by default). + /// Use this method to toggle visibility of the respective layer. + /// + Future setLayerEnabled(int layer, bool enabled); + + /// + /// Show/hide the translation gizmo. + /// + Future setGizmoVisibility(bool visible); + + /// + /// Renders an outline around [entity] with the given color. + /// + Future setStencilHighlight(ThermionEntity entity, + {double r = 1.0, double g = 0.0, double b = 0.0}); + + /// + /// Removes the outline around [entity]. Noop if there was no highlight. + /// + Future removeStencilHighlight(ThermionEntity entity); +} diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart similarity index 95% rename from thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart rename to thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart index 118c1746..f30e22a1 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart @@ -2,14 +2,13 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; -import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:thermion_dart/thermion_dart/viewer/events.dart'; +import 'package:thermion_dart/thermion_dart/viewer/thermion_viewer_base.dart'; import 'package:vector_math/vector_math_64.dart'; import 'dart:async'; import 'package:animation_tools_dart/animation_tools_dart.dart'; -typedef ThermionViewerImpl = ThermionViewerStub; - class ThermionViewerStub extends ThermionViewer { @override Future addAnimationComponent(ThermionEntity entity) { @@ -436,10 +435,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - // TODO: implement scene - Scene get scene => throw UnimplementedError(); - @override Future setAnimationFrame( ThermionEntity entity, int index, int animationFrame) { @@ -850,12 +845,7 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future createGeometry(List vertices, List indices, {String? materialPath, List? normals, PrimitiveType primitiveType = PrimitiveType.TRIANGLES}) { - // TODO: implement createGeometry - throw UnimplementedError(); - } - + @override Future loadGlb(String path, {int numInstances = 1, bool keepData = false}) { // TODO: implement loadGlb @@ -867,4 +857,34 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement loadGltf throw UnimplementedError(); } + + @override + Future setMaterialPropertyFloat(ThermionEntity entity, String propertyName, int materialIndex, double value) { + // TODO: implement setMaterialPropertyFloat + throw UnimplementedError(); + } + + @override + Future setMaterialPropertyFloat4(ThermionEntity entity, String propertyName, int materialIndex, double f1, double f2, double f3, double f4) { + // TODO: implement setMaterialPropertyFloat4 + throw UnimplementedError(); + } + + @override + Future createGeometry(Geometry geometry, {bool keepData=false}) { + // TODO: implement createGeometry + throw UnimplementedError(); + } + + @override + // TODO: implement sceneUpdated + Stream get sceneUpdated => throw UnimplementedError(); + + @override + Future addDirectLight(DirectLight light) { + // TODO: implement addDirectLight + throw UnimplementedError(); + } + + } diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart b/thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_dart_bridge.dart similarity index 99% rename from thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart rename to thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_dart_bridge.dart index 86413551..e88e1859 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart +++ b/thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_dart_bridge.dart @@ -3,7 +3,7 @@ library thermion_flutter_js; import 'dart:js_interop'; import 'package:logging/logging.dart'; -import 'package:thermion_dart/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart'; +import 'package:thermion_dart/thermion_dart/viewer/web/thermion_viewer_js_shim.dart'; import 'package:vector_math/vector_math_64.dart' as v64; import 'package:animation_tools_dart/animation_tools_dart.dart'; @@ -166,9 +166,9 @@ class ThermionViewerJSDartBridge { @JSExport() JSPromise loadGltf(String path, String relativeResourcePath, - {bool force = false}) { + {bool keepData = false}) { return viewer - .loadGltf(path, relativeResourcePath, force: force) + .loadGltf(path, relativeResourcePath, keepData: keepData) .then((entity) => entity.toJS) .toJS; } diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart b/thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_js.dart similarity index 90% rename from thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart rename to thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_js.dart index b44fde87..f40e0765 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart +++ b/thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_js.dart @@ -9,7 +9,6 @@ import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; -import 'package:thermion_dart/thermion_dart/scene_impl.dart'; import 'package:vector_math/vector_math_64.dart'; import 'thermion_viewer_js_shim.dart'; @@ -911,4 +910,98 @@ class ThermionViewerJS implements ThermionViewer { // TODO: implement setLayerEnabled throw UnimplementedError(); } + + @override + // TODO: implement entitiesAdded + Stream get entitiesAdded => throw UnimplementedError(); + + @override + // TODO: implement entitiesRemoved + Stream get entitiesRemoved => throw UnimplementedError(); + + @override + Future getAncestor(ThermionEntity entity) { + // TODO: implement getAncestor + throw UnimplementedError(); + } + + @override + Future getCameraNear() { + // TODO: implement getCameraNear + throw UnimplementedError(); + } + + @override + Future getViewportBoundingBox(ThermionEntity entity) { + // TODO: implement getViewportBoundingBox + throw UnimplementedError(); + } + + @override + // TODO: implement lightsAdded + Stream get lightsAdded => throw UnimplementedError(); + + @override + // TODO: implement lightsRemoved + Stream get lightsRemoved => throw UnimplementedError(); + + @override + Future loadGlbFromBuffer(Uint8List data, {int numInstances = 1, bool keepData = false}) { + // TODO: implement loadGlbFromBuffer + throw UnimplementedError(); + } + + @override + Future queuePositionUpdateFromViewportCoords(ThermionEntity entity, double x, double y) { + // TODO: implement queuePositionUpdateFromViewportCoords + throw UnimplementedError(); + } + + @override + Future removeStencilHighlight(ThermionEntity entity) { + // TODO: implement removeStencilHighlight + throw UnimplementedError(); + } + + @override + Future setCameraLensProjection(double near, double far, double aspect, double focalLength) { + // TODO: implement setCameraLensProjection + throw UnimplementedError(); + } + + @override + Future setCameraModelMatrix4(Matrix4 matrix) { + // TODO: implement setCameraModelMatrix4 + throw UnimplementedError(); + } + + @override + Future setLightDirection(ThermionEntity lightEntity, Vector3 direction) { + // TODO: implement setLightDirection + throw UnimplementedError(); + } + + @override + Future setLightPosition(ThermionEntity lightEntity, double x, double y, double z) { + // TODO: implement setLightPosition + throw UnimplementedError(); + } + + @override + Future setMaterialPropertyFloat(ThermionEntity entity, String propertyName, int materialIndex, double value) { + // TODO: implement setMaterialPropertyFloat + throw UnimplementedError(); + } + + @override + Future setMaterialPropertyFloat4(ThermionEntity entity, String propertyName, int materialIndex, double f1, double f2, double f3, double f4) { + // TODO: implement setMaterialPropertyFloat4 + throw UnimplementedError(); + } + + @override + Future setStencilHighlight(ThermionEntity entity, {double r = 1.0, double g = 0.0, double b = 0.0}) { + // TODO: implement setStencilHighlight + throw UnimplementedError(); + } } diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart b/thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_js_shim.dart similarity index 100% rename from thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart rename to thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_js_shim.dart diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart b/thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_wasm.dart similarity index 96% rename from thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart rename to thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_wasm.dart index 9c758c45..0ebb0399 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart +++ b/thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_wasm.dart @@ -185,7 +185,6 @@ class ThermionViewerWasm implements ThermionViewer { _width = (width * pixelRatio).ceil(); _height = (height * pixelRatio).ceil(); viewportDimensions = (_width.toDouble(), _height.toDouble()); - print("Update viewport camera projection : $_width $height"); _module!.ccall( "update_viewport_and_camera_projection", "void", @@ -718,7 +717,7 @@ class ThermionViewerWasm implements ThermionViewer { } @override - Future loadGlb(String path, {int numInstances = 1}) async { + Future loadGlb(String path, {int numInstances = 1, bool keepData = false}) async { final promise = _module!.ccall( "load_glb", "int", @@ -733,8 +732,7 @@ class ThermionViewerWasm implements ThermionViewer { } @override - Future loadGltf(String path, String relativeResourcePath, - {bool force = false}) async { + Future loadGltf(String path, String relativeResourcePath, { bool keepData = false}) async { final promise = _module!.ccall( "load_gltf", "int", @@ -2280,4 +2278,80 @@ class ThermionViewerWasm implements ThermionViewer { .toJS, null); } + + @override + Future getAncestor(ThermionEntity entity) { + // TODO: implement getAncestor + throw UnimplementedError(); + } + + @override + Future queuePositionUpdateFromViewportCoords(ThermionEntity entity, double x, double y) { + // TODO: implement queuePositionUpdateFromViewportCoords + throw UnimplementedError(); + } + + @override + Future removeStencilHighlight(ThermionEntity entity) { + // TODO: implement removeStencilHighlight + throw UnimplementedError(); + } + + @override + Future setStencilHighlight(ThermionEntity entity, {double r = 1.0, double g = 0.0, double b = 0.0}) { + // TODO: implement setStencilHighlight + throw UnimplementedError(); + } + + @override + // TODO: implement entitiesAdded + Stream get entitiesAdded => throw UnimplementedError(); + + @override + // TODO: implement entitiesRemoved + Stream get entitiesRemoved => throw UnimplementedError(); + + @override + Future getCameraNear() { + // TODO: implement getCameraNear + throw UnimplementedError(); + } + + @override + Future getViewportBoundingBox(ThermionEntity entity) { + // TODO: implement getViewportBoundingBox + throw UnimplementedError(); + } + + @override + // TODO: implement lightsAdded + Stream get lightsAdded => throw UnimplementedError(); + + @override + // TODO: implement lightsRemoved + Stream get lightsRemoved => throw UnimplementedError(); + + @override + Future setCameraLensProjection(double near, double far, double aspect, double focalLength) { + // TODO: implement setCameraLensProjection + throw UnimplementedError(); + } + + @override + Future setCameraModelMatrix4(Matrix4 matrix) { + // TODO: implement setCameraModelMatrix4 + throw UnimplementedError(); + } + + @override + Future setMaterialPropertyFloat(ThermionEntity entity, String propertyName, int materialIndex, double value) { + // TODO: implement setMaterialPropertyFloat + throw UnimplementedError(); + } + + @override + Future setMaterialPropertyFloat4(ThermionEntity entity, String propertyName, int materialIndex, double f1, double f2, double f3, double f4) { + // TODO: implement setMaterialPropertyFloat4 + throw UnimplementedError(); + } } From 027fc9ae04de578bd5fbb5dc3a128d8af596eb53 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Mon, 16 Sep 2024 11:08:19 +0800 Subject: [PATCH 155/232] update tests --- thermion_dart/test/helpers.dart | 6 +- thermion_dart/test/integration_test.dart | 215 +++++++++++++++++------ thermion_dart/test/viewport_gizmo.dart | 12 +- thermion_dart/test/viewport_grid.dart | 76 ++++++++ 4 files changed, 245 insertions(+), 64 deletions(-) create mode 100644 thermion_dart/test/viewport_grid.dart diff --git a/thermion_dart/test/helpers.dart b/thermion_dart/test/helpers.dart index bf69b9e7..2710e2a1 100644 --- a/thermion_dart/test/helpers.dart +++ b/thermion_dart/test/helpers.dart @@ -1,12 +1,14 @@ +import 'dart:ffi'; import 'dart:io'; import 'dart:typed_data'; +import 'package:ffi/ffi.dart'; import 'package:thermion_dart/thermion_dart.dart'; import 'package:thermion_dart/thermion_dart/swift/swift_bindings.g.dart'; -import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.dart'; import 'package:thermion_dart/thermion_dart/utils/dart_resources.dart'; -import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_dart.g.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart'; diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index e0e60933..36d2815b 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:io'; import 'dart:math'; @@ -5,7 +6,8 @@ import 'package:thermion_dart/thermion_dart.dart'; import 'package:test/test.dart'; import 'package:animation_tools_dart/animation_tools_dart.dart'; import 'package:path/path.dart' as p; -import 'package:thermion_dart/thermion_dart/geometry_helper.dart'; +import 'package:thermion_dart/thermion_dart/utils/geometry.dart'; +import 'package:thermion_dart/thermion_dart/viewer/events.dart'; import 'package:vector_math/vector_math_64.dart'; import 'helpers.dart'; @@ -26,8 +28,6 @@ void main() async { viewportDimensions.height, outPath); } - final cubeGeometry = GeometryHelper.cube(); - group('camera', () { test('getCameraModelMatrix, getCameraPosition, rotation', () async { var viewer = await createViewer(); @@ -122,42 +122,120 @@ void main() async { }); }); + group("scene update events", () { + test('add light fires SceneUpdateEvent', () async { + var viewer = await createViewer(); + + final success = Completer(); + var light = DirectLight( + type: LightType.POINT, + color: 6500, + intensity: 1000000, + position: Vector3(0, 0.6, 0.6), + direction: Vector3(0, 0, 0), + falloffRadius: 2.0); + + late StreamSubscription listener; + listener = viewer.sceneUpdated.listen((updateEvent) { + var wasSuccess = updateEvent.eventType == EventType.EntityAdded && + updateEvent.addedEntityType == EntityType.DirectLight && + updateEvent.getDirectLight() == light; + success.complete(wasSuccess); + listener.cancel(); + }); + await viewer.addDirectLight(light); + expect(await success.future, true); + }); + + test('remove light fires SceneUpdateEvent', () async { + var viewer = await createViewer(); + + final success = Completer(); + var light = await viewer.addDirectLight(DirectLight.point()); + + late StreamSubscription listener; + listener = viewer.sceneUpdated.listen((updateEvent) { + var wasSuccess = updateEvent.eventType == EventType.EntityRemoved && + updateEvent.entity == light; + success.complete(wasSuccess); + listener.cancel(); + }); + + await viewer.removeLight(light); + + expect(await success.future, true); + }); + + test('add geometry fires SceneUpdateEvent', () async { + var viewer = await createViewer(); + + final success = Completer(); + var geometry = GeometryHelper.cube(); + + late StreamSubscription listener; + listener = viewer.sceneUpdated.listen((updateEvent) { + var wasSuccess = updateEvent.eventType == EventType.EntityAdded && + updateEvent.addedEntityType == EntityType.Geometry && + updateEvent.getAsGeometry() == geometry; + success.complete(wasSuccess); + listener.cancel(); + }); + await viewer.createGeometry(geometry); + expect(await success.future, true); + }); + + test('remove geometry fires SceneUpdateEvent', () async { + var viewer = await createViewer(); + var geometry = await viewer.createGeometry(GeometryHelper.cube()); + final success = Completer(); + + late StreamSubscription listener; + listener = viewer.sceneUpdated.listen((updateEvent) { + var wasSuccess = updateEvent.eventType == EventType.EntityRemoved && + updateEvent.entity == geometry; + success.complete(wasSuccess); + listener.cancel(); + }); + + await viewer.removeEntity(geometry); + + expect(await success.future, true); + }); + }); + group("custom geometry", () { test('create cube (no normals)', () async { var viewer = await createViewer(); var light = await viewer.addLight( - LightType.POINT, 6500, 10000000, 0, 2, 0, 0, -1, 0, - falloffRadius: 10.0); + LightType.POINT, 6500, 1000000, 0, 0.6, 0.6, 0, 0, 0, + falloffRadius: 2.0); await viewer.setCameraPosition(0, 0, 6); await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0); - await viewer.createGeometry(cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); - await _capture(viewer, "geometry_cube"); + await viewer + .createGeometry(GeometryHelper.cube(normals: false, uvs: false)); + await _capture(viewer, "geometry_cube_no_normals"); }); test('create cube (with normals)', () async { var viewer = await createViewer(); var light = await viewer.addLight( - LightType.POINT, 6500, 1000000, 0, 2, 0, 0, -1, 0, - falloffRadius: 10.0); - + LightType.POINT, 6500, 1000000, 0, 0.5, 1, 0, 0, 0, + falloffRadius: 100.0); await viewer.setCameraPosition(0, 0, 6); await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0); - await viewer.createGeometry(cubeGeometry.vertices, cubeGeometry.indices, - normals: cubeGeometry.normals, - primitiveType: PrimitiveType.TRIANGLES); - await _capture(viewer, "geometry_cube"); + await viewer + .createGeometry(GeometryHelper.cube(normals: true, uvs: false)); + await _capture(viewer, "geometry_cube_with_normals"); }); - test('create sphere', () async { - final geometry = GeometryHelper.sphere(); + test('create sphere (no normals)', () async { var viewer = await createViewer(); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); await viewer.setCameraPosition(0, 0, 6); - await viewer.createGeometry(geometry.vertices, geometry.indices, - primitiveType: PrimitiveType.TRIANGLES); - await _capture(viewer, "geometry_sphere"); + await viewer + .createGeometry(GeometryHelper.sphere(normals: false, uvs: false)); + await _capture(viewer, "geometry_sphere_no_normals"); }); }); @@ -216,17 +294,57 @@ void main() async { // await Future.delayed(Duration(seconds: 1)); // }); - group("geometry", () { - test('create custom geometry', () async { + group("materials", () { + test('set float4 material property for custom geometry', () async { var viewer = await createViewer(); - await viewer.createIbl(1.0, 1.0, 1.0, 1000); + await viewer.setCameraPosition(0, 0, 6); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); - // Create the cube geometry - await viewer.createGeometry(cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); + var light = await viewer.addLight( + LightType.SUN, 6500, 1000000, 0, 0, 0, 0, 0, -1); - await _capture(viewer, "geometry_cube"); + final cube = await viewer.createGeometry(GeometryHelper.cube()); + + await _capture(viewer, "set_material_float4_pre"); + await viewer.setMaterialPropertyFloat4( + cube, "baseColorFactor", 0, 0.0, 1.0, 0.0, 1.0); + await _capture(viewer, "set_material_float4_post"); + }); + test('set float material property for custom geometry', () async { + var viewer = await createViewer(); + + await viewer.setCameraPosition(0, 0, 6); + await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); + var light = await viewer.addLight( + LightType.SUN, 6500, 1000000, 0, 0, 0, 0, 0, -1); + + final cube = await viewer.createGeometry(GeometryHelper.cube()); + + // this won't actually do anything because the default ubershader doesn't use specular/glossiness + // but we can at least check that the call succeeds + await _capture(viewer, "set_material_specular_pre"); + await viewer.setMaterialPropertyFloat(cube, "specularFactor", 0, 0.0); + await _capture(viewer, "set_material_specular_post"); + }); + + test('set float material property (roughness) for custom geometry', + () async { + var viewer = await createViewer(); + + await viewer.setCameraPosition(0, 0, 6); + await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); + var light = await viewer.addLight( + LightType.SUN, 6500, 1000000, 0, 0, 0, 0, 0, -1); + + final cube = await viewer.createGeometry(GeometryHelper.cube()); + + // this won't actually do anything because the default ubershader doesn't use specular/glossiness + // but we can at least check that the call succeeds + await _capture(viewer, "set_material_roughness_pre"); + + await viewer.setMaterialPropertyFloat(cube, "metallicFactor", 0, 0.0); + await viewer.setMaterialPropertyFloat(cube, "roughnessFactor", 0, 0.0); + await _capture(viewer, "set_material_roughness_post"); }); }); @@ -235,9 +353,7 @@ void main() async { () async { var viewer = await createViewer(); - final cube = await viewer.createGeometry( - cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); + final cube = await viewer.createGeometry(GeometryHelper.cube()); expect(await viewer.getParent(cube), isNull); expect(await viewer.getAncestor(cube), isNull); @@ -248,12 +364,9 @@ void main() async { () async { var viewer = await createViewer(); - final cube1 = await viewer.createGeometry( - cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); - final cube2 = await viewer.createGeometry( - cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); + final cube1 = await viewer.createGeometry(GeometryHelper.cube()); + + final cube2 = await viewer.createGeometry(GeometryHelper.cube()); await viewer.setParent(cube1, cube2); @@ -265,15 +378,9 @@ void main() async { test('getAncestor returns the ultimate parent entity', () async { var viewer = await createViewer(); - final grandparent = await viewer.createGeometry( - cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); - final parent = await viewer.createGeometry( - cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); - final child = await viewer.createGeometry( - cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); + final grandparent = await viewer.createGeometry(GeometryHelper.cube()); + final parent = await viewer.createGeometry(GeometryHelper.cube()); + final child = await viewer.createGeometry(GeometryHelper.cube()); await viewer.setParent(child, parent); await viewer.setParent(parent, grandparent); @@ -288,9 +395,7 @@ void main() async { await viewer.setCameraPosition(0, 0, 6); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); // Create the cube geometry - final cube = await viewer.createGeometry( - cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); + final cube = await viewer.createGeometry(GeometryHelper.cube()); // await viewer.setPosition(cube, -0.05, 0.04, 5.9); // await viewer.setPosition(cube, -2.54, 2.54, 0); await viewer.queuePositionUpdateFromViewportCoords(cube, 0, 0); @@ -395,13 +500,11 @@ void main() async { var viewer = await createViewer(); await viewer.setPostProcessing(true); await viewer.setBackgroundColor(0.0, 1.0, 0.0, 1.0); - await viewer.setCameraPosition(0, 1, 5); + await viewer.setCameraPosition(0, 2, 5); await viewer .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - var cube = await viewer.createGeometry( - cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); + var cube = await viewer.createGeometry(GeometryHelper.cube()); await viewer.setStencilHighlight(cube); await _capture(viewer, "stencil_highlight_geometry"); @@ -439,12 +542,8 @@ void main() async { await viewer .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - var cube1 = await viewer.createGeometry( - cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); - var cube2 = await viewer.createGeometry( - cubeGeometry.vertices, cubeGeometry.indices, - primitiveType: PrimitiveType.TRIANGLES); + var cube1 = await viewer.createGeometry(GeometryHelper.cube()); + var cube2 = await viewer.createGeometry(GeometryHelper.cube()); await viewer.setPosition(cube2, 0.5, 0.5, 0); await viewer.setStencilHighlight(cube1); await viewer.setStencilHighlight(cube2, r: 0.0, g: 0.0, b: 1.0); diff --git a/thermion_dart/test/viewport_gizmo.dart b/thermion_dart/test/viewport_gizmo.dart index be91ce72..34c32ead 100644 --- a/thermion_dart/test/viewport_gizmo.dart +++ b/thermion_dart/test/viewport_gizmo.dart @@ -1,12 +1,17 @@ +import 'dart:ffi'; import 'dart:io'; import 'dart:math'; +import 'package:ffi/ffi.dart'; import 'package:thermion_dart/thermion_dart/swift/swift_bindings.g.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; -import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.dart'; + import 'package:thermion_dart/thermion_dart/utils/dart_resources.dart'; -import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; + import 'package:test/test.dart'; import 'package:animation_tools_dart/animation_tools_dart.dart'; +import 'package:thermion_dart/thermion_dart/utils/geometry.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_dart.g.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart'; import 'package:vector_math/vector_math_64.dart'; /// Test files are run in a variety of ways, find this package root in all. @@ -70,8 +75,7 @@ void main() async { group('viewport', () { test('viewport', () async { - var entity = await viewer - .createGeometry([0.0], [0], primitiveType: PrimitiveType.POINTS); + var entity = await viewer.createGeometry(GeometryHelper.cube()); await viewer.setCameraPosition(0.0, 0.0, 4.0); await viewer.setCameraRotation(Quaternion.axisAngle(Vector3(0,0,1), pi/2)); await viewer.queueRelativePositionUpdateWorldAxis( diff --git a/thermion_dart/test/viewport_grid.dart b/thermion_dart/test/viewport_grid.dart new file mode 100644 index 00000000..1131c4ee --- /dev/null +++ b/thermion_dart/test/viewport_grid.dart @@ -0,0 +1,76 @@ +import 'dart:ffi'; +import 'dart:io'; +import 'dart:math'; +import 'package:ffi/ffi.dart'; +import 'package:thermion_dart/thermion_dart/swift/swift_bindings.g.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; + +import 'package:thermion_dart/thermion_dart/utils/dart_resources.dart'; + +import 'package:test/test.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_dart.g.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart'; + +import 'package:vector_math/vector_math_64.dart'; + +/// Test files are run in a variety of ways, find this package root in all. +/// +/// Test files can be run from source from any working directory. The Dart SDK +/// `tools/test.py` runs them from the root of the SDK for example. +/// +/// Test files can be run from dill from the root of package. `package:test` +/// does this. +Uri findPackageRoot(String packageName) { + final script = Platform.script; + final fileName = script.name; + + // We're likely running from source. + var directory = script.resolve('.'); + while (true) { + final dirName = directory.name; + if (dirName == packageName) { + return directory; + } + final parent = directory.resolve('..'); + if (parent == directory) break; + directory = parent; + } + + throw StateError("Could not find package root for package '$packageName'. " + 'Tried finding the package root via Platform.script ' + "'${Platform.script.toFilePath()}' and Directory.current " + "'${Directory.current.uri.toFilePath()}'."); +} + +extension on Uri { + String get name => pathSegments.where((e) => e != '').last; +} + +late String testDir; +void main() async { + final packageUri = findPackageRoot('thermion_dart'); + testDir = Directory("${packageUri.toFilePath()}/test").path; + final lib = ThermionDartTexture1(DynamicLibrary.open( + '${packageUri.toFilePath()}/native/lib/macos/swift/libthermion_swift.dylib')); + final object = ThermionDartTexture.new1(lib); + object.initWithWidth_height_(500, 500); + + final resourceLoader = calloc(1); + var loadToOut = NativeCallable< + Void Function(Pointer, + Pointer)>.listener(DartResourceLoader.loadResource); + + resourceLoader.ref.loadToOut = loadToOut.nativeFunction; + var freeResource = NativeCallable.listener( + DartResourceLoader.freeResource); + resourceLoader.ref.freeResource = freeResource.nativeFunction; + + var viewer = ThermionViewerFFI(resourceLoader: resourceLoader.cast()); + + await viewer.initialized; + await viewer.createSwapChain(500, 500); + await viewer.createRenderTarget(500, 500, object.metalTextureAddress); + await viewer.updateViewportAndCameraProjection(500, 500); + + +} From 191c2fd7090c62b85cb5d87ae7f162c3a1da60fd Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Mon, 16 Sep 2024 11:08:27 +0800 Subject: [PATCH 156/232] restructure viewer/types/helper folders, remove old WASM/web FFI interop, add SceneUpdated stream --- thermion_dart/lib/thermion_dart.dart | 4 ---- 1 file changed, 4 deletions(-) diff --git a/thermion_dart/lib/thermion_dart.dart b/thermion_dart/lib/thermion_dart.dart index c283d51a..9dfc2f26 100644 --- a/thermion_dart/lib/thermion_dart.dart +++ b/thermion_dart/lib/thermion_dart.dart @@ -1,8 +1,4 @@ library filament_dart; export 'thermion_dart/thermion_viewer.dart'; -export 'thermion_dart/thermion_viewer_stub.dart' - if (dart.library.io) 'thermion_dart/thermion_viewer_ffi.dart' - if (dart.library.js_interop)'thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart'; - export 'thermion_dart/entities/entity_transform_controller.dart'; From 492d41d756054ccc56e13cc90cdc7654d1fd6d4e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Mon, 16 Sep 2024 11:24:24 +0800 Subject: [PATCH 157/232] test update --- thermion_dart/test/integration_test.dart | 40 +++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index 36d2815b..1117ec0c 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -186,7 +186,7 @@ void main() async { test('remove geometry fires SceneUpdateEvent', () async { var viewer = await createViewer(); - var geometry = await viewer.createGeometry(GeometryHelper.cube()); + var geometry = await viewer.createGeometry(GeometryHelper.cube()); final success = Completer(); late StreamSubscription listener; @@ -201,6 +201,44 @@ void main() async { expect(await success.future, true); }); + + test('loadGlb fires SceneUpdateEvent', () async { + var viewer = await createViewer(); + + final success = Completer(); + + late StreamSubscription listener; + + final uri = "$testDir/cube.glb"; + + listener = viewer.sceneUpdated.listen((updateEvent) { + var wasSuccess = updateEvent.eventType == EventType.EntityAdded && + updateEvent.addedEntityType == EntityType.Gltf && + updateEvent.getAsGLTF().uri == uri; + success.complete(wasSuccess); + listener.cancel(); + }); + await viewer.loadGlb(uri, keepData: false); + expect(await success.future, true); + }); + + test('remove glb fires SceneUpdateEvent', () async { + var viewer = await createViewer(); + final uri = "$testDir/cube.glb"; + var entity = await viewer.loadGlb(uri, keepData: false); + + final success = Completer(); + + late StreamSubscription listener; + listener = viewer.sceneUpdated.listen((updateEvent) { + var wasSuccess = updateEvent.eventType == EventType.EntityRemoved && + updateEvent.entity == entity; + success.complete(wasSuccess); + listener.cancel(); + }); + await viewer.removeEntity(entity); + expect(await success.future, true); + }); }); group("custom geometry", () { From 7d2cf3f91b004525f704bcb0e3bde5dcf29a9ae3 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Mon, 16 Sep 2024 11:25:21 +0800 Subject: [PATCH 158/232] don't store gizmo material in LFS --- materials/gizmo.mat | 53 +- thermion_dart/native/include/material/gizmo.S | 2 +- .../native/include/material/gizmo.apple.S | 2 +- .../native/include/material/gizmo.bin | Bin 28800 -> 27809 bytes thermion_dart/native/include/material/gizmo.c | 2512 ++++++++--------- 5 files changed, 1284 insertions(+), 1285 deletions(-) diff --git a/materials/gizmo.mat b/materials/gizmo.mat index 334192b5..df673663 100644 --- a/materials/gizmo.mat +++ b/materials/gizmo.mat @@ -1,3 +1,50 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:634f5806365b20f05a3736b5b87c1ba6a49b94e39d3defbd6f22f9784d718388 -size 1754 + material { + name : Gizmo, + parameters : [ + { + type : mat4, + name : transform, + precision : high + }, + { + type : float4, + name : color, + precision : low + } + ], + depthWrite : true, + depthCulling : false, + shadingModel : unlit, + blending: transparent, + variantFilter : [ skinning, shadowReceiver, vsm ], + culling: none, + instanced: false, + vertexDomain: object + } + + vertex { + void materialVertex(inout MaterialVertexInputs material) { + + // we want to ensure the gizmo has the same size (in screen-space), no matter the distance from the camera + // we do this by scaling the model-space vertex positions by the distance from the camera + vec4 modelSpace = getPosition(); + vec4 worldSpace = getWorldFromModelMatrix() * modelSpace; + vec4 viewSpace = getViewFromWorldMatrix() * worldSpace; + float distanceFromCamera = length(viewSpace.xyz); + modelSpace.xyz *= (distanceFromCamera / 4.0f); // divide by 4 so that the size is equivalent to the camera being 4 world-space units away from the (unscaled) gizmo + + worldSpace = getWorldFromModelMatrix() * modelSpace; + material.worldPosition = worldSpace; + //vec4 clipSpace = getClipFromWorldMatrix() * worldSpace; + //clipSpace.z = 0.99f; + //material.worldPosition = getWorldFromClipMatrix() * clipSpace; + } + } + + fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor = materialParams.color; + } + } + diff --git a/thermion_dart/native/include/material/gizmo.S b/thermion_dart/native/include/material/gizmo.S index d09453b9..b00f550d 100644 --- a/thermion_dart/native/include/material/gizmo.S +++ b/thermion_dart/native/include/material/gizmo.S @@ -8,5 +8,5 @@ GIZMO_PACKAGE: GIZMO_GIZMO_OFFSET: .int 0 GIZMO_GIZMO_SIZE: - .int 28800 + .int 27809 diff --git a/thermion_dart/native/include/material/gizmo.apple.S b/thermion_dart/native/include/material/gizmo.apple.S index 5cfe94a9..3e033da4 100644 --- a/thermion_dart/native/include/material/gizmo.apple.S +++ b/thermion_dart/native/include/material/gizmo.apple.S @@ -8,5 +8,5 @@ _GIZMO_PACKAGE: _GIZMO_GIZMO_OFFSET: .int 0 _GIZMO_GIZMO_SIZE: - .int 28800 + .int 27809 diff --git a/thermion_dart/native/include/material/gizmo.bin b/thermion_dart/native/include/material/gizmo.bin index 0d3924799f14c765b9487105af19eb0f7b568c34..91881fa875eacfc6bf0791ebf05f71f3a79ba8b7 100644 GIT binary patch delta 5813 zcmc(jd2rR$701uHFChsb3rj)>B)ky7?7rW7zqciZ5J3S+C=pCsz&t}pY>Vk^^ZDrX{N0UZf#v!_k9;ov@R)#JL1ysx%c;$gxDEp?DWl$`@83y zd+s^se(w4Gh8+j^+UNPER!?@{*+Yx&Kj(_0&LYnrGN0}w>K{Djxh_iugU-VwS5g+UBR}5V4Ex0o)BzrqRqWMHdcp& z&i?WeXF_G8ir9`fuO!Fs(^gQl=2c|);m+AvGub)Zp6T)XeNMb)dI5w<5B`APxpw+Q z=dQ|358OG2YbH+!_^}}r4YFaCJULfXO!LTieMOawgRS{R1sRfn^UK9GV@xp4gELCA zBO%#79CmJwlq20@Pb_RZR%NMz2x+%OB1VrLA`z2wB&1WuRA-E-B#f!f7t>_0QJw9i z4XfAo_G~(1eShDE^9D9HbgxY85s9D#le42b1{k;Ic{8H$?p9z7hme1HK14~Eme1Ka zZjy6%O+81Ed~u=W3pY{!`c2-L<%>#!ch^)o&9ylm3#QH9+PGyw>TmFQPlSo(Yofk& z8@k2Z3QB4g^fg{Bs}dL0$OS%4s^+1_TV*BJkD{;jR^e9x)nl||yUeuTcrnOl)FPX~}PF+S77#70&%{2R9oTdEUr83wQi7${R1uCJ&r zF*Vw_se64-Z>)d)nqCbrPI{}bZvhGF_(`&2wR_m(IsdW z>Qd~t^))pVk5zUU5ZA>0w%kLPV!sXKU5fodfj%bsBpz@fG++ypta(ULjP;}FM^Y>< z6BOsyVvAr@;|6cL>!wZB&QpXAR|~}1^Ub~~8?>eoVWv?m#)e{fG8E&{I#IxmPuL>AHa&1x$~0QzMRk-V~WUXg&L zr7+ykI6EVPTjH#5uW)v)nD2=}*s`juAnF!bx8-Qa8CZ3aiVDb;&ZDbx<54*ux1&bg zkP}VWC%4t@#?cTkmEe;~{R)oS4O>RYr80d3-BmH@w$^!L(P*8XyB8)JhRpI=bzbSx zD|DNNjoUrtvLtuGnWA?}F%wCozYWj;la^vARj;a-PA_j4q{v;R&a-FcPlYP6rMwpO zv#tMzc6Zgx(&}WE`WDnlMTQwVOS?)HUSjLI$`nqUyQVmYmUgK?P$18CyC;B)Y!R7e z+ihNh32@T^ACQuMd!?^j_NM@-Sm-9+7Zl^OIbs3Ku#*e!o!x)ba z?qAlCseD0D-R!Y_5q({w`ew=uV55ISt@}3wK>JMFyqKVO6M(?Ixl!H3b*dsXSwWb{ zN`xjW2uC1p`}`)WB2RKh+e)PdJyJVCVF2gFn2z+|4_LUqoyfy4cegNLnE*BQ{(xZL ztkA&>_T%EZvAfvoPL?dPG*|fybcw*)bR?lQ%?lfjAm1MnR5kgc6!g*jhp~^HL>lz< z82SzT@`{je2Y6233a5=15?tct;btQO_cfAeFYa};^{Xd^zjSNEe?e)`-84xxHj*$x z;oV)evqYQ9bvXV>L*PGE;q5rkRTlSw=(c5T3u4P#+n>oMnn32qL_fk46Ys$z7n)fi zKOr+OzafK}$*@Zg#bb#s9h?=*<#<2k!rK%b)&+DST?DTeQ=E3tPP&ACKpFHyx)kC481kRc zPw6tcoci#51@%)0R$(jrWTi;^>BezH*Cu7hd%Kc;Mn9*?+S@L=%DM5ZE92d1-k+oA zvBL|{zeq3P@5}J{3hkr)cs_vVwHRN;_!=Fg*Xa%V7v^u$Tl6-)<7$U6{+kZbVQAi^ zBlI45j3AJZpvls=_n+IwFdhM&>r^aXv13is0x3R0F#Aro3=#U9S!Odi8o zoI!b%PX$y+**po_A}XdF9?MdITpkAxS79|y8$T(GDOeuldr+LKwLG60)*h5MlN>u% znpMDsTtMTU*y?*TCh$adX7)7X_fuz%A*Gh<*r|zij=zR}O~0WUs--%rr{B?a&iLMm zE24BW{gDQ#nf^q7rnz(r-AeQ5cG^pK(4Dl97STPlnA)hF?xp)^DLp`^(=u94XHX|S zLXXm8^f;}gC+R7Anx3I&shd_)JvZ=)>=gD)iu>4NKL^<6Acr{2o9KMnOcCBn+h{vV zItCRhL0%H&@kgElsAL2{r(+EO*6R#DPlC)nBR%COS=9762i8=MUWfQMUkBmdgdOEZ zzMPs^(Mg;jvzg~`8ks9Jnk{UwoXf2^a{)FT$&+2#s3^i#NSw!p#D`E<++nGY!+m9q zDcR7z>PEzyAS8^}L!A9F04b7w|$}#HaCMb{3vJ z8{MaE`6=zv9S@G$9j_VI9iKAY@sR0`ou)h9X1e1+(;a0%(Pm3qB$nmqj(S$evK-xU zj_HoFycgY3)}uTA)^tZ1cH|RU9Z`(W;%;7zf6@bbcn$Y*AD_+N<9_sjZZ=(DE%fIA zigj8xfT#7mfzRdd^Lf0HH}U!G3=Lcomj!=;@)o|8Z{ypw@m|dD&`)>b=`OyT@8Q4l z-}vu*FW<-a^8@@3{wF`k5AnnN2(amfQ$p`d5A9K`e2gF0Uc~`6YgtU*UbcpAYb>{2Ct|5szeg zil!!~8S;+|_)6@k?|~Rzs|m zvG!ohP?>6s%2L@XM~zjvYMjbbrdoS(v<<_O8+MTK|9X=7${bjMlEfu}TXh13N{(v0 zn&56Sgbl_I+az@i6SeIm*K#A?{=Z7Iocm3Hb*e;Hq>9~W6L?KlC2C4C^5Kw`s;O$4 zDpTcZy7H`~(9waOuTD|N z;xIZ@EpW+Qh;flRP1C$MjpjDhK8)ohERIT3c4Zx2mL@dI{*Lx delta 6620 zcmc&$d303O8UMaJKo$rLOF|+fnGk^tfnna8H=B`7Kn(;11*8ESA|yHr2}^*0%b>Nj zYE|s(>FGK3RP+zEwV;;vxFasD*3!DwU0K{05O>A3zwf>`lbK2M_=o41bKt)F-TSTg z_xrxN?s?vFfN!1VDO~>1@EfkVVeeGC(X+kpZ<~oW?flYnLxGA$>RF1-zh16{6QQ(Cae z6>LrmHm8k*B2l}&w%oqBatNH&HNg%XBp?pRZjY9@7Jh`^KC?rY==-O+ld>%7o*$3*X`-Q9k zVzO@=I;>3lN#G!m3Cgr02&$qUTH;(BC02K=OLitZ+Qk~q5hMQBx^?npZ!f7-SoW0o zW$_LiwzL009>fv5q|)NJ)V44d6Xj?el?_Y1Yif^L6pi;@+<4Hr3qSFoQ`uNd7ZzJx zS8S!M*y^fcn~C2D2JQV-Q&7}l2mo$o$K}})koTyn5sbjo53QvWs)v~a^+Ka=iSd18AnOcXdz1Gq&VhxmR?}RZ^a<=C#smeq+JoveX+=|lZ7&R1t-^m{q4_toKV0`B;I z_|_&Tic7!WH?v+`MErs)#2eTM{WDi4rmsw{o{?PF+0wqeb#ZWMw=c0J&L-rj*>{br zoFVF6;=sM&ILeM4hlU?cGrrQn$}{6S>bbpSq(|00C3O{8rG8EniDdhVR-H89HLhl# zJ+<cqreI_X+lR_LW47sBkXD9$qkp#AVQj@p-3#7 z(3Q9)2|(NfdREZBa6m3n7z8H#$#HBZd#U+-?Sjf#9)R)cF;eKV|Gn- znHM{kR%Tf0;nJ#DMbfM)OhvLtWk$M5Wkz*lH*uZ;Cag#{FzcYg`RFDU^m{qaCzY5? zld66O8fi47fiBj*n^cakZq8(@fmBt~bx_^sXvle?XK~7Lm5$Zn6lA)8V?qC}a7vfY zD7@>=^Xf0}ufkz_Z)1%ogi*4q|7d&L!g{;v7cqJ0wCY0LFGAs4 zn0@)|8oOk2kvF$OFn|IT=mNzp)Mt#sg8Gz77jVp^AIJ!X;ccN@*s`c{Ft*OQGunbt zySnLEj}eSvrUg=lA(^J<2bxMIeJoMsnM#7R(4~ znBzqh9Iqwm$r+4k=?ZhaFEi@omOE|2*{%RO%of3NCKnMnScbDa=W*Pun;`R2&uAoS zoK#_-KgU~P#I;lSl;Nts!}@=FYIFT)Lyo(X)lBVqb8GVmJ@Ixlj}*)pCv8;Wh|sV& z6movBV(WlPv(dh6RI$BrRw?M{{74Ps*N1*}2-0-aKU6b9myY2Ku;ivo$8i2@hpcF? zbd(>jjzuf`2ds#6j>6P(Ou7>N3Y^eZds%s(^DItZKsK{wN{M5qfS!Zh*JUUorHu?H_ zOvmjw=%h=8D_N5i&GEx z;lA9D3%HPrxDS=kKpI3|D&}E0Eu}K*&jVQOl<+`UxEk7cef&vboPrI4+*?BQJ1zGz zi(RsBOjH-}5FSKB*}iJ=P4>*hNV_!=D6Qx5Jb?pH+EzrUKhZ=E+S?MRrM98I*V8zv zr|~p_Zls&&PxNQHnf^lCX$Rdxx6*ACr=9dS`a4ac+vyIPN_WxSG@b6HU34GqrW2`= z9;DgSM04n2dW7cEqjUzr z_(WIM1H4(-ZFI4_2UQ;Fmd4(6`p9@UL}&5rEQtOFm(U<|S-Syhg1rJz2Ww-pkZJxz z)in4F(zqMi3-0Vomyby$cp10w8N8fVa4WZ=SWWY1&XErMajzZtdTF+q4*Z<#eEgv- zL2hP^-p{~%#ZND_)-2h@8SROfB7+foS)z)`6>P%KaJ`0 zED}h6z?9qb|5F$?|a)+?&FrLB+DCCD0zO#=YE~fQA%EKgc|8OIS2=X zbDW44UIki}`finbbJS3xYjbYqgj4f_uy$N;SgTe(H`+AfYSbuIn~6LZclMoU9esL4 zMO942)iJ6;9jhj($!dz4s;0T2{)DVJPEA)c)J%1}IzgSN8r3W{TQ#XU>Lk_8imyru z6Ez>i8+apk@h0BP=kj@czP-P7U9ZgiF)@9znyb1|Jx}GKIt7rYQGJR!RU>-7THvC0 zA=cB>B8}*uWg)s*EzZI768BXaz8^rn;AddZX7ytLD7CVDTvDB_&QUAXD%Gw!)M~Xx TtySw(r&_NzsEw*C3rzn9DLyir diff --git a/thermion_dart/native/include/material/gizmo.c b/thermion_dart/native/include/material/gizmo.c index 8647e5c2..e9aa1c9d 100644 --- a/thermion_dart/native/include/material/gizmo.c +++ b/thermion_dart/native/include/material/gizmo.c @@ -44,8 +44,8 @@ const uint8_t GIZMO_PACKAGE[] = { 0x00, 0x00, 0x53, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4d, 0x55, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4f, 0x52, 0x50, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x44, 0x49, 0x55, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x63, 0xf3, 0x17, 0xa6, 0x9c, 0xa6, 0xde, -0x40, 0x44, 0x41, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, 0x5f, 0x54, +0x00, 0x44, 0x49, 0x55, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x66, 0x67, 0xec, 0x49, 0xc7, 0x6b, 0x8c, +0xf9, 0x44, 0x41, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x49, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x41, 0x51, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, @@ -53,7 +53,7 @@ const uint8_t GIZMO_PACKAGE[] = { 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x19, 0x3e, 0x52, 0x48, 0x54, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0xcd, 0xcc, 0x4c, 0x3e, 0x4f, 0x44, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x54, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x44, 0x53, 0x43, 0x5f, 0x54, 0x41, -0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x94, 0x5a, 0x00, 0x00, 0x79, 0x02, +0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0xd5, 0x56, 0x00, 0x00, 0x69, 0x02, 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x30, 0x30, 0x20, 0x65, 0x73, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x7b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, @@ -151,1299 +151,1251 @@ const uint8_t GIZMO_PACKAGE[] = { 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x20, 0x2b, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x00, 0x7d, 0x00, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x20, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x33, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, +0x33, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, -0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, 0x2e, -0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x36, -0x3b, 0x00, 0x5f, 0x34, 0x31, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x5f, -0x34, 0x31, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x33, -0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, -0x36, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, -0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, +0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, 0x2e, +0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, +0x3b, 0x00, 0x5f, 0x33, 0x38, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x5f, +0x33, 0x38, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x33, 0x38, 0x34, +0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, +0x37, 0x35, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, +0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, +0x2a, 0x20, 0x5f, 0x33, 0x38, 0x34, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x35, 0x2e, +0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x30, +0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, +0x35, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x33, 0x32, 0x3b, 0x00, 0x5f, 0x32, 0x33, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x33, +0x32, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x32, 0x3b, 0x00, 0x70, 0x72, 0x65, +0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, +0x69, 0x6e, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, +0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x65, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x33, 0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, +0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x3b, 0x00, 0x6c, +0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x7d, +0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, +0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, +0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x66, 0x72, +0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, +0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, +0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x2c, 0x20, 0x5f, 0x33, +0x32, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, +0x2c, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, +0x33, 0x32, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, +0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x37, 0x32, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x37, +0x33, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x37, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x6d, 0x61, 0x74, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x65, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, +0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x6a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, +0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x70, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x75, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x61, 0x7a, 0x3b, 0x00, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, +0x63, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, +0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, +0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x6b, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, +0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, +0x70, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x75, +0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, +0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, +0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x33, 0x20, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x66, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, +0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, +0x61, 0x74, 0x34, 0x20, 0x6b, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, +0x65, 0x63, 0x34, 0x20, 0x70, 0x7a, 0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, +0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, +0x7a, 0x7a, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, +0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, +0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x7a, 0x7a, 0x29, 0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, +0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, +0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, +0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, 0x31, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x31, +0x34, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x3d, +0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, +0x20, 0x2d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, +0x2e, 0x78, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x29, 0x29, 0x20, 0x2f, 0x20, +0x5f, 0x32, 0x31, 0x34, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, +0x30, 0x31, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x20, +0x3d, 0x20, 0x5f, 0x32, 0x34, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, +0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, +0x34, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, +0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x30, 0x32, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, +0x30, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x20, +0x3d, 0x20, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, +0x6f, 0x70, 0x79, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, +0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, +0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, +0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, +0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x6d, +0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x37, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, +0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x33, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x30, 0x32, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x30, 0x34, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, 0x20, +0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, +0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, +0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, +0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, +0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, +0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, +0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x37, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x70, +0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x35, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, +0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, 0x31, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x34, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, 0x32, 0x20, 0x3d, +0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x35, 0x20, +0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x20, 0x3d, +0x20, 0x28, 0x5f, 0x33, 0x37, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, +0x5f, 0x32, 0x35, 0x34, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x36, 0x30, 0x34, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, +0x32, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2e, 0x78, +0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2e, 0x79, 0x3b, 0x00, +0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x66, 0x72, +0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, +0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, +0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x2c, 0x20, 0x5f, 0x35, +0x37, 0x32, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, +0x2c, 0x20, 0x5f, 0x35, 0x37, 0x34, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, +0x35, 0x37, 0x32, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, +0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x34, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, +0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, +0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2c, +0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x33, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, -0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x29, 0x3b, 0x00, 0x5f, 0x33, 0x36, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, -0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, -0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x36, 0x37, -0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x33, 0x20, 0x5f, 0x32, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, -0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, -0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, -0x34, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x34, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x34, 0x3b, 0x00, 0x76, 0x65, 0x72, -0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x3b, -0x00, 0x5f, 0x32, 0x34, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x34, 0x36, 0x2e, 0x7a, 0x20, 0x2a, 0x20, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x5f, 0x32, 0x34, 0x36, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, -0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, -0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x00, 0x73, -0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, -0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x34, 0x20, 0x65, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, -0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, -0x43, 0x6f, 0x61, 0x74, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x6e, -0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, -0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x32, 0x38, -0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, -0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4d, 0x61, 0x74, 0x65, -0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, -0x34, 0x20, 0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x7d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, -0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, -0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, -0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, -0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, -0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, -0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2c, 0x20, 0x5f, 0x33, -0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x39, -0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2c, 0x20, 0x5f, -0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x32, -0x39, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, -0x35, 0x37, 0x32, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x33, 0x20, 0x5f, 0x35, 0x37, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x62, -0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, -0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, -0x20, 0x65, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, -0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, -0x69, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, 0x00, 0x68, 0x69, -0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, -0x65, 0x63, 0x34, 0x20, 0x6c, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, -0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x3b, 0x00, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x71, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x77, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, -0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x7a, 0x3b, 0x00, -0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x66, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x68, -0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x69, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6b, 0x7a, -0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, -0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, -0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, -0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, -0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, -0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, -0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, -0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, 0x7a, 0x7a, -0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x7a, 0x3b, -0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, -0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, -0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6b, 0x7a, -0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x6d, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x7a, -0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x72, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, 0x5b, 0x34, 0x30, 0x5d, -0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x73, 0x61, -0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, -0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, -0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, -0x6f, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, -0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, -0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, -0x38, 0x36, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, -0x7a, 0x7a, 0x29, 0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, -0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, -0x77, 0x2e, 0x79, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, -0x31, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x20, 0x3e, 0x20, 0x30, -0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x28, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x65, -0x78, 0x70, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, -0x79, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x3b, 0x00, -0x5f, 0x36, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, -0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2a, 0x20, 0x6d, -0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x37, -0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, -0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x2c, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x33, 0x20, 0x5f, 0x36, 0x30, 0x32, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, -0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x38, -0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x7a, -0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, -0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x37, -0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, -0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, -0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, -0x3b, 0x00, 0x5f, 0x36, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, -0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, -0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, -0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, -0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, -0x5f, 0x32, 0x37, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, -0x7a, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x3d, -0x20, 0x5f, 0x36, 0x30, 0x32, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, -0x5f, 0x36, 0x30, 0x34, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, -0x5f, 0x36, 0x30, 0x31, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, -0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, -0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, -0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, -0x5f, 0x33, 0x35, 0x37, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, -0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, -0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, -0x33, 0x35, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, -0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, -0x5f, 0x33, 0x34, 0x31, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, -0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, -0x2e, 0x77, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x35, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, -0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, 0x35, -0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x29, -0x20, 0x2b, 0x20, 0x28, 0x5f, 0x36, 0x30, 0x34, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x32, 0x29, 0x3b, 0x00, 0x63, 0x6f, -0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, -0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, -0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, -0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, -0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, -0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x32, 0x2c, 0x20, 0x5f, 0x35, -0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x34, -0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x32, 0x2c, 0x20, 0x5f, -0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x37, -0x34, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, -0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, -0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x35, -0x33, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, -0x5f, 0x31, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, -0x33, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, -0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, -0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, -0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, -0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, -0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, -0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, -0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, -0x36, 0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, -0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, -0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, -0x74, 0x42, 0x69, 0x74, 0x73, 0x54, 0x6f, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, 0x62, 0x6a, 0x65, -0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, -0x3d, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, -0x2f, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, -0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, -0x30, 0x29, 0x3b, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x58, -0x54, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x63, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x20, 0x3a, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, +0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, +0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, +0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, +0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x69, 0x6e, +0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x42, 0x69, 0x74, 0x73, 0x54, 0x6f, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, +0x5d, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, +0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, +0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, +0x20, 0x47, 0x4c, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x63, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x00, 0x23, 0x69, 0x66, +0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, +0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, -0x49, 0x44, 0x5f, 0x38, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, -0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x20, 0x32, -0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, -0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, -0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, -0x5f, 0x38, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, -0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, -0x20, 0x5f, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x2e, 0x78, 0x79, 0x7a, -0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x36, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, -0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x39, 0x29, -0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, -0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x3b, 0x00, 0x5f, 0x39, 0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, -0x38, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x39, 0x30, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x38, 0x2e, 0x79, 0x3b, -0x00, 0x5f, 0x39, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, -0x20, 0x5f, 0x31, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, -0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, -0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x36, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, -0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x30, 0x29, 0x3b, 0x00, -0x5f, 0x31, 0x30, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, -0x5f, 0x31, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, -0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x30, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, -0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x78, -0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, -0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x30, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x20, 0x3d, 0x20, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, -0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, -0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, -0x5f, 0x31, 0x30, 0x36, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x30, 0x20, 0x3d, -0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, -0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, -0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, -0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x20, 0x3d, -0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, -0x31, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, -0x31, 0x32, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, -0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x29, 0x3b, 0x00, 0x5f, 0x31, -0x31, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, -0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x32, 0x32, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x77, 0x29, 0x3b, -0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, -0x31, 0x32, 0x36, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, -0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, -0x31, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x31, 0x32, -0x32, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x32, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, -0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x7a, -0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x38, 0x2e, -0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, -0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x31, 0x38, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, -0x20, 0x5f, 0x37, 0x36, 0x3b, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x31, 0x30, 0x00, 0x23, -0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73, 0x68, 0x61, -0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, -0x67, 0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, -0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x38, 0x29, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, -0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, -0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, -0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, -0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, -0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, -0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, -0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x5f, -0x33, 0x37, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, -0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, -0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, -0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x29, 0x29, -0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, -0x34, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x78, 0x20, 0x3d, -0x20, 0x5f, 0x33, 0x35, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, -0x35, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x2e, -0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, -0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, -0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x29, 0x3b, 0x00, -0x5f, 0x33, 0x36, 0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, -0x5f, 0x34, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, -0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x36, 0x38, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x5f, -0x34, 0x30, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x20, 0x3d, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, -0x2a, 0x20, 0x5f, 0x34, 0x30, 0x35, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, -0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x6c, -0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, -0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, -0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, -0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x65, 0x63, -0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, -0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x5f, 0x36, 0x30, 0x31, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, -0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, -0x31, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, -0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, -0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, -0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, -0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, -0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x31, 0x2e, -0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x5f, 0x31, -0x38, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, -0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x68, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, -0x3b, 0x00, 0x5f, 0x36, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, -0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, -0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, -0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2a, 0x20, 0x6d, -0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, -0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, -0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, -0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, -0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, -0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, -0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, -0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, -0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, -0x5f, 0x32, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, -0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, -0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x20, 0x3d, -0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, -0x20, 0x5f, 0x34, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, -0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x32, 0x32, 0x37, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, -0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x29, 0x29, 0x2e, -0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, -0x39, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x3b, 0x00, 0x5f, 0x34, 0x39, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, -0x5f, 0x34, 0x32, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x34, 0x39, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, -0x38, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x34, 0x39, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x38, 0x2e, 0x7a, -0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, -0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, -0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, -0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x32, 0x32, 0x37, 0x5d, 0x2e, 0x77, 0x6f, -0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, -0x20, 0x5f, 0x34, 0x39, 0x34, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x34, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, -0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, -0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x30, 0x29, 0x2e, -0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, -0x5f, 0x32, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, -0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, -0x3d, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, -0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x2e, +0x49, 0x44, 0x5f, 0x38, 0x20, 0x32, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, +0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, 0x34, 0x20, 0x3d, 0x20, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x5f, +0x37, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x34, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, +0x2a, 0x20, 0x5f, 0x37, 0x37, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x37, 0x3b, 0x00, 0x5f, 0x38, 0x38, +0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x38, 0x38, 0x2e, 0x79, 0x20, 0x3d, 0x20, +0x5f, 0x38, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x38, 0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x2e, 0x7a, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, +0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x34, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, +0x38, 0x38, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, -0x20, 0x5f, 0x32, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, -0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, -0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, -0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x3b, 0x00, 0x69, 0x6e, -0x74, 0x20, 0x5f, 0x32, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, -0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, -0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x36, -0x31, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, -0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x36, 0x31, 0x3b, -0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x20, 0x2a, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x35, 0x38, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x78, -0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, -0x32, 0x36, 0x31, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2e, -0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x36, -0x32, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x37, 0x33, 0x29, 0x20, 0x2a, 0x20, -0x5f, 0x32, 0x35, 0x33, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, -0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, -0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x37, 0x33, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2e, -0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, -0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, -0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x36, 0x32, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, -0x35, 0x38, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x77, 0x29, 0x29, -0x3b, 0x00, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x7a, 0x20, 0x2a, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, -0x2b, 0x20, 0x28, 0x5f, 0x32, 0x35, 0x33, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x37, 0x3b, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x00, 0x23, -0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69, 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, -0x3e, 0x00, 0x00, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, -0x65, 0x74, 0x61, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, -0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, -0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, -0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, -0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, -0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, -0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, -0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, -0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, -0x63, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, -0x20, 0x20, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, -0x64, 0x61, 0x74, 0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, -0x41, 0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, -0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, -0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, -0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, -0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x78, 0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, -0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, -0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x34, 0x5d, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, -0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, -0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, -0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x4e, 0x6f, 0x69, -0x73, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x54, -0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x6f, -0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, -0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, -0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x72, 0x65, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x64, 0x4f, 0x66, 0x66, -0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, 0x72, 0x69, -0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, -0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x4f, -0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x46, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x76, 0x31, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x6e, -0x65, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x53, 0x61, 0x6d, 0x70, -0x6c, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x64, 0x45, 0x64, 0x67, 0x65, 0x44, 0x69, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, -0x42, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x20, 0x7a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, -0x6b, 0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x66, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x43, -0x6f, 0x75, 0x6e, 0x74, 0x58, 0x59, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, -0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x69, 0x62, 0x6c, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x65, 0x4c, 0x65, 0x76, -0x65, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x69, 0x62, 0x6c, 0x53, 0x48, -0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x33, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, -0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x34, 0x20, 0x73, 0x75, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x68, -0x61, 0x64, 0x6f, 0x77, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, -0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, -0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x44, -0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, -0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, -0x6e, 0x74, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x52, 0x61, 0x74, -0x69, 0x6f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, -0x6c, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, -0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, -0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x76, 0x73, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x42, 0x6c, 0x65, 0x65, 0x64, 0x52, 0x65, -0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x68, -0x61, 0x64, 0x6f, 0x77, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x44, -0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, -0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, -0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, -0x74, 0x20, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, -0x66, 0x66, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, -0x4f, 0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, -0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, -0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, -0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, -0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, -0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4e, 0x65, -0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, -0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x52, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, -0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x55, -0x76, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, -0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x53, 0x74, 0x72, 0x69, -0x64, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, -0x6d, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x37, 0x30, 0x39, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, -0x76, 0x65, 0x64, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, -0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x73, -0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, -0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x34, -0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, -0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, -0x6f, 0x63, 0x6e, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, -0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, -0x6f, 0x63, 0x6e, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, -0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, -0x6e, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, -0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, -0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, -0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, -0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, -0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, -0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, -0x5d, 0x5d, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5d, -0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, -0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, -0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x49, -0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, -0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x33, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, -0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, -0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, -0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, -0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, -0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x20, 0x5f, 0x33, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, -0x39, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x33, 0x39, 0x32, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x5f, 0x33, 0x39, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, -0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, -0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, +0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x31, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x35, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, +0x5f, 0x31, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, +0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x20, +0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, +0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x31, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x20, 0x2a, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x39, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x31, +0x30, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x78, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x31, 0x20, +0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x30, 0x37, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, +0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x77, 0x29, +0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, +0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, +0x2d, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x31, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x39, +0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, +0x5f, 0x31, 0x30, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x3b, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, +0x20, 0x34, 0x31, 0x30, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x41, +0x52, 0x42, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, +0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x6c, 0x61, 0x79, +0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x38, 0x29, 0x20, 0x66, 0x6c, +0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6c, +0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, +0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x6d, 0x65, +0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, +0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, +0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, +0x5f, 0x33, 0x35, 0x36, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x3b, 0x00, 0x5f, 0x33, +0x38, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x33, 0x38, 0x35, 0x2e, +0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x33, 0x38, 0x35, 0x2e, 0x7a, 0x20, 0x3d, +0x20, 0x5f, 0x33, 0x34, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x20, 0x3d, +0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, +0x73, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, -0x39, 0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x34, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, -0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x20, -0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, -0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, -0x34, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, -0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, -0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, -0x35, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, -0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, -0x33, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, -0x33, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, -0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, -0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, -0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x38, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, -0x20, 0x6f, 0x75, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, -0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, -0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, -0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, -0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, -0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, -0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, -0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, -0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, -0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x6f, 0x69, -0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x70, 0x76, -0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x31, -0x20, 0x7b, 0x00, 0x64, 0x65, 0x70, 0x74, 0x68, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x20, -0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, -0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, -0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, -0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, -0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, -0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, -0x69, 0x64, 0x28, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, -0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, -0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x34, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, -0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, -0x61, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x35, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, -0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x36, 0x29, -0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, -0x61, 0x6f, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, -0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x38, 0x29, 0x5d, -0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, -0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x39, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, -0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, -0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x30, 0x29, 0x5d, 0x5d, -0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, -0x63, 0x74, 0x75, 0x72, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x31, 0x29, 0x5d, -0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x32, 0x29, -0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, -0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, -0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, -0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, -0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, -0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, -0x72, 0x31, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, -0x31, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, -0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, -0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, -0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, -0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, -0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, -0x34, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, -0x20, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, -0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, -0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x00, 0x20, 0x20, -0x20, 0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, -0x30, 0x31, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x3e, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, -0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x20, 0x3d, 0x20, -0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x2e, 0x79, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x31, 0x38, 0x20, 0x3d, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, -0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x31, 0x37, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x36, 0x31, 0x38, -0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, -0x79, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, -0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x5f, 0x36, 0x31, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x31, 0x5d, -0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, -0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x36, 0x31, 0x38, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x38, 0x31, 0x30, 0x20, -0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x5f, 0x38, 0x31, -0x30, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, 0x20, -0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, -0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, -0x63, 0x69, 0x74, 0x79, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, -0x33, 0x20, 0x5f, 0x38, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, -0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, -0x33, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, -0x6f, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x38, 0x31, 0x34, 0x20, -0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, 0x74, 0x79, -0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, 0x29, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x3d, 0x20, -0x5f, 0x38, 0x32, 0x34, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, -0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, -0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, -0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, -0x2c, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, -0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, -0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, -0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, -0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, -0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, -0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, -0x69, 0x78, 0x28, 0x5f, 0x38, 0x31, 0x34, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x38, 0x31, 0x34, 0x2e, 0x78, 0x2c, 0x20, 0x63, -0x6c, 0x61, 0x6d, 0x70, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x2c, 0x20, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, -0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, -0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x29, 0x2c, 0x20, -0x68, 0x61, 0x6c, 0x66, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x38, 0x31, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, -0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, -0x39, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, -0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x2a, 0x20, 0x28, -0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, -0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x29, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x34, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, -0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x30, 0x20, 0x2b, -0x20, 0x28, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, -0x74, 0x79, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, -0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, -0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, -0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, -0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, -0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, -0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x30, 0x20, 0x2d, 0x20, 0x68, -0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, -0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, -0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, -0x20, 0x5f, 0x37, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, -0x20, 0x5f, 0x38, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, -0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, -0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x38, 0x33, 0x33, 0x2e, 0x78, 0x79, 0x7a, -0x20, 0x2a, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x33, 0x33, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x38, -0x33, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x2e, 0x78, 0x20, 0x3d, -0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, -0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, -0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, -0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x34, 0x28, 0x5f, 0x38, 0x30, 0x35, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, -0x74, 0x20, 0x5f, 0x31, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, -0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, -0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, -0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, -0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, -0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, -0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x61, -0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, -0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, -0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, -0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x69, 0x6e, 0x2e, -0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, -0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, -0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, -0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x63, -0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, -0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, -0x5b, 0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, -0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, -0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, -0x4e, 0x54, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, -0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, -0x70, 0x29, 0x20, 0x3f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, -0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x3a, 0x20, 0x32, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, -0x6e, 0x63, 0x65, 0x20, 0x5b, 0x5b, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, -0x5d, 0x20, 0x5b, 0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, -0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, -0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, -0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x36, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, -0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, -0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, -0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x33, 0x20, 0x5f, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, +0x38, 0x35, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x3b, 0x00, +0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, +0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, +0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, +0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, +0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, 0x31, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, +0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, +0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, +0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, +0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, +0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, +0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, +0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, +0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, +0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, +0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x34, 0x20, 0x3d, +0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, +0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, +0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, +0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, +0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, +0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, +0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, +0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, +0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, +0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, +0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, +0x37, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, +0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x20, 0x3d, 0x20, +0x5f, 0x34, 0x32, 0x38, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x28, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x32, 0x31, 0x33, +0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x32, 0x38, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x34, +0x2e, 0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, +0x38, 0x3b, 0x00, 0x5f, 0x34, 0x36, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x2e, 0x78, 0x3b, 0x00, +0x5f, 0x34, 0x36, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x34, 0x36, +0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, +0x34, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, +0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x32, 0x31, 0x33, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x36, 0x31, 0x29, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, +0x32, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x32, 0x37, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x37, 0x2e, 0x79, +0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x32, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x35, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x3b, 0x00, 0x69, 0x6e, 0x74, +0x20, 0x5f, 0x32, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x37, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x32, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x34, 0x37, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x38, 0x20, 0x2a, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x34, 0x34, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x33, 0x39, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, +0x34, 0x37, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x33, 0x39, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x2e, 0x78, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x34, 0x38, +0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x35, 0x39, 0x29, 0x20, 0x2a, 0x20, 0x5f, +0x32, 0x33, 0x39, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x35, 0x39, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x2e, 0x77, +0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, +0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x32, 0x33, 0x39, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, +0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x34, 0x38, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x34, +0x34, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x2e, 0x77, 0x29, 0x29, 0x3b, +0x00, 0x5f, 0x32, 0x33, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x39, 0x2e, 0x7a, 0x20, 0x2a, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x5f, 0x32, 0x33, 0x39, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x33, 0x3b, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, +0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x00, 0x23, 0x69, +0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69, 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, +0x00, 0x00, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, +0x74, 0x61, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, +0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, +0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, +0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, +0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, +0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, +0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, +0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, +0x20, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x64, +0x61, 0x74, 0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, +0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, +0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, +0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, +0x34, 0x20, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, +0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x4e, 0x6f, 0x69, 0x73, +0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x54, 0x69, +0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, +0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, +0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, +0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x72, 0x65, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x64, 0x4f, 0x66, 0x66, 0x73, +0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, +0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, +0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x4f, 0x76, +0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x46, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x76, 0x31, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, +0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x53, 0x61, 0x6d, 0x70, 0x6c, +0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x64, 0x45, 0x64, 0x67, 0x65, 0x44, 0x69, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x42, +0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x7a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, +0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x66, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x43, 0x6f, +0x75, 0x6e, 0x74, 0x58, 0x59, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, 0x6c, +0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x69, 0x62, 0x6c, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x65, 0x4c, 0x65, 0x76, 0x65, +0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x69, 0x62, 0x6c, 0x53, 0x48, 0x5b, +0x39, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, +0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x73, 0x75, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x68, 0x61, +0x64, 0x6f, 0x77, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, +0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, +0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, +0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x52, 0x61, 0x74, 0x69, +0x6f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, +0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x45, +0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, +0x73, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x42, 0x6c, 0x65, 0x65, 0x64, 0x52, 0x65, 0x64, +0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, +0x64, 0x6f, 0x77, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x44, 0x65, +0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, +0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, +0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, +0x66, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, +0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, +0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, +0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, +0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, +0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, +0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, +0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x52, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x55, 0x76, +0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x53, 0x74, 0x72, 0x69, 0x64, +0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, +0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x37, 0x30, 0x39, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, +0x65, 0x64, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, +0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, +0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x73, 0x74, +0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x34, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, +0x63, 0x6e, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, +0x63, 0x6e, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, +0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, +0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, +0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, +0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, +0x5d, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, +0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5d, 0x5d, +0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, +0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x49, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, +0x20, 0x5f, 0x33, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x36, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, -0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x39, 0x29, 0x29, 0x2e, 0x78, -0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x38, 0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, -0x30, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, -0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x20, 0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, -0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, -0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, -0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x36, 0x5d, 0x2e, 0x77, 0x6f, 0x72, -0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, -0x5f, 0x38, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, -0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x34, 0x20, 0x3d, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, -0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x30, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, -0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x2e, 0x78, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, -0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x2e, 0x79, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, -0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x2e, 0x7a, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x20, 0x3d, 0x20, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, -0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, -0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, -0x2a, 0x20, 0x5f, 0x39, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, -0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, -0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, -0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, -0x31, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x28, 0x5f, 0x31, 0x30, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, -0x31, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x30, 0x35, 0x2e, 0x78, -0x2c, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, -0x30, 0x38, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, -0x31, 0x31, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, -0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, -0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, -0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x39, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x2c, 0x20, 0x31, 0x2e, -0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x39, 0x2c, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x37, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, -0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x31, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, -0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, -0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, -0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5b, 0x30, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, -0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, -0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, -0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x2e, 0x78, 0x79, -0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, -0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, -0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x29, 0x29, 0x2e, -0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x2e, 0x79, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x2e, 0x7a, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, -0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, -0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, -0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, -0x2a, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x2e, 0x7a, 0x20, -0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, -0x33, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, -0x2a, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, -0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, -0x20, 0x5f, 0x33, 0x35, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, -0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, -0x3d, 0x20, 0x5f, 0x33, 0x35, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, -0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, -0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x34, 0x20, 0x5f, 0x32, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, -0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, -0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, -0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x35, -0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x69, 0x6e, 0x28, -0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x66, -0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, -0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x38, 0x31, -0x31, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, -0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, -0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, -0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x33, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, -0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, 0x61, 0x6d, 0x70, -0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, -0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x28, 0x74, 0x72, -0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, -0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x2e, 0x78, -0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, -0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, -0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, -0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, -0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x31, 0x31, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, -0x38, 0x31, 0x31, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, -0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, -0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, -0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, -0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x30, 0x30, 0x20, -0x3d, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x5f, -0x36, 0x35, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, -0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x30, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, -0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, -0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x66, -0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, -0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, -0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, -0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, -0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x66, 0x61, -0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, -0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x35, -0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x35, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, -0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x2a, 0x20, -0x5f, 0x34, 0x35, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, -0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x6f, 0x75, -0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, -0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, -0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x20, -0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x34, -0x32, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, -0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, -0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x32, 0x31, 0x39, 0x5d, -0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, -0x78, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, -0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x34, -0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x37, 0x34, 0x2e, 0x78, 0x20, -0x3d, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x37, 0x34, 0x2e, 0x79, -0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x37, 0x34, 0x2e, -0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x20, 0x5f, 0x34, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, +0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, +0x5f, 0x33, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x36, +0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, +0x36, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x33, 0x36, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x39, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x36, +0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x38, +0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, +0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, +0x32, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x32, +0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, +0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, +0x6f, 0x75, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, +0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, +0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, +0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, +0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, +0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, +0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x6f, 0x69, 0x64, +0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, +0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x31, 0x20, +0x7b, 0x00, 0x64, 0x65, 0x70, 0x74, 0x68, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x20, 0x5b, +0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, +0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, +0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x20, +0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, +0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, +0x64, 0x28, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, +0x75, 0x6c, 0x61, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x34, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, +0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x35, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, +0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, +0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x36, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, +0x6f, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, +0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, +0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x38, 0x29, 0x5d, 0x5d, +0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x53, +0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x39, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, +0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, +0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x30, 0x29, 0x5d, 0x5d, 0x3b, +0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, +0x74, 0x75, 0x72, 0x65, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x31, 0x29, 0x5d, 0x5d, +0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, +0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x32, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, +0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, +0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, +0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, +0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x70, +0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, +0x31, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, +0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, +0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, +0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, +0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x34, +0x34, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, +0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, +0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x00, 0x20, 0x20, 0x20, +0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, +0x31, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, 0x66, +0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x31, 0x38, 0x20, 0x3d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, +0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x31, 0x37, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x36, 0x31, 0x38, 0x29, +0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, +0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, +0x6c, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x5f, 0x36, 0x31, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x31, 0x5d, 0x29, +0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, +0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x36, 0x31, 0x38, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x38, 0x31, 0x30, 0x20, 0x3d, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x5f, 0x38, 0x31, 0x30, +0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, +0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, +0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, +0x69, 0x74, 0x79, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, +0x20, 0x5f, 0x38, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, +0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, +0x6c, 0x6f, 0x72, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, +0x20, 0x5f, 0x37, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x38, 0x31, 0x34, 0x20, 0x3d, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, +0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x5f, +0x38, 0x32, 0x34, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, +0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, +0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, +0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, +0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, +0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, +0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, +0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, +0x78, 0x28, 0x5f, 0x38, 0x31, 0x34, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x38, 0x31, 0x34, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, +0x61, 0x6d, 0x70, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x2c, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, +0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, +0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x29, 0x2c, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x38, 0x31, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, +0x78, 0x79, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, +0x39, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x2a, 0x20, 0x28, 0x68, +0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, +0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, +0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x30, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, +0x79, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, +0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x68, +0x61, 0x6c, 0x66, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, +0x73, 0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, +0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, +0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x30, 0x20, 0x2d, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, +0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, +0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, +0x5f, 0x37, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, +0x5f, 0x38, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, +0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x33, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x38, 0x33, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x20, +0x2a, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x5f, 0x38, 0x30, 0x34, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x33, 0x33, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, +0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x37, 0x35, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x33, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x37, 0x39, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, +0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x28, 0x5f, 0x38, 0x30, 0x35, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, +0x20, 0x5f, 0x31, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, +0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, +0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, +0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, +0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x61, 0x73, +0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, +0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x69, 0x6e, 0x2e, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, +0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, +0x6e, 0x30, 0x28, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x5b, +0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x38, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, +0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, +0x54, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, +0x29, 0x20, 0x3f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, +0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x3a, 0x20, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x20, 0x5b, 0x5b, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, 0x5d, +0x20, 0x5b, 0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, +0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, +0x28, 0x63, 0x6c, 0x69, 0x70, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x5b, +0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x20, 0x5f, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, +0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, +0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x34, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x37, 0x29, 0x29, 0x2e, 0x78, 0x79, +0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x5f, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, +0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x38, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x38, 0x2e, +0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x36, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x34, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x38, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 0x2e, 0x78, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 0x2e, 0x79, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 0x2e, 0x7a, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, +0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x38, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, +0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, +0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x39, 0x20, 0x3d, 0x20, +0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x39, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x31, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x36, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, +0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x3d, +0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, 0x34, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x39, 0x39, 0x2c, 0x20, 0x66, 0x6d, 0x61, +0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x39, 0x37, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x2c, 0x20, 0x28, 0x2d, +0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x39, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x5f, +0x39, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, +0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x20, 0x3d, 0x20, +0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x39, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, +0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x30, 0x38, 0x2c, 0x20, 0x5f, 0x31, 0x30, +0x31, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, +0x5f, 0x31, 0x30, 0x38, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x36, 0x20, 0x2b, 0x20, 0x31, 0x29, +0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, +0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, +0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x20, 0x3d, +0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, +0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x28, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x33, +0x35, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x35, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x30, 0x2e, +0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x30, +0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, +0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x39, +0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, +0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, +0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x38, 0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x38, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, +0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, +0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, +0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x39, +0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, +0x20, 0x5f, 0x38, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, +0x28, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, +0x69, 0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x37, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x20, 0x2a, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, +0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, +0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, +0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, +0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, +0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, +0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, +0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, +0x78, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x31, 0x31, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x28, 0x5f, 0x38, 0x31, 0x31, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x63, 0x6c, +0x61, 0x6d, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, +0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, +0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, +0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, +0x37, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x39, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, +0x20, 0x2a, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x30, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, +0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, +0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, +0x6f, 0x77, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, +0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, +0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, +0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x20, +0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x38, 0x20, +0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x31, 0x20, 0x2d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, +0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, +0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, +0x20, 0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x35, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, +0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x38, 0x30, +0x34, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, +0x20, 0x5f, 0x38, 0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x20, +0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, +0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x34, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, +0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, +0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, +0x32, 0x30, 0x35, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, +0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, +0x5f, 0x34, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x34, +0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, +0x34, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x34, 0x34, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x32, 0x30, 0x35, 0x5d, 0x2e, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x30, 0x32, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x5f, 0x32, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, -0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x32, 0x31, 0x39, 0x5d, 0x2e, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, -0x2a, 0x20, 0x5f, 0x34, 0x37, 0x34, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x30, 0x2e, 0x7a, 0x20, -0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, -0x34, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, -0x2a, 0x20, 0x5f, 0x34, 0x32, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, -0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, -0x20, 0x5f, 0x34, 0x32, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, -0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, -0x3d, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, -0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, -0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x34, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, -0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, -0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, -0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x35, -0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, -0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, -0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x5f, 0x32, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, -0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, -0x2f, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, -0x36, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x35, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x2e, -0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, -0x66, 0x6d, 0x61, 0x28, 0x5f, 0x32, 0x34, 0x35, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x38, 0x2c, 0x20, 0x66, 0x6d, -0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x34, 0x2c, 0x20, -0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x35, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x37, -0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x20, -0x3d, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x2e, 0x78, 0x20, 0x3d, -0x20, 0x5f, 0x32, 0x38, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x39, -0x34, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x39, 0x34, -0x2c, 0x20, 0x5f, 0x32, 0x36, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x2c, 0x20, -0x5f, 0x32, 0x38, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, -0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, -0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x39, 0x34, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x35, -0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x2c, 0x20, -0x5f, 0x32, 0x38, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, -0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, -0x5f, 0x32, 0x31, 0x39, 0x3b, 0x00, 0x4c, 0x53, 0x4c, 0x47, 0x5f, 0x54, 0x41, 0x4d, 0xe6, 0x08, 0x00, 0x00, 0x12, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x9c, 0x01, 0x00, 0x00, -0x01, 0x10, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xd6, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xea, 0x01, 0x00, -0x00, 0x01, 0x30, 0x01, 0x34, 0x03, 0x00, 0x00, 0x01, 0x44, 0x01, 0x76, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x8e, 0x03, -0x00, 0x00, 0x01, 0x90, 0x00, 0x8e, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0xc2, 0x04, 0x00, 0x00, 0x02, 0x00, 0x01, 0xda, -0x05, 0x00, 0x00, 0x02, 0x10, 0x00, 0xc2, 0x04, 0x00, 0x00, 0x02, 0x10, 0x01, 0x12, 0x06, 0x00, 0x00, 0x02, 0x20, 0x01, -0x24, 0x06, 0x00, 0x00, 0x02, 0x30, 0x01, 0x5c, 0x07, 0x00, 0x00, 0x02, 0x44, 0x01, 0x9c, 0x07, 0x00, 0x00, 0x02, 0x80, -0x00, 0xb2, 0x07, 0x00, 0x00, 0x02, 0x90, 0x00, 0xb2, 0x07, 0x00, 0x00, 0x60, 0x0a, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, -0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, -0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, -0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, -0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, -0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, -0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, -0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, -0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, -0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, -0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, -0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, -0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, -0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x69, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, -0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x02, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, -0x04, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x02, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, -0x66, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x69, 0x00, 0x51, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, -0x7e, 0x00, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0xaf, 0x0c, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, -0x7e, 0x00, 0x7f, 0x00, 0x02, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x04, 0x00, -0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x17, 0x00, 0x02, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, -0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, -0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, -0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, -0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, -0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, -0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, -0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x61, 0x00, 0x89, 0x00, -0x02, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0xda, 0x00, 0xdb, 0x00, 0x8d, 0x00, 0xdc, 0x00, 0x02, 0x00, 0xdd, 0x00, -0xde, 0x00, 0x02, 0x00, 0xdf, 0x00, 0x69, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x00, 0x69, 0x00, -0x6a, 0x00, 0x02, 0x00, 0xe4, 0x00, 0x69, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, 0x00, 0x02, 0x00, -0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xee, 0x00, 0x69, 0x00, 0xef, 0x00, -0xf0, 0x00, 0xf1, 0x00, 0x02, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0x69, 0x00, 0x6a, 0x00, -0x02, 0x00, 0xf7, 0x00, 0x69, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xdf, 0x00, -0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x69, 0x00, 0xec, 0x02, -0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x05, 0x00, 0x02, 0x00, 0x03, 0x01, 0x04, 0x01, -0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, -0x0a, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x0b, 0x01, 0x0c, 0x01, 0x66, 0x00, 0x02, 0x00, 0x0d, 0x01, -0x0e, 0x01, 0x69, 0x00, 0x91, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x8d, 0x00, -0x66, 0x00, 0x02, 0x00, 0x0f, 0x01, 0x69, 0x00, 0x10, 0x0d, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, -0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, -0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x01, 0x12, 0x01, -0x0f, 0x00, 0x13, 0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, -0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, -0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, -0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, -0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, -0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, -0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, -0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, -0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x63, 0x00, 0x62, 0x00, 0x64, 0x00, 0x65, 0x00, -0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, -0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, -0x1e, 0x01, 0x1f, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x26, 0x01, 0x27, 0x01, -0x28, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x2e, 0x01, 0x69, 0x00, 0xa0, 0x09, 0x00, 0x00, -0x88, 0x00, 0x00, 0x00, 0x2f, 0x01, 0x30, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, -0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, -0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, -0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, -0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, -0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, -0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0x39, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x3d, 0x00, -0xb7, 0x00, 0xb8, 0x00, 0x40, 0x00, 0xba, 0x00, 0xbb, 0x00, 0x43, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, -0x48, 0x00, 0x49, 0x00, 0xc3, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x50, 0x00, 0xca, 0x00, -0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0x5b, 0x00, -0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x61, 0x00, 0x62, 0x00, 0x31, 0x01, 0x32, 0x01, 0x33, 0x01, -0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, -0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, -0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x3e, 0x01, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x69, 0x00, 0x06, 0x02, 0x00, 0x00, -0x18, 0x00, 0x00, 0x00, 0x2f, 0x01, 0x30, 0x01, 0x7f, 0x00, 0x02, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, -0x84, 0x00, 0x85, 0x00, 0x04, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x02, 0x00, 0x18, 0x00, 0x8b, 0x00, -0x8c, 0x00, 0x8d, 0x00, 0x66, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x69, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -0x2f, 0x01, 0x30, 0x01, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0xd3, 0x0a, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x2f, 0x01, -0x30, 0x01, 0x7f, 0x00, 0x02, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x04, 0x00, -0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, -0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, -0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, -0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0x39, 0x00, 0xb3, 0x00, -0xb4, 0x00, 0xb5, 0x00, 0x3d, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0x40, 0x00, 0xba, 0x00, 0xbb, 0x00, 0x43, 0x00, 0xbd, 0x00, -0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc3, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc7, 0x00, -0xc8, 0x00, 0x50, 0x00, 0xca, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xd0, 0x00, 0xd1, 0x00, -0xd2, 0x00, 0xd3, 0x00, 0x5b, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x61, 0x00, 0x89, 0x00, -0x02, 0x00, 0x18, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x3f, 0x01, 0x40, 0x01, 0x8d, 0x00, 0x41, 0x01, 0x02, 0x00, 0x42, 0x01, -0xde, 0x00, 0x02, 0x00, 0xdf, 0x00, 0x69, 0x00, 0x43, 0x01, 0x44, 0x01, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x00, 0x69, 0x00, -0x6a, 0x00, 0x02, 0x00, 0xe4, 0x00, 0x69, 0x00, 0x45, 0x01, 0xe8, 0x00, 0xe9, 0x00, 0x02, 0x00, 0x46, 0x01, 0x47, 0x01, -0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xee, 0x00, 0x69, 0x00, 0xef, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x02, 0x00, 0x48, 0x01, -0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xf7, 0x00, 0x69, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfc, 0x00, -0xfd, 0x00, 0xdf, 0x00, 0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x49, 0x01, 0x01, 0x01, 0x02, 0x01, -0x69, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2f, 0x01, 0x30, 0x01, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, -0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, -0x10, 0x00, 0x0a, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x4a, 0x01, 0x4b, 0x01, 0x66, 0x00, 0x02, 0x00, -0x0d, 0x01, 0x0e, 0x01, 0x69, 0x00, 0x92, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x2f, 0x01, 0x30, 0x01, 0x8d, 0x00, -0x66, 0x00, 0x02, 0x00, 0x0f, 0x01, 0x69, 0x00, 0x32, 0x0c, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x2f, 0x01, 0x30, 0x01, -0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, -0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x01, 0x12, 0x01, -0x0f, 0x00, 0x13, 0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, -0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, -0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, -0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, -0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0x39, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x3d, 0x00, -0xb7, 0x00, 0xb8, 0x00, 0x40, 0x00, 0xba, 0x00, 0xbb, 0x00, 0x43, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, -0x48, 0x00, 0x49, 0x00, 0xc3, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x50, 0x00, 0xca, 0x00, -0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0x5b, 0x00, -0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x61, 0x00, 0x31, 0x01, 0x62, 0x00, 0x32, 0x01, 0x33, 0x01, -0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, -0x4c, 0x01, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, -0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, -0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x69, 0x00, 0x4c, 0x54, 0x45, 0x4d, -0x5f, 0x54, 0x41, 0x4d, 0xf4, 0x08, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, -0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xa2, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, -0xd8, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xf2, 0x01, 0x00, 0x00, 0x01, 0x30, 0x01, 0x5a, 0x03, 0x00, 0x00, 0x01, 0x44, -0x01, 0xbe, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x01, 0x90, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x02, -0x00, 0x00, 0x2e, 0x05, 0x00, 0x00, 0x02, 0x00, 0x01, 0xa2, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x2e, 0x05, 0x00, 0x00, -0x02, 0x10, 0x01, 0xd8, 0x01, 0x00, 0x00, 0x02, 0x20, 0x01, 0x4a, 0x06, 0x00, 0x00, 0x02, 0x30, 0x01, 0x5a, 0x03, 0x00, -0x00, 0x02, 0x44, 0x01, 0xbe, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0xae, 0x07, 0x00, 0x00, 0x02, 0x90, 0x00, 0xae, 0x07, -0x00, 0x00, 0xf8, 0x0e, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, -0x05, 0x00, 0x02, 0x00, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x04, 0x00, -0x69, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x72, 0x01, 0x69, 0x01, 0x73, 0x01, 0x02, 0x00, 0x74, 0x01, 0x04, 0x00, -0x69, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, -0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, -0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, -0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, -0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, -0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, -0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, -0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, -0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, 0xc5, 0x01, 0x04, 0x00, -0x69, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, -0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, -0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0x71, 0x01, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, -0x6a, 0x01, 0x69, 0x01, 0xd9, 0x01, 0x02, 0x00, 0xda, 0x01, 0xdb, 0x01, 0x04, 0x00, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, -0xdc, 0x01, 0x04, 0x00, 0x69, 0x01, 0xdd, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xde, 0x01, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, -0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, 0xdf, 0x01, -0x02, 0x00, 0x69, 0x00, 0x69, 0x01, 0x5d, 0x16, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, -0x6a, 0x01, 0x69, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, -0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, -0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, -0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, -0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, -0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, -0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, -0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, 0x69, 0x01, 0xd9, 0x01, -0x02, 0x00, 0xda, 0x01, 0xdb, 0x01, 0x04, 0x00, 0x69, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, -0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, -0x04, 0x00, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xdc, 0x01, 0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, 0xc0, 0x01, -0x04, 0x00, 0x69, 0x01, 0xef, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xde, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, -0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, -0xf6, 0x01, 0xfe, 0x01, 0xf9, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x00, 0x02, 0xf9, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, -0x04, 0x02, 0x05, 0x02, 0xf6, 0x01, 0x06, 0x02, 0x07, 0x02, 0xf9, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x08, 0x02, 0xf9, 0x01, -0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0xf6, 0x01, 0x0c, 0x02, 0xf9, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x0d, 0x02, 0xf9, 0x01, -0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, -0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0xbc, 0x03, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, -0x6a, 0x01, 0x69, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, -0x71, 0x01, 0x04, 0x00, 0x69, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x72, 0x01, 0x69, 0x01, 0x73, 0x01, 0x02, 0x00, -0x74, 0x01, 0x04, 0x00, 0x69, 0x01, 0x18, 0x02, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0x19, 0x02, 0x04, 0x00, 0x69, 0x01, -0xc4, 0x01, 0x02, 0x00, 0xc1, 0x01, 0x04, 0x00, 0x69, 0x01, 0x1a, 0x02, 0x02, 0x00, 0xc7, 0x01, 0x1b, 0x02, 0x1c, 0x02, -0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0xec, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, -0x6a, 0x01, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xdc, 0x01, 0x04, 0x00, 0x69, 0x01, 0x1d, 0x02, 0x02, 0x00, 0xc7, 0x01, -0x1e, 0x02, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0x22, 0x13, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, -0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, -0x70, 0x01, 0x71, 0x01, 0x04, 0x00, 0x69, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x72, 0x01, 0x69, 0x01, 0x73, 0x01, -0x02, 0x00, 0x74, 0x01, 0x04, 0x00, 0x69, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, -0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, -0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, -0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, -0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, -0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, -0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, -0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, -0x69, 0x01, 0x1f, 0x02, 0x20, 0x02, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, -0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, 0xc5, 0x01, 0x04, 0x00, 0x69, 0x01, -0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xc8, 0x01, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, -0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, -0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x3d, 0x02, -0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0xf8, 0x0e, 0x00, 0x00, 0x8a, 0x00, -0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6b, 0x01, 0x6c, 0x01, -0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x04, 0x00, 0x69, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, -0x72, 0x01, 0x69, 0x01, 0x73, 0x01, 0x02, 0x00, 0x74, 0x01, 0x04, 0x00, 0x69, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, -0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, -0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, -0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, -0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, -0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, -0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, -0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, -0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, -0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, 0xc5, 0x01, 0x04, 0x00, 0x69, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, -0xc8, 0x01, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x47, 0x02, 0x48, 0x02, 0x49, 0x02, 0x4a, 0x02, -0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x02, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0xfc, 0x15, -0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, 0x75, 0x01, 0x02, 0x00, -0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, -0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, -0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, -0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, -0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, -0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, -0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, -0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, 0x69, 0x01, 0xd9, 0x01, 0x02, 0x00, 0xda, 0x01, 0xdb, 0x01, 0x04, 0x00, -0x69, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, -0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0x04, 0x00, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, -0xdc, 0x01, 0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, 0xc0, 0x01, 0x04, 0x00, 0x69, 0x01, 0xef, 0x01, 0x02, 0x00, -0xc7, 0x01, 0xde, 0x01, 0xf0, 0x01, 0x4f, 0x02, 0x50, 0x02, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, -0x51, 0x02, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xf6, 0x01, 0xfe, 0x01, 0xf9, 0x01, -0xff, 0x01, 0xf6, 0x01, 0x00, 0x02, 0xf9, 0x01, 0x52, 0x02, 0x53, 0x02, 0x05, 0x02, 0xf6, 0x01, 0x54, 0x02, 0x55, 0x02, -0xf9, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x56, 0x02, 0xf9, 0x01, 0x57, 0x02, 0x58, 0x02, 0x0b, 0x02, 0xf6, 0x01, 0x59, 0x02, -0xf9, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x0d, 0x02, 0xf9, 0x01, 0x5a, 0x02, 0x5b, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, -0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x5c, 0x02, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, 0x3b, 0x13, 0x00, 0x00, 0x9f, 0x00, -0x00, 0x00, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x69, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6b, 0x01, 0x6c, 0x01, -0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x04, 0x00, 0x69, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, -0x72, 0x01, 0x69, 0x01, 0x73, 0x01, 0x02, 0x00, 0x74, 0x01, 0x04, 0x00, 0x69, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, -0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, -0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, -0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, -0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, -0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, -0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, -0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, -0xbd, 0x01, 0xbe, 0x01, 0x04, 0x00, 0x69, 0x01, 0x1f, 0x02, 0x20, 0x02, 0x69, 0x01, 0xbf, 0x01, 0x02, 0x00, 0xc0, 0x01, -0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x04, 0x00, 0x69, 0x01, 0xc4, 0x01, 0x02, 0x00, -0xc5, 0x01, 0x04, 0x00, 0x69, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xc8, 0x01, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, -0x60, 0x02, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, 0x68, 0x02, 0x69, 0x02, -0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x70, 0x02, 0x71, 0x02, 0x72, 0x02, 0x73, 0x02, -0x74, 0x02, 0x75, 0x02, 0x76, 0x02, 0x77, 0x02, 0x78, 0x02, 0x40, 0x02, 0x41, 0x02, 0xd8, 0x01, 0x69, 0x00, 0x69, 0x01, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x32, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, +0x33, 0x36, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, +0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x32, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, +0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, +0x20, 0x2f, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x32, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x33, 0x36, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x31, +0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x36, 0x37, 0x20, 0x3d, +0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x32, 0x33, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x2c, 0x20, 0x66, +0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2c, +0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, +0x36, 0x33, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x32, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x35, 0x32, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x32, 0x36, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, +0x35, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x35, +0x39, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x33, 0x2c, +0x20, 0x5f, 0x32, 0x36, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, +0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, +0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x35, 0x39, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, +0x33, 0x36, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x33, 0x2c, +0x20, 0x5f, 0x32, 0x36, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x30, 0x35, 0x3b, 0x00, 0x4c, 0x53, 0x4c, 0x47, 0x5f, 0x54, 0x41, 0x4d, 0xd6, 0x08, 0x00, 0x00, 0x12, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x98, 0x01, 0x00, +0x00, 0x01, 0x10, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xd2, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xe6, 0x01, +0x00, 0x00, 0x01, 0x30, 0x01, 0x30, 0x03, 0x00, 0x00, 0x01, 0x44, 0x01, 0x72, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x8a, +0x03, 0x00, 0x00, 0x01, 0x90, 0x00, 0x8a, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0xba, 0x04, 0x00, 0x00, 0x02, 0x00, 0x01, +0xce, 0x05, 0x00, 0x00, 0x02, 0x10, 0x00, 0xba, 0x04, 0x00, 0x00, 0x02, 0x10, 0x01, 0x06, 0x06, 0x00, 0x00, 0x02, 0x20, +0x01, 0x18, 0x06, 0x00, 0x00, 0x02, 0x30, 0x01, 0x50, 0x07, 0x00, 0x00, 0x02, 0x44, 0x01, 0x90, 0x07, 0x00, 0x00, 0x02, +0x80, 0x00, 0xa6, 0x07, 0x00, 0x00, 0x02, 0x90, 0x00, 0xa6, 0x07, 0x00, 0x00, 0x16, 0x0a, 0x00, 0x00, 0x85, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, +0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, +0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, +0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, +0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, +0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, +0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, +0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, +0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, +0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, +0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x02, 0x00, 0x67, +0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, +0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, +0x00, 0x79, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x7c, +0x00, 0x7d, 0x00, 0x02, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x04, 0x00, 0x84, +0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x02, 0x00, 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x66, 0x00, 0x02, +0x00, 0x8c, 0x00, 0x69, 0x00, 0x51, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x66, +0x00, 0x02, 0x00, 0x69, 0x00, 0xaf, 0x0c, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, +0x00, 0x02, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x04, 0x00, 0x8d, 0x00, 0x8e, +0x00, 0x8f, 0x00, 0x17, 0x00, 0x02, 0x00, 0x88, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, +0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, +0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, +0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, +0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, +0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, +0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, +0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0x61, 0x00, 0x87, 0x00, 0x02, 0x00, 0x88, +0x00, 0x89, 0x00, 0x8a, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x8b, 0x00, 0xda, 0x00, 0x02, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0x02, +0x00, 0xdd, 0x00, 0x69, 0x00, 0xde, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0x02, 0x00, 0xe1, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, +0x00, 0xe2, 0x00, 0x69, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0x02, 0x00, 0xe8, 0x00, 0xe9, +0x00, 0xea, 0x00, 0xeb, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xec, 0x00, 0x69, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, +0x00, 0x02, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xf5, +0x00, 0x69, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xdd, 0x00, 0x69, 0x00, 0x66, +0x00, 0x02, 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x00, 0x01, 0x69, 0x00, 0xec, 0x02, 0x00, 0x00, 0x1d, +0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x05, 0x00, 0x02, 0x00, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, +0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x08, 0x01, 0x14, +0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x09, 0x01, 0x0a, 0x01, 0x66, 0x00, 0x02, 0x00, 0x0b, 0x01, 0x0c, 0x01, 0x69, +0x00, 0x91, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x8b, 0x00, 0x66, 0x00, 0x02, +0x00, 0x0d, 0x01, 0x69, 0x00, 0x98, 0x0c, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x01, 0x01, 0x00, 0x02, +0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, +0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0f, 0x01, 0x10, 0x01, 0x0f, 0x00, 0x11, +0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, +0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, +0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, +0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, +0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, +0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, +0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, +0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, +0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x63, 0x00, 0x62, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x02, +0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x12, 0x01, 0x13, +0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, +0x01, 0x1e, 0x01, 0x1f, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x26, 0x01, 0x27, +0x01, 0x28, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x69, 0x00, 0x56, 0x09, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x2b, 0x01, 0x2c, +0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, +0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, +0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, +0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, +0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, +0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, +0x00, 0xaf, 0x00, 0x39, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0x3d, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0x40, 0x00, 0xb8, +0x00, 0xb9, 0x00, 0x43, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc1, 0x00, 0x4b, +0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0x50, 0x00, 0xc8, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, +0x00, 0x56, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0x5b, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, +0x00, 0xd7, 0x00, 0x61, 0x00, 0x62, 0x00, 0x2d, 0x01, 0x2e, 0x01, 0x2f, 0x01, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, +0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x30, 0x01, 0x31, 0x01, 0x32, 0x01, 0x33, +0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x38, 0x01, 0x78, 0x00, 0x79, +0x00, 0x7a, 0x00, 0x69, 0x00, 0x06, 0x02, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x2b, 0x01, 0x2c, 0x01, 0x7d, 0x00, 0x02, +0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x04, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, +0x00, 0x87, 0x00, 0x02, 0x00, 0x18, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x66, 0x00, 0x02, 0x00, 0x8c, 0x00, 0x69, +0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2b, 0x01, 0x2c, 0x01, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0xd3, +0x0a, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x2b, 0x01, 0x2c, 0x01, 0x7d, 0x00, 0x02, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, +0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x04, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, +0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, +0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, +0x00, 0x2d, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, +0x00, 0xae, 0x00, 0xaf, 0x00, 0x39, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0x3d, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0x40, +0x00, 0xb8, 0x00, 0xb9, 0x00, 0x43, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc1, +0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0x50, 0x00, 0xc8, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, +0x00, 0x55, 0x00, 0x56, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0x5b, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, +0x00, 0xd6, 0x00, 0xd7, 0x00, 0x61, 0x00, 0x87, 0x00, 0x02, 0x00, 0x18, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x39, 0x01, 0x3a, +0x01, 0x8b, 0x00, 0x3b, 0x01, 0x02, 0x00, 0x3c, 0x01, 0xdc, 0x00, 0x02, 0x00, 0xdd, 0x00, 0x69, 0x00, 0x3d, 0x01, 0x3e, +0x01, 0xe0, 0x00, 0x02, 0x00, 0xe1, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xe2, 0x00, 0x69, 0x00, 0x3f, 0x01, 0xe6, +0x00, 0xe7, 0x00, 0x02, 0x00, 0x40, 0x01, 0x41, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xec, 0x00, 0x69, 0x00, 0xed, +0x00, 0xee, 0x00, 0xef, 0x00, 0x02, 0x00, 0x42, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xf5, 0x00, 0x69, 0x00, 0xf6, +0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xdd, 0x00, 0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0xfc, +0x00, 0xfd, 0x00, 0x43, 0x01, 0xff, 0x00, 0x00, 0x01, 0x69, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2b, +0x01, 0x2c, 0x01, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, +0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x08, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, +0x00, 0x44, 0x01, 0x45, 0x01, 0x66, 0x00, 0x02, 0x00, 0x0b, 0x01, 0x0c, 0x01, 0x69, 0x00, 0x92, 0x00, 0x00, 0x00, 0x07, +0x00, 0x00, 0x00, 0x2b, 0x01, 0x2c, 0x01, 0x8b, 0x00, 0x66, 0x00, 0x02, 0x00, 0x0d, 0x01, 0x69, 0x00, 0xc1, 0x0b, 0x00, +0x00, 0x94, 0x00, 0x00, 0x00, 0x2b, 0x01, 0x2c, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, +0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, +0x00, 0x0f, 0x00, 0x10, 0x00, 0x0f, 0x01, 0x10, 0x01, 0x0f, 0x00, 0x11, 0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, +0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, +0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, +0x00, 0x26, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa5, 0x00, 0xa6, +0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0x39, +0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0x3d, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0x40, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0x43, +0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc1, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, +0x00, 0xc5, 0x00, 0xc6, 0x00, 0x50, 0x00, 0xc8, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xce, +0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0x5b, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0x61, +0x00, 0x2d, 0x01, 0x62, 0x00, 0x2e, 0x01, 0x2f, 0x01, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, +0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, 0x01, 0x4a, 0x01, 0x4b, +0x01, 0x4c, 0x01, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, +0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x69, +0x00, 0x4c, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x41, 0x4d, 0xe4, 0x08, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x9e, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, 0x00, +0x00, 0x00, 0x01, 0x10, 0x01, 0xd4, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xee, 0x01, 0x00, 0x00, 0x01, 0x30, 0x01, 0x56, +0x03, 0x00, 0x00, 0x01, 0x44, 0x01, 0xba, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0xe4, 0x03, 0x00, 0x00, 0x01, 0x90, 0x00, +0xe4, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x26, 0x05, 0x00, 0x00, 0x02, 0x00, 0x01, 0x9e, 0x01, 0x00, 0x00, 0x02, 0x10, +0x00, 0x26, 0x05, 0x00, 0x00, 0x02, 0x10, 0x01, 0xd4, 0x01, 0x00, 0x00, 0x02, 0x20, 0x01, 0x3e, 0x06, 0x00, 0x00, 0x02, +0x30, 0x01, 0x56, 0x03, 0x00, 0x00, 0x02, 0x44, 0x01, 0xba, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0xa2, 0x07, 0x00, 0x00, +0x02, 0x90, 0x00, 0xa2, 0x07, 0x00, 0x00, 0x80, 0x0e, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x5f, 0x01, 0x60, 0x01, 0x61, +0x01, 0x62, 0x01, 0x61, 0x01, 0x05, 0x00, 0x02, 0x00, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, +0x01, 0x69, 0x01, 0x04, 0x00, 0x61, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x6a, 0x01, 0x61, 0x01, 0x6b, 0x01, 0x02, +0x00, 0x6c, 0x01, 0x04, 0x00, 0x61, 0x01, 0x6d, 0x01, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, +0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, +0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, +0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, +0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, +0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, +0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, +0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0x04, 0x00, 0x61, +0x01, 0xb7, 0x01, 0x02, 0x00, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0x04, 0x00, 0x61, 0x01, 0xbc, 0x01, 0x02, +0x00, 0xbd, 0x01, 0x04, 0x00, 0x61, 0x01, 0xbe, 0x01, 0x02, 0x00, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, +0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, +0x01, 0xce, 0x01, 0x69, 0x00, 0x61, 0x01, 0x71, 0x01, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x5f, 0x01, 0x60, 0x01, 0x61, +0x01, 0x62, 0x01, 0x61, 0x01, 0xcf, 0x01, 0x02, 0x00, 0xd0, 0x01, 0xd1, 0x01, 0x04, 0x00, 0x61, 0x01, 0xb7, 0x01, 0x02, +0x00, 0xd2, 0x01, 0x04, 0x00, 0x61, 0x01, 0xd3, 0x01, 0x02, 0x00, 0xbf, 0x01, 0xd4, 0x01, 0xce, 0x01, 0x69, 0x00, 0x61, +0x01, 0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x61, 0x01, 0xd5, +0x01, 0x02, 0x00, 0x69, 0x00, 0x61, 0x01, 0x5d, 0x16, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x5f, 0x01, 0x60, 0x01, 0x61, +0x01, 0x62, 0x01, 0x61, 0x01, 0x6d, 0x01, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, +0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, +0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, +0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, +0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, +0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, +0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, +0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0x04, 0x00, 0x61, 0x01, 0xcf, +0x01, 0x02, 0x00, 0xd0, 0x01, 0xd1, 0x01, 0x04, 0x00, 0x61, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, 0x01, 0xda, +0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, +0x01, 0x04, 0x00, 0x61, 0x01, 0xb7, 0x01, 0x02, 0x00, 0xd2, 0x01, 0x04, 0x00, 0x61, 0x01, 0xbc, 0x01, 0x02, 0x00, 0xb8, +0x01, 0x04, 0x00, 0x61, 0x01, 0xe5, 0x01, 0x02, 0x00, 0xbf, 0x01, 0xd4, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xe9, +0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, +0x01, 0xec, 0x01, 0xf4, 0x01, 0xef, 0x01, 0xf5, 0x01, 0xec, 0x01, 0xf6, 0x01, 0xef, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, +0x01, 0xfa, 0x01, 0xfb, 0x01, 0xec, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xef, 0x01, 0xf5, 0x01, 0xec, 0x01, 0xfe, 0x01, 0xef, +0x01, 0xff, 0x01, 0x00, 0x02, 0x01, 0x02, 0xec, 0x01, 0x02, 0x02, 0xef, 0x01, 0xf5, 0x01, 0xec, 0x01, 0x03, 0x02, 0xef, +0x01, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, +0x02, 0xce, 0x01, 0x69, 0x00, 0x61, 0x01, 0xbc, 0x03, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x5f, 0x01, 0x60, 0x01, 0x61, +0x01, 0x62, 0x01, 0x61, 0x01, 0x05, 0x00, 0x02, 0x00, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, +0x01, 0x69, 0x01, 0x04, 0x00, 0x61, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x6a, 0x01, 0x61, 0x01, 0x6b, 0x01, 0x02, +0x00, 0x6c, 0x01, 0x04, 0x00, 0x61, 0x01, 0x0e, 0x02, 0x61, 0x01, 0xb7, 0x01, 0x02, 0x00, 0x0f, 0x02, 0x04, 0x00, 0x61, +0x01, 0xbc, 0x01, 0x02, 0x00, 0xb9, 0x01, 0x04, 0x00, 0x61, 0x01, 0x10, 0x02, 0x02, 0x00, 0xbf, 0x01, 0x11, 0x02, 0x12, +0x02, 0xce, 0x01, 0x69, 0x00, 0x61, 0x01, 0xec, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5f, 0x01, 0x60, 0x01, 0x61, +0x01, 0x62, 0x01, 0x61, 0x01, 0xb7, 0x01, 0x02, 0x00, 0xd2, 0x01, 0x04, 0x00, 0x61, 0x01, 0x13, 0x02, 0x02, 0x00, 0xbf, +0x01, 0x14, 0x02, 0xce, 0x01, 0x69, 0x00, 0x61, 0x01, 0x73, 0x12, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x5f, 0x01, 0x60, +0x01, 0x61, 0x01, 0x62, 0x01, 0x61, 0x01, 0x05, 0x00, 0x02, 0x00, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, +0x01, 0x68, 0x01, 0x69, 0x01, 0x04, 0x00, 0x61, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x6a, 0x01, 0x61, 0x01, 0x6b, +0x01, 0x02, 0x00, 0x6c, 0x01, 0x04, 0x00, 0x61, 0x01, 0x6d, 0x01, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, +0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, +0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, +0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, +0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, +0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, +0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, +0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0x04, +0x00, 0x61, 0x01, 0x15, 0x02, 0x16, 0x02, 0x61, 0x01, 0xb7, 0x01, 0x02, 0x00, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, +0x01, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, 0x04, 0x00, 0x61, 0x01, 0xbc, 0x01, 0x02, 0x00, 0xbd, 0x01, 0x04, 0x00, 0x61, +0x01, 0xbe, 0x01, 0x02, 0x00, 0xbf, 0x01, 0xc0, 0x01, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, +0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, +0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, +0x02, 0x34, 0x02, 0x35, 0x02, 0xce, 0x01, 0x69, 0x00, 0x61, 0x01, 0x80, 0x0e, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x5f, +0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x61, 0x01, 0x05, 0x00, 0x02, 0x00, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, +0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x04, 0x00, 0x61, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x6a, 0x01, 0x61, +0x01, 0x6b, 0x01, 0x02, 0x00, 0x6c, 0x01, 0x04, 0x00, 0x61, 0x01, 0x6d, 0x01, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, 0x70, +0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, +0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, +0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, +0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, +0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, +0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, +0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, +0x01, 0x04, 0x00, 0x61, 0x01, 0xb7, 0x01, 0x02, 0x00, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0x04, 0x00, 0x61, +0x01, 0xbc, 0x01, 0x02, 0x00, 0xbd, 0x01, 0x04, 0x00, 0x61, 0x01, 0xbe, 0x01, 0x02, 0x00, 0xbf, 0x01, 0xc0, 0x01, 0x36, +0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, +0x02, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0x69, 0x00, 0x61, 0x01, 0xfc, 0x15, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x5f, +0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x61, 0x01, 0x6d, 0x01, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, +0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, +0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, +0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, +0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, +0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, +0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, +0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0x04, +0x00, 0x61, 0x01, 0xcf, 0x01, 0x02, 0x00, 0xd0, 0x01, 0xd1, 0x01, 0x04, 0x00, 0x61, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, +0x01, 0xd9, 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, +0x01, 0xe3, 0x01, 0xe4, 0x01, 0x04, 0x00, 0x61, 0x01, 0xb7, 0x01, 0x02, 0x00, 0xd2, 0x01, 0x04, 0x00, 0x61, 0x01, 0xbc, +0x01, 0x02, 0x00, 0xb8, 0x01, 0x04, 0x00, 0x61, 0x01, 0xe5, 0x01, 0x02, 0x00, 0xbf, 0x01, 0xd4, 0x01, 0xe6, 0x01, 0x41, +0x02, 0x42, 0x02, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0x43, 0x02, 0xee, 0x01, 0xef, 0x01, 0xf0, +0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xec, 0x01, 0xf4, 0x01, 0xef, 0x01, 0xf5, 0x01, 0xec, 0x01, 0xf6, 0x01, 0xef, +0x01, 0x44, 0x02, 0x45, 0x02, 0xfb, 0x01, 0xec, 0x01, 0x46, 0x02, 0x47, 0x02, 0xef, 0x01, 0xf5, 0x01, 0xec, 0x01, 0x48, +0x02, 0xef, 0x01, 0x49, 0x02, 0x4a, 0x02, 0x01, 0x02, 0xec, 0x01, 0x4b, 0x02, 0xef, 0x01, 0xf5, 0x01, 0xec, 0x01, 0x03, +0x02, 0xef, 0x01, 0x4c, 0x02, 0x4d, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x4e, +0x02, 0xce, 0x01, 0x69, 0x00, 0x61, 0x01, 0x98, 0x12, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x5f, 0x01, 0x60, 0x01, 0x61, +0x01, 0x62, 0x01, 0x61, 0x01, 0x05, 0x00, 0x02, 0x00, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, +0x01, 0x69, 0x01, 0x04, 0x00, 0x61, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x6a, 0x01, 0x61, 0x01, 0x6b, 0x01, 0x02, +0x00, 0x6c, 0x01, 0x04, 0x00, 0x61, 0x01, 0x6d, 0x01, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, +0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, +0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, +0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, +0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, +0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, +0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, +0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0x04, 0x00, 0x61, +0x01, 0x15, 0x02, 0x16, 0x02, 0x61, 0x01, 0xb7, 0x01, 0x02, 0x00, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0x17, +0x02, 0x18, 0x02, 0x19, 0x02, 0x04, 0x00, 0x61, 0x01, 0xbc, 0x01, 0x02, 0x00, 0xbd, 0x01, 0x04, 0x00, 0x61, 0x01, 0xbe, +0x01, 0x02, 0x00, 0xbf, 0x01, 0xc0, 0x01, 0x4f, 0x02, 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, 0x55, +0x02, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x59, 0x02, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, +0x02, 0x60, 0x02, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, 0x68, 0x02, 0x34, +0x02, 0x35, 0x02, 0xce, 0x01, 0x69, 0x00, 0x61, 0x01, + }; int GIZMO_GIZMO_OFFSET = 0; -int GIZMO_GIZMO_SIZE = 28800; +int GIZMO_GIZMO_SIZE = 27809; From 676ddc377327be2c4fabc7be4b0aa4c08f06ace5 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Mon, 16 Sep 2024 20:51:14 +0800 Subject: [PATCH 159/232] add texture methods (including unproject) --- .../lib/thermion_dart/utils/geometry.dart | 365 +++++---- .../viewer/ffi/thermion_dart.g.dart | 110 +-- .../viewer/ffi/thermion_viewer_ffi.dart | 129 ++- .../viewer/shared_types/entities.dart | 4 + .../viewer/shared_types/geometry.dart | 27 +- .../viewer/thermion_viewer_base.dart | 30 +- .../native/include/CustomGeometry.hpp | 3 + .../native/include/FilamentViewer.hpp | 4 +- thermion_dart/native/include/SceneManager.hpp | 30 +- .../native/include/ThermionDartApi.h | 7 +- .../native/include/ThermionDartFFIApi.h | 5 +- .../native/include/UnprojectTexture.hpp | 39 + thermion_dart/native/src/CustomGeometry.cpp | 39 +- thermion_dart/native/src/FilamentViewer.cpp | 39 +- thermion_dart/native/src/SceneManager.cpp | 753 ++++++++++-------- thermion_dart/native/src/ThermionDartApi.cpp | 32 +- .../native/src/ThermionDartFFIApi.cpp | 69 +- thermion_dart/native/src/UnprojectTexture.cpp | 130 +++ .../lib/thermion_flutter_ffi.dart | 2 +- 19 files changed, 1093 insertions(+), 724 deletions(-) create mode 100644 thermion_dart/native/include/UnprojectTexture.hpp create mode 100644 thermion_dart/native/src/UnprojectTexture.cpp diff --git a/thermion_dart/lib/thermion_dart/utils/geometry.dart b/thermion_dart/lib/thermion_dart/utils/geometry.dart index 62660536..84985d84 100644 --- a/thermion_dart/lib/thermion_dart/utils/geometry.dart +++ b/thermion_dart/lib/thermion_dart/utils/geometry.dart @@ -1,14 +1,16 @@ import 'dart:math'; - +import 'dart:typed_data'; import 'package:thermion_dart/thermion_dart/viewer/shared_types/geometry.dart'; +import 'package:thermion_dart/thermion_dart/viewer/thermion_viewer_base.dart'; class GeometryHelper { static Geometry sphere({bool normals = true, bool uvs = true}) { int latitudeBands = 20; int longitudeBands = 20; - List vertices = []; - List _normals = []; + List verticesList = []; + List normalsList = []; + List uvsList = []; List indices = []; for (int latNumber = 0; latNumber <= latitudeBands; latNumber++) { @@ -25,12 +27,10 @@ class GeometryHelper { double y = cosTheta; double z = sinPhi * sinTheta; - vertices.addAll([x, y, z]); - _normals.addAll([ - x, - y, - z - ]); // For a sphere, normals are the same as vertex positions + verticesList.addAll([x, y, z]); + normalsList.addAll([x, y, z]); + + uvsList.addAll([longNumber / longitudeBands, latNumber / latitudeBands]); } } @@ -39,127 +39,171 @@ class GeometryHelper { int first = (latNumber * (longitudeBands + 1)) + longNumber; int second = first + longitudeBands + 1; - indices - .addAll([first, second, first + 1, second, second + 1, first + 1]); + indices.addAll([first, second, first + 1, second, second + 1, first + 1]); } } - return Geometry(vertices, indices, normals: normals ? _normals : null); + Float32List vertices = Float32List.fromList(verticesList); + Float32List? _normals = normals ? Float32List.fromList(normalsList) : null; + Float32List? _uvs = uvs ? Float32List.fromList(uvsList) : null; + + return Geometry(vertices, indices, normals: _normals, uvs: _uvs); } - static Geometry cube({bool normals = true, bool uvs = true}) { - final vertices = [ - // Front face - -1, -1, 1, - 1, -1, 1, - 1, 1, 1, - -1, 1, 1, +static Geometry cube({bool normals = true, bool uvs = true}) { + final vertices = Float32List.fromList([ + // Front face + -1, -1, 1, + 1, -1, 1, + 1, 1, 1, + -1, 1, 1, - // Back face - -1, -1, -1, - -1, 1, -1, - 1, 1, -1, - 1, -1, -1, + // Back face + -1, -1, -1, + -1, 1, -1, + 1, 1, -1, + 1, -1, -1, - // Top face - -1, 1, -1, - -1, 1, 1, - 1, 1, 1, - 1, 1, -1, + // Top face + -1, 1, -1, + -1, 1, 1, + 1, 1, 1, + 1, 1, -1, - // Bottom face - -1, -1, -1, - 1, -1, -1, - 1, -1, 1, - -1, -1, 1, + // Bottom face + -1, -1, -1, + 1, -1, -1, + 1, -1, 1, + -1, -1, 1, - // Right face - 1, -1, -1, - 1, 1, -1, - 1, 1, 1, - 1, -1, 1, + // Right face + 1, -1, -1, + 1, 1, -1, + 1, 1, 1, + 1, -1, 1, - // Left face - -1, -1, -1, - -1, -1, 1, - -1, 1, 1, - -1, 1, -1, - ]; + // Left face + -1, -1, -1, + -1, -1, 1, + -1, 1, 1, + -1, 1, -1, + ]); - final _normals = [ - // Front face - 0, 0, 1, - 0, 0, 1, - 0, 0, 1, - 0, 0, 1, + final _normals = normals ? Float32List.fromList([ + // Front face + 0, 0, 1, + 0, 0, 1, + 0, 0, 1, + 0, 0, 1, - // Back face - 0, 0, -1, - 0, 0, -1, - 0, 0, -1, - 0, 0, -1, + // Back face + 0, 0, -1, + 0, 0, -1, + 0, 0, -1, + 0, 0, -1, - // Top face - 0, 1, 0, - 0, 1, 0, - 0, 1, 0, - 0, 1, 0, + // Top face + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, - // Bottom face - 0, -1, 0, - 0, -1, 0, - 0, -1, 0, - 0, -1, 0, + // Bottom face + 0, -1, 0, + 0, -1, 0, + 0, -1, 0, + 0, -1, 0, - // Right face - 1, 0, 0, - 1, 0, 0, - 1, 0, 0, - 1, 0, 0, + // Right face + 1, 0, 0, + 1, 0, 0, + 1, 0, 0, + 1, 0, 0, - // Left face - -1, 0, 0, - -1, 0, 0, - -1, 0, 0, - -1, 0, 0, - ]; + // Left face + -1, 0, 0, + -1, 0, 0, + -1, 0, 0, + -1, 0, 0, + ]) : null; - final indices = [ - // Front face - 0, 1, 2, 0, 2, 3, - // Back face - 4, 5, 6, 4, 6, 7, - // Top face - 8, 9, 10, 8, 10, 11, - // Bottom face - 12, 13, 14, 12, 14, 15, - // Right face - 16, 17, 18, 16, 18, 19, - // Left face - 20, 21, 22, 20, 22, 23 - ]; - return Geometry(vertices, indices, normals: normals ? _normals : null); - } + final _uvs = uvs ? Float32List.fromList([ + // Front face + 1/3, 1/3, + 2/3, 1/3, + 2/3, 2/3, + 1/3, 2/3, + + // Back face + 2/3, 2/3, + 2/3, 1, + 1, 1, + 1, 2/3, + + // Top face + 1/3, 0, + 1/3, 1/3, + 2/3, 1/3, + 2/3, 0, + + // Bottom face + 1/3, 2/3, + 2/3, 2/3, + 2/3, 1, + 1/3, 1, + + // Right face + 2/3, 1/3, + 2/3, 2/3, + 1, 2/3, + 1, 1/3, + + // Left face + 0, 1/3, + 1/3, 1/3, + 1/3, 2/3, + 0, 2/3, + ]) : null; + + final indices = [ + // Front face + 0, 1, 2, 0, 2, 3, + // Back face + 4, 5, 6, 4, 6, 7, + // Top face + 8, 9, 10, 8, 10, 11, + // Bottom face + 12, 13, 14, 12, 14, 15, + // Right face + 16, 17, 18, 16, 18, 19, + // Left face + 20, 21, 22, 20, 22, 23 + ]; + return Geometry(vertices, indices, normals: _normals, uvs: _uvs); +} static Geometry cylinder({double radius = 1.0, double length = 1.0, bool normals = true, bool uvs = true }) { int segments = 32; - List vertices = []; - List _normals = []; + List verticesList = []; + List normalsList = []; + List uvsList = []; List indices = []; - // Create vertices and normals + // Create vertices, normals, and UVs for (int i = 0; i <= segments; i++) { double theta = i * 2 * pi / segments; double x = radius * cos(theta); double z = radius * sin(theta); // Top circle - vertices.addAll([x, length / 2, z]); - _normals.addAll([x / radius, 0, z / radius]); + verticesList.addAll([x, length / 2, z]); + normalsList.addAll([x / radius, 0, z / radius]); + uvsList.addAll([i / segments, 1]); // Bottom circle - vertices.addAll([x, -length / 2, z]); - _normals.addAll([x / radius, 0, z / radius]); + verticesList.addAll([x, -length / 2, z]); + normalsList.addAll([x / radius, 0, z / radius]); + uvsList.addAll([i / segments, 0]); } // Create indices @@ -178,45 +222,62 @@ class GeometryHelper { indices.addAll([bottomFirst, bottomSecond, topSecond]); } - // Add center vertices and normals for top and bottom faces - vertices.addAll([0, length / 2, 0]); // Top center - _normals.addAll([0, 1, 0]); - vertices.addAll([0, -length / 2, 0]); // Bottom center - _normals.addAll([0, -1, 0]); + // Add center vertices, normals, and UVs for top and bottom faces + verticesList.addAll([0, length / 2, 0]); // Top center + normalsList.addAll([0, 1, 0]); + uvsList.addAll([0.5, 0.5]); // Center of top face - // Add top and bottom face normals + verticesList.addAll([0, -length / 2, 0]); // Bottom center + normalsList.addAll([0, -1, 0]); + uvsList.addAll([0.5, 0.5]); // Center of bottom face + + // Add top and bottom face normals and UVs for (int i = 0; i <= segments; i++) { - _normals.addAll([0, 1, 0]); // Top face normal - _normals.addAll([0, -1, 0]); // Bottom face normal + normalsList.addAll([0, 1, 0]); // Top face normal + normalsList.addAll([0, -1, 0]); // Bottom face normal + + double u = 0.5 + 0.5 * cos(i * 2 * pi / segments); + double v = 0.5 + 0.5 * sin(i * 2 * pi / segments); + uvsList.addAll([u, v]); // Top face UV + uvsList.addAll([u, v]); // Bottom face UV } - return Geometry(vertices, indices, normals: normals ? _normals : null); + Float32List vertices = Float32List.fromList(verticesList); + Float32List? _normals = normals ? Float32List.fromList(normalsList) : null; + Float32List? _uvs = uvs ? Float32List.fromList(uvsList) : null; + + return Geometry(vertices, indices, normals: _normals, uvs: _uvs); } static Geometry conic({double radius = 1.0, double length = 1.0, bool normals = true, bool uvs = true}) { int segments = 32; - List vertices = []; - List _normals = []; + List verticesList = []; + List normalsList = []; + List uvsList = []; List indices = []; - // Create vertices and normals + // Create vertices, normals, and UVs for (int i = 0; i <= segments; i++) { double theta = i * 2 * pi / segments; double x = radius * cos(theta); double z = radius * sin(theta); // Base circle - vertices.addAll([x, 0, z]); + verticesList.addAll([x, 0, z]); // Calculate normal for the side double nx = x / sqrt(x * x + length * length); double nz = z / sqrt(z * z + length * length); double ny = radius / sqrt(radius * radius + length * length); - _normals.addAll([nx, ny, nz]); + normalsList.addAll([nx, ny, nz]); + + // UV coordinates + uvsList.addAll([i / segments, 0]); } // Apex - vertices.addAll([0, length, 0]); - _normals.addAll([0, 1, 0]); // Normal at apex points straight up + verticesList.addAll([0, length, 0]); + normalsList.addAll([0, 1, 0]); // Normal at apex points straight up + uvsList.addAll([0.5, 1]); // UV for apex // Create indices for (int i = 0; i < segments; i++) { @@ -226,54 +287,48 @@ class GeometryHelper { indices.addAll([i, segments, i + 1]); } - // Add base face normals + // Add base face normals and UVs for (int i = 0; i <= segments; i++) { - _normals.addAll([0, -1, 0]); // Base face normal + normalsList.addAll([0, -1, 0]); // Base face normal + double u = 0.5 + 0.5 * cos(i * 2 * pi / segments); + double v = 0.5 + 0.5 * sin(i * 2 * pi / segments); + uvsList.addAll([u, v]); // Base face UV } - return Geometry(vertices, indices, normals: normals ? _normals : null); + Float32List vertices = Float32List.fromList(verticesList); + Float32List? _normals = normals ? Float32List.fromList(normalsList) : null; + Float32List? _uvs = uvs ? Float32List.fromList(uvsList) : null; + + return Geometry(vertices, indices, normals: _normals, uvs: _uvs); } static Geometry plane({double width = 1.0, double height = 1.0, bool normals = true, bool uvs = true}) { - List vertices = [ - -width / 2, - 0, - -height / 2, - width / 2, - 0, - -height / 2, - width / 2, - 0, - height / 2, - -width / 2, - 0, - height / 2, - ]; + Float32List vertices = Float32List.fromList([ + -width / 2, 0, -height / 2, + width / 2, 0, -height / 2, + width / 2, 0, height / 2, + -width / 2, 0, height / 2, + ]); - List _normals = [ - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - ]; + Float32List? _normals = normals ? Float32List.fromList([ + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + ]) : null; + + Float32List? _uvs = uvs ? Float32List.fromList([ + 0, 0, + 1, 0, + 1, 1, + 0, 1, + ]) : null; List indices = [ - 0, - 2, - 1, - 0, - 3, - 2, + 0, 2, 1, + 0, 3, 2, ]; - return Geometry(vertices, indices, normals: normals ? _normals : null); + return Geometry(vertices, indices, normals: _normals, uvs: _uvs); } -} +} \ No newline at end of file diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart index bc6ac154..6bdafd91 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart @@ -1039,37 +1039,22 @@ external void remove_animation_component( ffi.Pointer, ffi.Pointer, ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, ffi.Pointer, ffi.Int, ffi.Int, ffi.Pointer)>(isLeaf: true) external int create_geometry( - ffi.Pointer sceneManager, - ffi.Pointer vertices, - int numVertices, - ffi.Pointer indices, - int numIndices, - int primitiveType, - ffi.Pointer materialPath, -); - -@ffi.Native< - EntityId Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Pointer)>(isLeaf: true) -external int create_geometry_with_normals( ffi.Pointer sceneManager, ffi.Pointer vertices, int numVertices, ffi.Pointer normals, int numNormals, + ffi.Pointer uvs, + int numUvs, ffi.Pointer indices, int numIndices, int primitiveType, @@ -1214,6 +1199,44 @@ external void set_material_property_float4( float4 value, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Uint32, ffi.Uint32)>(isLeaf: true) +external void unproject_texture( + ffi.Pointer sceneManager, + int entity, + ffi.Pointer out, + int outWidth, + int outHeight, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, ffi.Size)>(isLeaf: true) +external ffi.Pointer create_texture( + ffi.Pointer sceneManager, + ffi.Pointer data, + int length, +); + +@ffi.Native, ffi.Pointer)>( + isLeaf: true) +external void destroy_texture( + ffi.Pointer sceneManager, + ffi.Pointer texture, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Pointer, ffi.Int)>(isLeaf: true) +external void apply_texture_to_material( + ffi.Pointer sceneManager, + int entity, + ffi.Pointer texture, + ffi.Pointer parameterName, + int materialIndex, +); + @ffi.Native< ffi.Void Function( ffi.Pointer, @@ -1683,6 +1706,10 @@ external void reset_to_rest_pose_ffi( ffi.Pointer, ffi.Pointer, ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, ffi.Pointer, ffi.Int, ffi.Int, @@ -1694,6 +1721,10 @@ external void create_geometry_ffi( ffi.Pointer sceneManager, ffi.Pointer vertices, int numVertices, + ffi.Pointer normals, + int numNormals, + ffi.Pointer uvs, + int numUvs, ffi.Pointer indices, int numIndices, int primitiveType, @@ -1703,31 +1734,20 @@ external void create_geometry_ffi( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Pointer, - ffi.Bool, - ffi.Pointer>)>( - isLeaf: true) -external void create_geometry_with_normals_ffi( + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Uint32, + ffi.Uint32, + ffi.Pointer>)>(isLeaf: true) +external void unproject_texture_ffi( ffi.Pointer sceneManager, - ffi.Pointer vertices, - int numVertices, - ffi.Pointer normals, - int numNormals, - ffi.Pointer indices, - int numIndices, - int primitiveType, - ffi.Pointer materialPath, - bool keepData, - ffi.Pointer> callback, + int entity, + ffi.Pointer out, + int outWidth, + int outHeight, + ffi.Pointer> callback, ); final class ResourceBuffer extends ffi.Struct { diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index 42c6e9de..82e7b3e3 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -58,7 +58,8 @@ class ThermionViewerFFI extends ThermionViewer { /// Stream get sceneUpdated => _sceneUpdateEventController.stream; - final _sceneUpdateEventController = StreamController.broadcast(); + final _sceneUpdateEventController = + StreamController.broadcast(); final Pointer resourceLoader; @@ -355,9 +356,6 @@ class ThermionViewerFFI extends ThermionViewer { remove_ibl_ffi(_viewer!); } - /// - /// - /// @override Future addLight( LightType type, @@ -376,30 +374,21 @@ class ThermionViewerFFI extends ThermionViewer { double sunHaloSize = 10.0, double sunHaloFallof = 80.0, bool castShadows = true}) async { - var entity = await withIntCallback((callback) => add_light_ffi( - _viewer!, - type.index, - colour, - intensity, - posX, - posY, - posZ, - dirX, - dirY, - dirZ, - falloffRadius, - spotLightConeInner, - spotLightConeOuter, - sunAngularRadius = 0.545, - sunHaloSize = 10.0, - sunHaloFallof = 80.0, - castShadows, - callback)); - if (entity == _FILAMENT_ASSET_ERROR) { - throw Exception("Failed to add light to scene"); - } + DirectLight directLight = DirectLight( + type: type, + color: colour, + intensity: intensity, + position: Vector3(posX, posY, posZ), + direction: Vector3(dirX, dirY, dirZ), + falloffRadius: falloffRadius, + spotLightConeInner: spotLightConeInner, + spotLightConeOuter: spotLightConeOuter, + sunAngularRadius: sunAngularRadius, + sunHaloSize: sunHaloSize, + sunHaloFallof: sunHaloFallof, + castShadows: castShadows); - return entity; + return addDirectLight(directLight); } /// @@ -1827,49 +1816,25 @@ class ThermionViewerFFI extends ThermionViewer { final materialPathPtr = geometry.materialPath?.toNativeUtf8(allocator: allocator) ?? nullptr; - final vertexPtr = allocator(geometry.vertices.length); - final indicesPtr = allocator(geometry.indices.length); - for (int i = 0; i < geometry.vertices.length; i++) { - vertexPtr[i] = geometry.vertices[i]; - } - for (int i = 0; i < geometry.indices.length; i++) { - (indicesPtr + i).value = geometry.indices[i]; - } - - var normalsPtr = nullptr.cast(); - if (geometry.normals != null) { - normalsPtr = allocator(geometry.normals!.length); - for (int i = 0; i < geometry.normals!.length; i++) { - normalsPtr[i] = geometry.normals![i]; - } - } - - var entity = await withIntCallback((callback) => - create_geometry_with_normals_ffi( - _sceneManager!, - vertexPtr, - geometry.vertices.length, - normalsPtr, - geometry.normals?.length ?? 0, - indicesPtr, - geometry.indices.length, - geometry.primitiveType.index, - materialPathPtr.cast(), - keepData, - callback)); + var entity = await withIntCallback((callback) => create_geometry_ffi( + _sceneManager!, + geometry.vertices.address, + geometry.vertices.length, + geometry.normals.address, + geometry.normals.length, + geometry.uvs.address, + geometry.uvs.length, + geometry.indices.address, + geometry.indices.length, + geometry.primitiveType.index, + materialPathPtr.cast(), + keepData, + callback)); if (entity == _FILAMENT_ASSET_ERROR) { throw Exception("Failed to create geometry"); } - allocator.free(materialPathPtr); - allocator.free(vertexPtr); - allocator.free(indicesPtr); - - if (geometry.normals != null) { - allocator.free(normalsPtr); - } - _sceneUpdateEventController .add(SceneUpdateEvent.addGeometry(entity, geometry)); @@ -2001,4 +1966,38 @@ class ThermionViewerFFI extends ThermionViewer { _sceneManager!, entity, materialIndex, ptr.cast(), struct); allocator.free(ptr); } + + Future unproject( + ThermionEntity entity, int outWidth, int outHeight) async { + final outPtr = Uint8List(outWidth * outHeight * 4); + await withVoidCallback((callback) { + unproject_texture_ffi( + _viewer!, entity, outPtr.address, outWidth, outHeight, callback); + }); + + return outPtr.buffer.asUint8List(); + } + + Future createTexture(Uint8List data) async { + var ptr = create_texture(_sceneManager!, data.address, data.length); + return ThermionFFITexture(ptr); + } + + Future applyTexture(ThermionFFITexture texture, ThermionEntity entity, + {int materialIndex = 0, String parameterName = "baseColorMap"}) async { + using(parameterName.toNativeUtf8(), (namePtr) async { + apply_texture_to_material(_sceneManager!, entity, texture._pointer, + namePtr.cast(), materialIndex); + }); + } + + Future destroyTexture(ThermionFFITexture texture) async { + destroy_texture(_sceneManager!, texture._pointer); + } +} + +class ThermionFFITexture extends ThermionTexture { + final Pointer _pointer; + + ThermionFFITexture(this._pointer); } diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart index 637bb800..b59631ac 100644 --- a/thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart @@ -7,3 +7,7 @@ export 'light_options.dart'; // a handle that can be safely passed back to the rendering layer to manipulate an Entity typedef ThermionEntity = int; + +abstract class ThermionTexture { + +} diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart index b6fa4f96..076b36c4 100644 --- a/thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart @@ -1,19 +1,34 @@ +import 'dart:typed_data'; + import 'package:thermion_dart/thermion_dart/viewer/thermion_viewer_base.dart'; class Geometry { - final List vertices; - final List indices; - final List? normals; - final List<(double, double)>? uvs; + final Float32List vertices; + final Uint16List indices; + final Float32List normals; + final Float32List uvs; final PrimitiveType primitiveType; final String? materialPath; - Geometry(this.vertices, this.indices, { this.normals=null, this.uvs=null, - this.primitiveType = PrimitiveType.TRIANGLES, this.materialPath = null}); + Geometry( + this.vertices, + List indices, { + Float32List? normals, + Float32List? uvs, + this.primitiveType = PrimitiveType.TRIANGLES, + this.materialPath, + }) : indices = Uint16List.fromList(indices), + normals = normals ?? Float32List(0), + uvs = uvs ?? Float32List(0) { + assert(this.uvs.length == 0 || this.uvs.length == (vertices.length ~/ 3) * 2); + } void scale(double factor) { for (int i = 0; i < vertices.length; i++) { vertices[i] = vertices[i] * factor; } } + + bool get hasNormals => normals.isNotEmpty; + bool get hasUVs => uvs.isNotEmpty; } diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart index 621e64c5..025af6e9 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart @@ -11,10 +11,9 @@ import 'dart:async'; import 'package:animation_tools_dart/animation_tools_dart.dart'; abstract class ThermionViewer { - - /// + /// /// A Future that resolves when the underlying rendering context has been successfully created. - /// + /// Future get initialized; /// @@ -136,7 +135,8 @@ abstract class ThermionViewer { /// Note that [sunAngularRadius] is in degrees, /// whereas [spotLightConeInner] and [spotLightConeOuter] are in radians /// - @Deprecated("This will be removed in future versions. Use addDirectLight instead.") + @Deprecated( + "This will be removed in future versions. Use addDirectLight instead.") Future addLight( LightType type, double colour, @@ -161,8 +161,7 @@ abstract class ThermionViewer { /// Note that [sunAngularRadius] is in degrees, /// whereas [spotLightConeInner] and [spotLightConeOuter] are in radians /// - Future addDirectLight( - DirectLight light); + Future addDirectLight(DirectLight light); /// /// Remove a light from the scene. @@ -787,7 +786,7 @@ abstract class ThermionViewer { /// Creates a (renderable) entity with the specified geometry and adds to the scene. /// If [keepData] is true, the source data will not be released. /// - Future createGeometry(Geometry geometry, { bool keepData= false}); + Future createGeometry(Geometry geometry, {bool keepData = false}); /// /// Gets the parent entity of [entity]. Returns null if the entity has no parent. @@ -853,4 +852,21 @@ abstract class ThermionViewer { /// Removes the outline around [entity]. Noop if there was no highlight. /// Future removeStencilHighlight(ThermionEntity entity); + + /// + /// Decodes the specified image data and creates a texture. + /// + Future createTexture(Uint8List data); + + /// + /// + /// + Future applyTexture(covariant ThermionTexture texture, ThermionEntity entity, + {int materialIndex = 0, String parameterName = "baseColorMap"}); + + /// + /// + /// + Future destroyTexture(covariant ThermionTexture texture); + } diff --git a/thermion_dart/native/include/CustomGeometry.hpp b/thermion_dart/native/include/CustomGeometry.hpp index 93df18dc..5ecc568d 100644 --- a/thermion_dart/native/include/CustomGeometry.hpp +++ b/thermion_dart/native/include/CustomGeometry.hpp @@ -24,6 +24,8 @@ public: uint32_t numVertices, float* normals, uint32_t numNormals, + float *uvs, + uint32_t numUvs, uint16_t* indices, uint32_t numIndices, RenderableManager::PrimitiveType primitiveType, @@ -36,6 +38,7 @@ public: float* vertices = nullptr; float* normals = nullptr; + float *uvs = nullptr; uint32_t numVertices = 0; uint16_t* indices = 0; uint32_t numIndices = 0; diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index 92c8133c..6f26b3e3 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -138,7 +138,7 @@ namespace thermion_filament void setRecording(bool recording); void setRecordingOutputDirectory(const char *path); - void capture(uint8_t *out, void (*onComplete)()); + void capture(uint8_t *out, bool useFence, void (*onComplete)()); void setAntiAliasing(bool msaaEnabled, bool fxaaEnabled, bool taaEnabled); void setDepthOfField(); @@ -151,6 +151,8 @@ namespace thermion_filament return (SceneManager *const)_sceneManager; } + void unprojectTexture(EntityId entity, uint8_t* out, uint32_t outWidth, uint32_t outHeight); + private: const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; void* _context = nullptr; diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index fb23d4b7..6e054c91 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -168,7 +169,11 @@ namespace thermion_filament void playAnimation(EntityId e, int index, bool loop, bool reverse, bool replaceActive, float crossfade = 0.3f, float startOffset = 0.0f); void stopAnimation(EntityId e, int index); void setMorphTargetWeights(const char *const entityName, float *weights, int count); - void loadTexture(EntityId entity, const char *resourcePath, int renderableIndex); + + Texture* createTexture(const uint8_t* data, size_t length, const char* name); + bool applyTexture(EntityId entityId, Texture *texture, const char* slotName, int materialIndex); + void destroyTexture(Texture* texture); + void setAnimationFrame(EntityId entity, int animationIndex, int animationFrame); bool hide(EntityId entity, const char *meshName); bool reveal(EntityId entity, const char *meshName); @@ -226,29 +231,16 @@ namespace thermion_filament void setLayerEnabled(int layer, bool enabled); /// - /// Creates an entity with the specified geometry/material and adds to the scene. + /// Creates an entity with the specified geometry/material/normals and adds to the scene. /// If [keepData] is true, stores /// EntityId createGeometry( - float *vertices, - uint32_t numVertices, - uint16_t *indices, - uint32_t numIndices, - filament::RenderableManager::PrimitiveType primitiveType = RenderableManager::PrimitiveType::TRIANGLES, - const char *materialPath = nullptr, - bool keepData = false - ); - - - /// - /// Creates an entity with the specified geometry/material/normals and adds to the scene. - /// If [keepData] is true, stores - /// - EntityId createGeometryWithNormals( float *vertices, uint32_t numVertices, float *normals, uint32_t numNormals, + float *uvs, + uint32_t numUvs, uint16_t *indices, uint32_t numIndices, filament::RenderableManager::PrimitiveType primitiveType = RenderableManager::PrimitiveType::TRIANGLES, @@ -313,9 +305,9 @@ namespace thermion_filament _instances; tsl::robin_map _assets; tsl::robin_map> _geometry; - tsl::robin_map> _highlighted; - + tsl::robin_map> _highlighted; tsl::robin_map> _transformUpdates; + std::set _textures; AnimationComponentManager *_animationComponentManager = nullptr; CollisionComponentManager *_collisionComponentManager = nullptr; diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index baba1538..3ee7a047 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -262,8 +262,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE bool add_animation_component(void *const sceneManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE void remove_animation_component(void *const sceneManager, EntityId entityId); - EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath); - EMSCRIPTEN_KEEPALIVE EntityId create_geometry_with_normals(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath); + EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, float *uvs, int numUvs, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath); EMSCRIPTEN_KEEPALIVE EntityId get_parent(void *const sceneManager, EntityId child); EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child); EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling); @@ -279,6 +278,10 @@ extern "C" EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char* property, float value); EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char* property, float4 value); + EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const sceneManager, EntityId entity, uint8_t* out, uint32_t outWidth, uint32_t outHeight); + EMSCRIPTEN_KEEPALIVE void* const create_texture(void *const sceneManager, uint8_t* data, size_t length); + EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void* const texture); + EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(void *const sceneManager, EntityId entity, void* const texture, const char* parameterName, int materialIndex); #ifdef __cplusplus diff --git a/thermion_dart/native/include/ThermionDartFFIApi.h b/thermion_dart/native/include/ThermionDartFFIApi.h index b4ae938e..4c2d3518 100644 --- a/thermion_dart/native/include/ThermionDartFFIApi.h +++ b/thermion_dart/native/include/ThermionDartFFIApi.h @@ -101,8 +101,9 @@ extern "C" void (*callback)(bool)); EMSCRIPTEN_KEEPALIVE void set_post_processing_ffi(void *const viewer, bool enabled); EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_ffi(void *const sceneManager, EntityId entityId, void(*callback)()); - EMSCRIPTEN_KEEPALIVE void create_geometry_ffi(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath, bool keepData, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void create_geometry_with_normals_ffi(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void create_geometry_ffi(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, float *uvs, int numUvs, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void unproject_texture_ffi(void *const sceneManager, EntityId entity, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()); + #ifdef __cplusplus } diff --git a/thermion_dart/native/include/UnprojectTexture.hpp b/thermion_dart/native/include/UnprojectTexture.hpp new file mode 100644 index 00000000..0f04dba0 --- /dev/null +++ b/thermion_dart/native/include/UnprojectTexture.hpp @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "CustomGeometry.hpp" + +namespace thermion_filament { + +class UnprojectTexture { +public: + UnprojectTexture(const CustomGeometry * geometry, Camera& camera, Engine* engine) + : _geometry(geometry), _camera(camera), _engine(engine) {} + + void unproject(utils::Entity entity, const uint8_t* inputTexture, uint8_t* outputTexture, uint32_t inputWidth, uint32_t inputHeight, + uint32_t outputWidth, uint32_t outputHeight); + +private: + const CustomGeometry * _geometry; + const Camera& _camera; + Engine* _engine; + + math::float3 doUnproject(const math::float2& screenPos, float depth, const math::mat4& invViewProj); + bool isInsideTriangle(const math::float2& p, const math::float2& a, const math::float2& b, const math::float2& c); + math::float3 barycentric(const math::float2& p, const math::float2& a, const math::float2& b, const math::float2& c); +}; +} \ No newline at end of file diff --git a/thermion_dart/native/src/CustomGeometry.cpp b/thermion_dart/native/src/CustomGeometry.cpp index 48d7aa91..0736bdaf 100644 --- a/thermion_dart/native/src/CustomGeometry.cpp +++ b/thermion_dart/native/src/CustomGeometry.cpp @@ -1,7 +1,5 @@ #include - #include "math.h" - #include #include #include @@ -22,6 +20,8 @@ CustomGeometry::CustomGeometry( uint32_t numVertices, float* normals, uint32_t numNormals, + float* uvs, + uint32_t numUvs, uint16_t* indices, uint32_t numIndices, RenderableManager::PrimitiveType primitiveType, @@ -35,6 +35,16 @@ CustomGeometry::CustomGeometry( Log("numNormals %d", numNormals); this->normals = new float[numNormals]; std::memcpy(this->normals, normals, numNormals * sizeof(float)); + } else { + Log("no normals"); + } + + if(numUvs > 0) { + Log("numUvs %d", numUvs); + this->uvs = new float[numUvs]; + std::memcpy(this->uvs, uvs, numUvs * sizeof(float)); + } else { + this->uvs = nullptr; } this->indices = new uint16_t[numIndices]; @@ -76,7 +86,6 @@ VertexBuffer* CustomGeometry::vertexBuffer() const { triangles.push_back(triangle); } - // Create a SurfaceOrientation builder geometry::SurfaceOrientation::Builder builder; builder.vertexCount(numVertices) @@ -92,8 +101,13 @@ VertexBuffer* CustomGeometry::vertexBuffer() const { auto quats = new std::vector(numVertices); orientation->getQuats(quats->data(), numVertices); - // Create dummy UV data - auto dummyUVs = new std::vector(numVertices, filament::math::float2{0.0f, 0.0f}); + // Use provided UVs or create dummy UV data + std::vector* uvData; + if (this->uvs != nullptr) { + uvData = new std::vector((filament::math::float2*)this->uvs, (filament::math::float2*)(this->uvs + numVertices * 2)); + } else { + uvData = new std::vector(numVertices, filament::math::float2{0.0f, 0.0f}); + } // Create dummy vertex color data (white color for all vertices) auto dummyColors = new std::vector(numVertices, filament::math::float4{1.0f, 1.0f, 1.0f, 1.0f}); @@ -118,22 +132,21 @@ VertexBuffer* CustomGeometry::vertexBuffer() const { vertexBuffer->setBufferAt(*_engine, 0, VertexBuffer::BufferDescriptor( this->vertices, vertexBuffer->getVertexCount() * sizeof(math::float3), vertexCallback)); - - // Set UV0 buffer + // Set UV0 buffer vertexBuffer->setBufferAt(*_engine, 1, VertexBuffer::BufferDescriptor( - dummyUVs->data(), dummyUVs->size() * sizeof(math::float2), + uvData->data(), uvData->size() * sizeof(math::float2), [](void* buf, size_t, void* data) { delete static_cast*>(data); - }, dummyUVs)); + }, uvData)); - // Set UV1 buffer + // Set UV1 buffer (reusing UV0 data) vertexBuffer->setBufferAt(*_engine, 2, VertexBuffer::BufferDescriptor( - dummyUVs->data(), dummyUVs->size() * sizeof(math::float2), + uvData->data(), uvData->size() * sizeof(math::float2), [](void* buf, size_t, void* data) { // Do nothing here, as we're reusing the same data as UV0 }, nullptr)); - // Set vertex color buffer + // Set vertex color buffer vertexBuffer->setBufferAt(*_engine, 3, VertexBuffer::BufferDescriptor( dummyColors->data(), dummyColors->size() * sizeof(math::float4), [](void* buf, size_t, void* data) { @@ -154,6 +167,8 @@ VertexBuffer* CustomGeometry::vertexBuffer() const { CustomGeometry::~CustomGeometry() { delete[] vertices; delete[] indices; + if (normals) delete[] normals; + if (uvs) delete[] uvs; } void CustomGeometry::computeBoundingBox() { diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 59cc7988..95c7a004 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -97,7 +97,7 @@ #include "StreamBufferAdapter.hpp" #include "material/image.h" #include "TimeIt.hpp" -#include "ThreadPool.hpp" +#include "UnprojectTexture.hpp" namespace filament { @@ -306,7 +306,7 @@ namespace thermion_filament bool shadows) { auto light = EntityManager::get().create(); - + auto result = LightManager::Builder(t) .color(Color::cct(colour)) .intensity(intensity) @@ -1197,7 +1197,7 @@ namespace thermion_filament } }; - void FilamentViewer::capture(uint8_t *out, void (*onComplete)()) + void FilamentViewer::capture(uint8_t *out, bool useFence, void (*onComplete)()) { Viewport const &vp = _view->getViewport(); @@ -1209,16 +1209,19 @@ namespace thermion_filament uint8_t *out = (uint8_t *)(frameCallbackData->at(0)); void *callbackPtr = frameCallbackData->at(1); - void (*callback)(void) = (void (*)(void))callbackPtr; memcpy(out, buf, size); delete frameCallbackData; - callback(); + if(callbackPtr) { + void (*callback)(void) = (void (*)(void))callbackPtr; + callback(); + } }; // Create a fence - #ifndef __EMSCRIPTEN__ - Fence* fence = _engine->createFence(); - #endif + Fence* fence = nullptr; + if(useFence) { + fence = _engine->createFence(); + } auto userData = new std::vector{out, (void *)onComplete}; @@ -1245,9 +1248,10 @@ namespace thermion_filament #ifdef __EMSCRIPTEN__ _engine->execute(); emscripten_webgl_commit_frame(); -#else - Fence::waitAndDestroy(fence); #endif + if(fence) { + Fence::waitAndDestroy(fence); + } } void FilamentViewer::savePng(void *buf, size_t size, int frameNumber) @@ -1464,6 +1468,21 @@ namespace thermion_filament }); } + void FilamentViewer::unprojectTexture(EntityId entityId, uint8_t* out, uint32_t outWidth, uint32_t outHeight) { + const auto * geometry = _sceneManager->getGeometry(entityId); + if(!geometry->uvs) { + Log("No UVS"); + return; + } + + const auto& viewport = _view->getViewport(); + auto viewportCapture = new uint8_t[viewport.width * viewport.height * 4]; + capture(viewportCapture, true, nullptr); + UnprojectTexture unproject(geometry, _view->getCamera(), _engine); + + unproject.unproject(utils::Entity::import(entityId), viewportCapture, out, viewport.width, viewport.height, outWidth, outHeight); + } + } // namespace thermion_filament diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 80f4490b..71370760 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -31,6 +31,7 @@ #include "Log.hpp" #include "SceneManager.hpp" #include "CustomGeometry.hpp" +#include "UnprojectTexture.hpp" extern "C" { @@ -217,8 +218,9 @@ namespace thermion_filament FilamentInstance *inst = asset->getInstance(); inst->getAnimator()->updateBoneMatrices(); inst->recomputeBoundingBoxes(); - - if(!keepData) { + + if (!keepData) + { asset->releaseSourceData(); } @@ -292,7 +294,8 @@ namespace thermion_filament _instances.emplace(instanceEntityId, inst); } - if(!keepData) { + if (!keepData) + { asset->releaseSourceData(); } @@ -362,7 +365,8 @@ namespace thermion_filament const auto asset = pos->second; auto instance = _assetLoader->createInstance(asset); - if(!instance) { + if (!instance) + { Log("Failed to create instance"); return 0; } @@ -497,6 +501,12 @@ namespace thermion_filament asset.second->getLightEntityCount()); _assetLoader->destroyAsset(asset.second); } + for(auto* texture : _textures) { + _engine->destroy(texture); + } + + // TODO - free geometry? + _textures.clear(); _assets.clear(); } @@ -608,6 +618,7 @@ namespace thermion_filament auto entity = Entity::import(entityId); + if (_animationComponentManager->hasComponent(entity)) { _animationComponentManager->removeComponent(entity); @@ -620,6 +631,10 @@ namespace thermion_filament _scene->remove(entity); + if(isGeometryEntity(entityId)) { + return; + } + const auto *instance = getInstanceByEntityId(entityId); if (instance) @@ -645,7 +660,6 @@ namespace thermion_filament if (!asset) { - Log("ERROR: could not find FilamentInstance or FilamentAsset associated with the given entity id"); return; } _assets.erase(entityId); @@ -1288,78 +1302,100 @@ namespace thermion_filament animationComponent.gltfAnimations.end()); } - void SceneManager::loadTexture(EntityId entity, const char *resourcePath, int renderableIndex) + Texture *SceneManager::createTexture(const uint8_t *data, size_t length, const char *name) { + using namespace filament; - // const auto &pos = _instances.find(entity); - // if (pos == _instances.end()) - // { - // Log("ERROR: asset not found for entity."); - // return; - // } - // const auto *instance = pos->second; + // Create an input stream from the data + std::istringstream stream(std::string(reinterpret_cast(data), length)); - // Log("Loading texture at %s for renderableIndex %d", resourcePath, renderableIndex); + // Decode the image + image::LinearImage linearImage = image::ImageDecoder::decode(stream, name, image::ImageDecoder::ColorSpace::SRGB); - // string rp(resourcePath); + if (!linearImage.isValid()) + { + Log("Failed to decode image."); + return nullptr; + } - // if (asset.texture) - // { - // _engine->destroy(asset.texture); - // asset.texture = nullptr; - // } + uint32_t w = linearImage.getWidth(); + uint32_t h = linearImage.getHeight(); + uint32_t channels = linearImage.getChannels(); - // ResourceBuffer imageResource = _resourceLoaderWrapper->load(rp.c_str()); + Texture::InternalFormat textureFormat = channels == 3 ? Texture::InternalFormat::RGB16F + : Texture::InternalFormat::RGBA16F; + Texture::Format bufferFormat = channels == 3 ? Texture::Format::RGB + : Texture::Format::RGBA; - // StreamBufferAdapter sb((char *)imageResource.data, (char *)imageResource.data + imageResource.size); + Texture *texture = Texture::Builder() + .width(w) + .height(h) + .levels(1) + .format(textureFormat) + .sampler(Texture::Sampler::SAMPLER_2D) + .build(*_engine); - // istream *inputStream = new std::istream(&sb); + if (!texture) + { + Log("Failed to create texture: "); + return nullptr; + } - // LinearImage *image = new LinearImage(ImageDecoder::decode( - // *inputStream, rp.c_str(), ImageDecoder::ColorSpace::SRGB)); + Texture::PixelBufferDescriptor buffer( + linearImage.getPixelRef(), + size_t(w * h * channels * sizeof(float)), + bufferFormat, + Texture::Type::FLOAT); - // if (!image->isValid()) - // { - // Log("Invalid image : %s", rp.c_str()); - // delete inputStream; - // _resourceLoaderWrapper->free(imageResource); - // return; - // } + texture->setImage(*_engine, 0, std::move(buffer)); - // uint32_t channels = image->getChannels(); - // uint32_t w = image->getWidth(); - // uint32_t h = image->getHeight(); - // asset.texture = Texture::Builder() - // .width(w) - // .height(h) - // .levels(0xff) - // .format(channels == 3 ? Texture::InternalFormat::RGB16F - // : Texture::InternalFormat::RGBA16F) - // .sampler(Texture::Sampler::SAMPLER_2D) - // .build(*_engine); + Log("Created texture: %s (%d x %d, %d channels)", name, w, h, channels); - // Texture::PixelBufferDescriptor::Callback freeCallback = [](void *buf, size_t, - // void *data) - // { - // delete reinterpret_cast(data); - // }; + _textures.insert(texture); - // Texture::PixelBufferDescriptor buffer( - // image->getPixelRef(), size_t(w * h * channels * sizeof(float)), - // channels == 3 ? Texture::Format::RGB : Texture::Format::RGBA, - // Texture::Type::FLOAT, freeCallback); + return texture; + } - // asset.texture->setImage(*_engine, 0, std::move(buffer)); - // MaterialInstance *const *inst = instance->getMaterialInstances(); - // size_t mic = instance->getMaterialInstanceCount(); - // Log("Material instance count : %d", mic); + bool SceneManager::applyTexture(EntityId entityId, Texture *texture, const char* parameterName, int materialIndex) + { + auto entity = Entity::import(entityId); - // auto sampler = TextureSampler(); - // inst[0]->setParameter("baseColorIndex", 0); - // inst[0]->setParameter("baseColorMap", asset.texture, sampler); - // delete inputStream; + if (entity.isNull()) + { + Log("Entity %d is null?", entityId); + return false; + } - // _resourceLoaderWrapper->free(imageResource); + RenderableManager &rm = _engine->getRenderableManager(); + + auto renderable = rm.getInstance(entity); + + if (!renderable.isValid()) + { + Log("Renderable not valid, was the entity id correct (%d)?", entityId); + return false; + } + + MaterialInstance *mi = rm.getMaterialInstanceAt(renderable, materialIndex); + + if (!mi) + { + Log("ERROR: material index must be less than number of material instances"); + return false; + } + + auto sampler = TextureSampler(); + mi->setParameter(parameterName, texture, sampler); + Log("Applied texture to entity %d", entityId); + return true; + } + + void SceneManager::destroyTexture(Texture* texture) { + if(_textures.find(texture) == _textures.end()) { + Log("Warning: couldn't find texture"); + } + _textures.erase(texture); + _engine->destroy(texture); } void SceneManager::setAnimationFrame(EntityId entityId, int animationIndex, int animationFrame) @@ -1549,10 +1585,12 @@ namespace thermion_filament const auto child = Entity::import(childEntityId); auto transformInstance = tm.getInstance(child); Entity parent; - - while(true) { + + while (true) + { auto newParent = tm.getParent(transformInstance); - if(newParent.isNull()) { + if (newParent.isNull()) + { break; } parent = newParent; @@ -1571,12 +1609,14 @@ namespace thermion_filament const auto &parentInstance = tm.getInstance(parent); const auto &childInstance = tm.getInstance(child); - if(!parentInstance.isValid()) { + if (!parentInstance.isValid()) + { Log("Parent instance is not valid"); return; } - if(!childInstance.isValid()) { + if (!childInstance.isValid()) + { Log("Child instance is not valid"); return; } @@ -1843,170 +1883,174 @@ namespace thermion_filament tm.setTransform(transformInstance, newTransform); } -void SceneManager::queueRelativePositionUpdateFromViewportVector(EntityId entityId, float viewportCoordX, float viewportCoordY) -{ - // Get the camera and viewport - const auto &camera = _view->getCamera(); - const auto &vp = _view->getViewport(); - - // Convert viewport coordinates to NDC space - float ndcX = (2.0f * viewportCoordX) / vp.width - 1.0f; - float ndcY = 1.0f - (2.0f * viewportCoordY) / vp.height; - - // Get the current position of the entity - auto &tm = _engine->getTransformManager(); - auto entity = Entity::import(entityId); - auto transformInstance = tm.getInstance(entity); - auto currentTransform = tm.getTransform(transformInstance); - - // get entity model origin in camera space - auto entityPositionInCameraSpace = camera.getViewMatrix() * currentTransform * filament::math::float4 { 0.0f, 0.0f, 0.0f, 1.0f }; - // get entity model origin in clip space - auto entityPositionInClipSpace = camera.getProjectionMatrix() * entityPositionInCameraSpace; - auto entityPositionInNdcSpace = entityPositionInClipSpace / entityPositionInClipSpace.w; - - // Viewport coords in NDC space (use entity position in camera space Z to project onto near plane) - math::float4 ndcNearPlanePos = {ndcX, ndcY, -1.0f, 1.0f}; - math::float4 ndcFarPlanePos = {ndcX, ndcY, 0.99f, 1.0f}; - math::float4 ndcEntityPlanePos = {ndcX, ndcY, entityPositionInNdcSpace.z, 1.0f}; - - // Get viewport coords in clip space - math::float4 nearPlaneInClipSpace = Camera::inverseProjection(camera.getProjectionMatrix()) * ndcNearPlanePos; - auto nearPlaneInCameraSpace = nearPlaneInClipSpace / nearPlaneInClipSpace.w; - math::float4 farPlaneInClipSpace = Camera::inverseProjection(camera.getProjectionMatrix()) * ndcFarPlanePos; - auto farPlaneInCameraSpace = farPlaneInClipSpace / farPlaneInClipSpace.w; - math::float4 entityPlaneInClipSpace = Camera::inverseProjection(camera.getProjectionMatrix()) * ndcEntityPlanePos; - auto entityPlaneInCameraSpace = entityPlaneInClipSpace / entityPlaneInClipSpace.w; - auto entityPlaneInWorldSpace = camera.getModelMatrix() * entityPlaneInCameraSpace; - - // Queue the position update (as a relative movement) - queuePositionUpdate(entityId, entityPlaneInWorldSpace.x, entityPlaneInWorldSpace.y, entityPlaneInWorldSpace.z, false); -} -void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z) -{ - auto worldAxis = math::float3{x, y, z}; - - // Get the camera - const auto &camera = _view->getCamera(); - const auto &vp = _view->getViewport(); - auto viewMatrix = camera.getViewMatrix(); - - math::float3 cameraPosition = camera.getPosition(); - math::float3 cameraForward = -viewMatrix.upperLeft()[2]; - - // Scale the viewport movement to NDC coordinates view axis - math::float2 viewportMovementNDC(viewportCoordX / (vp.width / 2), viewportCoordY / (vp.height / 2)); - - // calculate the translation axis in view space - math::float3 viewSpaceAxis = viewMatrix.upperLeft() * worldAxis; - - // Apply projection matrix to get clip space axis - math::float4 clipAxis = camera.getProjectionMatrix() * math::float4(viewSpaceAxis, 0.0f); - - // Perform perspective division to get the translation axis in normalized device coordinates (NDC) - math::float2 ndcAxis = (clipAxis.xyz / clipAxis.w).xy; - - const float epsilon = 1e-6f; - bool isAligned = false; - if (std::isnan(ndcAxis.x) || std::isnan(ndcAxis.y) || length(ndcAxis) < epsilon || std::abs(dot(normalize(worldAxis), cameraForward)) > 0.99f) + void SceneManager::queueRelativePositionUpdateFromViewportVector(EntityId entityId, float viewportCoordX, float viewportCoordY) { - isAligned = true; - // Find a suitable perpendicular axis: - math::float3 perpendicularAxis; - if (std::abs(worldAxis.x) < epsilon && std::abs(worldAxis.z) < epsilon) - { - // If worldAxis is (0, y, 0), use (1, 0, 0) - perpendicularAxis = {1.0f, 0.0f, 0.0f}; - } - else - { - // Otherwise, calculate a perpendicular vector - perpendicularAxis = normalize(cross(cameraForward, worldAxis)); - } + // Get the camera and viewport + const auto &camera = _view->getCamera(); + const auto &vp = _view->getViewport(); - ndcAxis = (camera.getProjectionMatrix() * math::float4(viewMatrix.upperLeft() * perpendicularAxis, 0.0f)).xy; + // Convert viewport coordinates to NDC space + float ndcX = (2.0f * viewportCoordX) / vp.width - 1.0f; + float ndcY = 1.0f - (2.0f * viewportCoordY) / vp.height; - if (std::isnan(ndcAxis.x) || std::isnan(ndcAxis.y)) { - return; - } + // Get the current position of the entity + auto &tm = _engine->getTransformManager(); + auto entity = Entity::import(entityId); + auto transformInstance = tm.getInstance(entity); + auto currentTransform = tm.getTransform(transformInstance); + // get entity model origin in camera space + auto entityPositionInCameraSpace = camera.getViewMatrix() * currentTransform * filament::math::float4{0.0f, 0.0f, 0.0f, 1.0f}; + // get entity model origin in clip space + auto entityPositionInClipSpace = camera.getProjectionMatrix() * entityPositionInCameraSpace; + auto entityPositionInNdcSpace = entityPositionInClipSpace / entityPositionInClipSpace.w; + + // Viewport coords in NDC space (use entity position in camera space Z to project onto near plane) + math::float4 ndcNearPlanePos = {ndcX, ndcY, -1.0f, 1.0f}; + math::float4 ndcFarPlanePos = {ndcX, ndcY, 0.99f, 1.0f}; + math::float4 ndcEntityPlanePos = {ndcX, ndcY, entityPositionInNdcSpace.z, 1.0f}; + + // Get viewport coords in clip space + math::float4 nearPlaneInClipSpace = Camera::inverseProjection(camera.getProjectionMatrix()) * ndcNearPlanePos; + auto nearPlaneInCameraSpace = nearPlaneInClipSpace / nearPlaneInClipSpace.w; + math::float4 farPlaneInClipSpace = Camera::inverseProjection(camera.getProjectionMatrix()) * ndcFarPlanePos; + auto farPlaneInCameraSpace = farPlaneInClipSpace / farPlaneInClipSpace.w; + math::float4 entityPlaneInClipSpace = Camera::inverseProjection(camera.getProjectionMatrix()) * ndcEntityPlanePos; + auto entityPlaneInCameraSpace = entityPlaneInClipSpace / entityPlaneInClipSpace.w; + auto entityPlaneInWorldSpace = camera.getModelMatrix() * entityPlaneInCameraSpace; + + // Queue the position update (as a relative movement) + queuePositionUpdate(entityId, entityPlaneInWorldSpace.x, entityPlaneInWorldSpace.y, entityPlaneInWorldSpace.z, false); } - - // project the viewport movement (i.e pointer drag) vector onto the translation axis - // this gives the proportion of the pointer drag vector to translate along the translation axis - float projectedMovement = dot(viewportMovementNDC, normalize(ndcAxis)); - auto translationNDC = projectedMovement * normalize(ndcAxis); - - float dotProduct = dot(normalize(worldAxis), cameraForward); - - // Ensure minimum translation and correct direction - const float minTranslation = 0.01f; - if (isAligned || std::abs(projectedMovement) < minTranslation) { - // Use the dominant component of the viewport movement - float dominantMovement = std::abs(viewportMovementNDC.x) > std::abs(viewportMovementNDC.y) ? viewportMovementNDC.x : viewportMovementNDC.y; - projectedMovement = (std::abs(dominantMovement) < minTranslation) ? minTranslation : std::abs(dominantMovement); - projectedMovement *= (dominantMovement >= 0) ? 1.0f : -1.0f; - translationNDC = projectedMovement * normalize(ndcAxis); - } - - // Log("projectedMovement %f dotProduct %f", projectedMovement, dotProduct); - - // Get the camera's field of view and aspect ratio - float fovY = camera.getFieldOfViewInDegrees(filament::Camera::Fov::VERTICAL); - float fovX = camera.getFieldOfViewInDegrees(filament::Camera::Fov::HORIZONTAL); - - // Convert to radians - fovY = (fovY / 180) * M_PI; - fovX = (fovX / 180) * M_PI; - - float aspectRatio = static_cast(vp.width) / vp.height; - - auto &transformManager = _engine->getTransformManager(); - auto transformInstance = transformManager.getInstance(Entity::import(entity)); - const auto &transform = transformManager.getWorldTransform(transformInstance); - - math::float3 translation; - math::quatf rotation; - math::float3 scale; - - decomposeMatrix(transform, &translation, &rotation, &scale); - - const auto entityWorldPosition = transform * math::float4{0.0f, 0.0f, 0.0f, 1.0f}; - - float distanceToCamera = length(entityWorldPosition.xyz - camera.getPosition()); - - // Calculate the height of the view frustum at the given distance - float frustumHeight = 2.0f * distanceToCamera * tan(fovY * 0.5f); - - // Calculate the width of the view frustum at the given distance - float frustumWidth = frustumHeight * aspectRatio; - - // Convert projected viewport movement to world space distance - float worldDistance = length(math::float2{(translationNDC / 2) * math::float2{frustumWidth, frustumHeight}}); - - // Determine the sign based on the alignment of world axis and camera forward - float sign = (dotProduct >= 0) ? -1.0f : 1.0f; - - // If aligned, use the sign of the projected movement instead - if (isAligned) { - sign = (projectedMovement >= 0) ? 1.0f : -1.0f; - } else if (projectedMovement < 0) { - sign *= -1.0f; - } - - // Flip the sign for the Z-axis - if (std::abs(z) > 0.001) + void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z) { - sign *= -1.0f; + auto worldAxis = math::float3{x, y, z}; + + // Get the camera + const auto &camera = _view->getCamera(); + const auto &vp = _view->getViewport(); + auto viewMatrix = camera.getViewMatrix(); + + math::float3 cameraPosition = camera.getPosition(); + math::float3 cameraForward = -viewMatrix.upperLeft()[2]; + + // Scale the viewport movement to NDC coordinates view axis + math::float2 viewportMovementNDC(viewportCoordX / (vp.width / 2), viewportCoordY / (vp.height / 2)); + + // calculate the translation axis in view space + math::float3 viewSpaceAxis = viewMatrix.upperLeft() * worldAxis; + + // Apply projection matrix to get clip space axis + math::float4 clipAxis = camera.getProjectionMatrix() * math::float4(viewSpaceAxis, 0.0f); + + // Perform perspective division to get the translation axis in normalized device coordinates (NDC) + math::float2 ndcAxis = (clipAxis.xyz / clipAxis.w).xy; + + const float epsilon = 1e-6f; + bool isAligned = false; + if (std::isnan(ndcAxis.x) || std::isnan(ndcAxis.y) || length(ndcAxis) < epsilon || std::abs(dot(normalize(worldAxis), cameraForward)) > 0.99f) + { + isAligned = true; + // Find a suitable perpendicular axis: + math::float3 perpendicularAxis; + if (std::abs(worldAxis.x) < epsilon && std::abs(worldAxis.z) < epsilon) + { + // If worldAxis is (0, y, 0), use (1, 0, 0) + perpendicularAxis = {1.0f, 0.0f, 0.0f}; + } + else + { + // Otherwise, calculate a perpendicular vector + perpendicularAxis = normalize(cross(cameraForward, worldAxis)); + } + + ndcAxis = (camera.getProjectionMatrix() * math::float4(viewMatrix.upperLeft() * perpendicularAxis, 0.0f)).xy; + + if (std::isnan(ndcAxis.x) || std::isnan(ndcAxis.y)) + { + return; + } + } + + // project the viewport movement (i.e pointer drag) vector onto the translation axis + // this gives the proportion of the pointer drag vector to translate along the translation axis + float projectedMovement = dot(viewportMovementNDC, normalize(ndcAxis)); + auto translationNDC = projectedMovement * normalize(ndcAxis); + + float dotProduct = dot(normalize(worldAxis), cameraForward); + + // Ensure minimum translation and correct direction + const float minTranslation = 0.01f; + if (isAligned || std::abs(projectedMovement) < minTranslation) + { + // Use the dominant component of the viewport movement + float dominantMovement = std::abs(viewportMovementNDC.x) > std::abs(viewportMovementNDC.y) ? viewportMovementNDC.x : viewportMovementNDC.y; + projectedMovement = (std::abs(dominantMovement) < minTranslation) ? minTranslation : std::abs(dominantMovement); + projectedMovement *= (dominantMovement >= 0) ? 1.0f : -1.0f; + translationNDC = projectedMovement * normalize(ndcAxis); + } + + // Log("projectedMovement %f dotProduct %f", projectedMovement, dotProduct); + + // Get the camera's field of view and aspect ratio + float fovY = camera.getFieldOfViewInDegrees(filament::Camera::Fov::VERTICAL); + float fovX = camera.getFieldOfViewInDegrees(filament::Camera::Fov::HORIZONTAL); + + // Convert to radians + fovY = (fovY / 180) * M_PI; + fovX = (fovX / 180) * M_PI; + + float aspectRatio = static_cast(vp.width) / vp.height; + + auto &transformManager = _engine->getTransformManager(); + auto transformInstance = transformManager.getInstance(Entity::import(entity)); + const auto &transform = transformManager.getWorldTransform(transformInstance); + + math::float3 translation; + math::quatf rotation; + math::float3 scale; + + decomposeMatrix(transform, &translation, &rotation, &scale); + + const auto entityWorldPosition = transform * math::float4{0.0f, 0.0f, 0.0f, 1.0f}; + + float distanceToCamera = length(entityWorldPosition.xyz - camera.getPosition()); + + // Calculate the height of the view frustum at the given distance + float frustumHeight = 2.0f * distanceToCamera * tan(fovY * 0.5f); + + // Calculate the width of the view frustum at the given distance + float frustumWidth = frustumHeight * aspectRatio; + + // Convert projected viewport movement to world space distance + float worldDistance = length(math::float2{(translationNDC / 2) * math::float2{frustumWidth, frustumHeight}}); + + // Determine the sign based on the alignment of world axis and camera forward + float sign = (dotProduct >= 0) ? -1.0f : 1.0f; + + // If aligned, use the sign of the projected movement instead + if (isAligned) + { + sign = (projectedMovement >= 0) ? 1.0f : -1.0f; + } + else if (projectedMovement < 0) + { + sign *= -1.0f; + } + + // Flip the sign for the Z-axis + if (std::abs(z) > 0.001) + { + sign *= -1.0f; + } + + worldDistance *= sign; + + auto newWorldTranslation = worldAxis * worldDistance; + + queuePositionUpdate(entity, newWorldTranslation.x, newWorldTranslation.y, newWorldTranslation.z, true); } - worldDistance *= sign; - - auto newWorldTranslation = worldAxis * worldDistance; - - queuePositionUpdate(entity, newWorldTranslation.x, newWorldTranslation.y, newWorldTranslation.z, true); -} - void SceneManager::queuePositionUpdate(EntityId entity, float x, float y, float z, bool relative) { std::lock_guard lock(_mutex); @@ -2343,10 +2387,12 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v _view->setLayerEnabled(layer, enabled); } - void SceneManager::removeStencilHighlight(EntityId entityId) { + void SceneManager::removeStencilHighlight(EntityId entityId) + { std::lock_guard lock(_stencilMutex); auto found = _highlighted.find(entityId); - if(found == _highlighted.end()) { + if (found == _highlighted.end()) + { Log("Entity %d has no stencil highlight, skipping removal", entityId); return; } @@ -2355,147 +2401,164 @@ void SceneManager::queueRelativePositionUpdateWorldAxis(EntityId entity, float v _highlighted.erase(entityId); } - void SceneManager::setStencilHighlight(EntityId entityId, float r, float g, float b) { - + void SceneManager::setStencilHighlight(EntityId entityId, float r, float g, float b) + { + std::lock_guard lock(_stencilMutex); auto highlightEntity = std::make_unique(entityId, this, _engine, r, g, b); - if(highlightEntity->isValid()) { + if (highlightEntity->isValid()) + { _highlighted.emplace(entityId, std::move(highlightEntity)); } - } - /// - /// Creates an entity with the specified geometry/material/normals and adds to the scene. - /// If [keepData] is true, stores - /// - EntityId SceneManager::createGeometryWithNormals( - float *vertices, - uint32_t numVertices, - float *normals, - uint32_t numNormals, - uint16_t *indices, - uint32_t numIndices, - filament::RenderableManager::PrimitiveType primitiveType, - const char *materialPath, - bool keepData - ) { - auto geometry = std::make_unique(vertices, numVertices, normals, numNormals, indices, numIndices, primitiveType, _engine); +EntityId SceneManager::createGeometry( + float *vertices, + uint32_t numVertices, + float *normals, + uint32_t numNormals, + float *uvs, + uint32_t numUvs, + uint16_t *indices, + uint32_t numIndices, + filament::RenderableManager::PrimitiveType primitiveType, + const char *materialPath, + bool keepData) +{ + auto geometry = std::make_unique(vertices, numVertices, normals, numNormals, uvs, numUvs, indices, numIndices, primitiveType, _engine); - auto renderable = utils::EntityManager::get().create(); - RenderableManager::Builder builder(1); + auto entity = utils::EntityManager::get().create(); + RenderableManager::Builder builder(1); - builder.boundingBox(geometry->getBoundingBox()) - .geometry(0, primitiveType, geometry->vertexBuffer(), geometry->indexBuffer(), 0, numIndices) - .culling(true) - .receiveShadows(true) - .castShadows(true); + builder.boundingBox(geometry->getBoundingBox()) + .geometry(0, primitiveType, geometry->vertexBuffer(), geometry->indexBuffer(), 0, numIndices) + .culling(true) + .receiveShadows(true) + .castShadows(true); - if (materialPath) { - filament::Material* mat = nullptr; - - auto matData = _resourceLoaderWrapper->load(materialPath); - mat = Material::Builder().package(matData.data, matData.size).build(*_engine); - _resourceLoaderWrapper->free(matData); - builder.material(0, mat->getDefaultInstance()); - } else { - filament::gltfio::MaterialKey config; - - config.unlit = false; - config.doubleSided = false; - config.useSpecularGlossiness = false; - config.alphaMode = filament::gltfio::AlphaMode::OPAQUE; - config.hasBaseColorTexture = false; - config.hasClearCoat = false; - config.hasClearCoatNormalTexture = false; - config.hasClearCoatRoughnessTexture = false; - config.hasEmissiveTexture = false; - config.hasIOR = false; - config.hasMetallicRoughnessTexture = false; - config.hasNormalTexture = false; - config.hasOcclusionTexture = false; - config.hasSheen = false; - config.hasSheenColorTexture = false; - config.hasSheenRoughnessTexture = false; - config.hasSpecularGlossinessTexture = false; - config.hasTextureTransforms = false; - config.hasTransmission = false; - config.hasTransmissionTexture = false; - config.hasVolume = false; - config.hasVolumeThicknessTexture = false; + filament::Material *mat = nullptr; + filament::MaterialInstance* materialInstance = nullptr; - config.hasVertexColors = false; - config.hasVolume = false; - // config.enableDiagnostics = true; - - filament::gltfio::UvMap uvmap; - auto materialInstance = _ubershaderProvider->createMaterialInstance(&config, &uvmap); - materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4 { 1.0f, 0.0f, 0.0f, 1.0f }); - // auto materialInstance = _unlitMaterialProvider->createMaterialInstance(&config, &uvmap); - builder.material(0, materialInstance); + if (materialPath) + { + auto matData = _resourceLoaderWrapper->load(materialPath); + mat = Material::Builder().package(matData.data, matData.size).build(*_engine); + _resourceLoaderWrapper->free(matData); + materialInstance = mat->getDefaultInstance(); + } + else + { + filament::gltfio::MaterialKey config; - } + config.unlit = false; + config.doubleSided = false; + config.useSpecularGlossiness = false; + config.alphaMode = filament::gltfio::AlphaMode::OPAQUE; + config.hasBaseColorTexture = uvs != nullptr; + config.hasClearCoat = false; + config.hasClearCoatNormalTexture = false; + config.hasClearCoatRoughnessTexture = false; + config.hasEmissiveTexture = false; + config.hasIOR = false; + config.hasMetallicRoughnessTexture = false; + config.hasNormalTexture = false; + config.hasOcclusionTexture = false; + config.hasSheen = false; + config.hasSheenColorTexture = false; + config.hasSheenRoughnessTexture = false; + config.hasSpecularGlossinessTexture = false; + config.hasTextureTransforms = false; + config.hasTransmission = false; + config.hasTransmissionTexture = false; + config.hasVolume = false; + config.hasVolumeThicknessTexture = false; + config.baseColorUV = 0; + config.hasVertexColors = false; + config.hasVolume = false; - builder.build(*_engine, renderable); + filament::gltfio::UvMap uvmap; + materialInstance = _ubershaderProvider->createMaterialInstance(&config, &uvmap); - _scene->addEntity(renderable); - - auto entityId = Entity::smuggle(renderable); - - _geometry.emplace(entityId, std::move(geometry)); - - return entityId; + materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4{1.0f, 0.0f, 1.0f, 1.0f}); } - EntityId SceneManager::createGeometry( - float *vertices, - uint32_t numVertices, - uint16_t *indices, - uint32_t numIndices, - RenderableManager::PrimitiveType primitiveType, - const char *materialPath, - bool keepData - ) { - return createGeometryWithNormals(vertices, numVertices, nullptr, 0, indices, numIndices, primitiveType, materialPath, keepData); - } + // Set up texture and sampler if UVs are available + if (uvs != nullptr && numUvs > 0) + { + // Create a default white texture + static constexpr uint32_t textureSize = 1; + static constexpr uint32_t white = 0x00ffffff; + Texture* texture = Texture::Builder() + .width(textureSize) + .height(textureSize) + .levels(1) + .format(Texture::InternalFormat::RGBA8) + .build(*_engine); - void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char* property, float value) { - auto entity = Entity::import(entityId); - const auto& rm = _engine->getRenderableManager(); - auto renderableInstance = rm.getInstance(entity); - if(!renderableInstance.isValid()) { - Log("ERROR"); - return; - } - auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); - - if(!materialInstance->getMaterial()->hasParameter(property)) { - Log("Parameter %s not found", property); - return; - } - materialInstance->setParameter(property, value); - } + _textures.insert(texture); + + filament::backend::PixelBufferDescriptor pbd(&white, 4, Texture::Format::RGBA, Texture::Type::UBYTE); + texture->setImage(*_engine, 0, std::move(pbd)); - void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char* property, filament::math::float4 value) { - auto entity = Entity::import(entityId); - const auto& rm = _engine->getRenderableManager(); - auto renderableInstance = rm.getInstance(entity); - if(!renderableInstance.isValid()) { - Log("ERROR"); - return; + // Create a sampler + TextureSampler sampler(TextureSampler::MinFilter::LINEAR, TextureSampler::MagFilter::LINEAR); + + // Set the texture and sampler to the material instance + materialInstance->setParameter("baseColorMap", texture, sampler); } - auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); - - if(!materialInstance->getMaterial()->hasParameter(property)) { - Log("Parameter %s not found", property); - return; + + builder.material(0, materialInstance); + builder.build(*_engine, entity); + + _scene->addEntity(entity); + + auto entityId = Entity::smuggle(entity); + + _geometry.emplace(entityId, std::move(geometry)); + + return entityId; +} + + void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char *property, float value) + { + auto entity = Entity::import(entityId); + const auto &rm = _engine->getRenderableManager(); + auto renderableInstance = rm.getInstance(entity); + if (!renderableInstance.isValid()) + { + Log("ERROR"); + return; + } + auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); + + if (!materialInstance->getMaterial()->hasParameter(property)) + { + Log("Parameter %s not found", property); + return; + } + materialInstance->setParameter(property, value); + } + + void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char *property, filament::math::float4 value) + { + auto entity = Entity::import(entityId); + const auto &rm = _engine->getRenderableManager(); + auto renderableInstance = rm.getInstance(entity); + if (!renderableInstance.isValid()) + { + Log("ERROR"); + return; + } + auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); + + if (!materialInstance->getMaterial()->hasParameter(property)) + { + Log("Parameter %s not found", property); + return; + } + materialInstance->setParameter(property, value); } - materialInstance->setParameter(property, value); - } } // namespace thermion_filament - - - \ No newline at end of file diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 16d6fbdc..f5ab7c2e 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -352,7 +352,12 @@ extern "C" uint8_t *pixelBuffer, void (*callback)(void)) { - ((FilamentViewer *)viewer)->capture(pixelBuffer, callback); + #ifdef __EMSCRIPTEN__ + bool useFence = true; + #else + bool useFence = false; + #endif + ((FilamentViewer *)viewer)->capture(pixelBuffer, useFence, callback); }; EMSCRIPTEN_KEEPALIVE void set_frame_interval( @@ -850,14 +855,10 @@ extern "C" ((SceneManager *)sceneManager)->removeAnimationComponent(entityId); } - EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) - { - return ((SceneManager *)sceneManager)->createGeometry(vertices, (uint32_t)numVertices, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, materialPath); - } - EMSCRIPTEN_KEEPALIVE EntityId create_geometry_with_normals(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) + EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, float *uvs, int numUvs, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) { - return ((SceneManager *)sceneManager)->createGeometryWithNormals(vertices, (uint32_t)numVertices, normals, (uint32_t)numNormals, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, materialPath); + return ((SceneManager *)sceneManager)->createGeometry(vertices, (uint32_t)numVertices, normals, (uint32_t)numNormals, uvs, numUvs, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, materialPath); } EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(void *const sceneManager, const EntityId parent, const char *name) @@ -950,9 +951,24 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char* property, float4 value) { filament::math::float4 filamentValue { value.x, value.y, value.z, value.w }; - ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, filamentValue); } + EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const viewer, EntityId entity, uint8_t* out, uint32_t outWidth, uint32_t outHeight) { + ((FilamentViewer *)viewer)->unprojectTexture(entity, out, outWidth, outHeight); + } + + EMSCRIPTEN_KEEPALIVE void* const create_texture(void *const sceneManager, uint8_t* data, size_t length) { + return (void* const) ((SceneManager *)sceneManager)->createTexture(data, length, "SOMETEXTURE"); + } + + EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(void *const sceneManager, EntityId entity, void* const texture, const char* parameterName, int materialIndex) { + ((SceneManager*)sceneManager)->applyTexture(entity, reinterpret_cast(texture), parameterName, materialIndex); + } + + EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void* const texture) { + ((SceneManager*)sceneManager)->destroyTexture(reinterpret_cast(texture)); + } + } diff --git a/thermion_dart/native/src/ThermionDartFFIApi.cpp b/thermion_dart/native/src/ThermionDartFFIApi.cpp index f7750910..f8153fca 100644 --- a/thermion_dart/native/src/ThermionDartFFIApi.cpp +++ b/thermion_dart/native/src/ThermionDartFFIApi.cpp @@ -78,32 +78,24 @@ public: } } - void iter() { - - auto frameStart = std::chrono::high_resolution_clock::now(); + void iter() { + const auto frameStart = std::chrono::steady_clock::now(); if (_rendering) { - doRender(); + doRender(); } - auto now = std::chrono::high_resolution_clock::now(); - - auto elapsed = std::chrono::duration_cast(now - frameStart).count(); - - std::function task; - std::unique_lock lock(_access); - while(true) { - now = std::chrono::high_resolution_clock::now(); - elapsed = std::chrono::duration_cast(now - frameStart).count(); - if(elapsed >= _frameIntervalInMicroseconds) { - break; - } - if(!_tasks.empty()) { - task = std::move(_tasks.front()); - _tasks.pop_front(); - task(); - } else { - _cond.wait_for(lock, std::chrono::duration(1)); + const auto frameEnd = frameStart + std::chrono::microseconds(_frameIntervalInMicroseconds); + + while (std::chrono::steady_clock::now() < frameEnd) { + if (!_tasks.empty()) { + auto task = std::move(_tasks.front()); + _tasks.pop_front(); + lock.unlock(); + task(); + lock.lock(); + } else { + _cond.wait_until(lock, frameEnd); } } } @@ -841,6 +833,10 @@ extern "C" void *const sceneManager, float *vertices, int numVertices, + float *normals, + int numNormals, + float *uvs, + int numUvs, uint16_t *indices, int numIndices, int primitiveType, @@ -851,7 +847,7 @@ extern "C" std::packaged_task lambda( [=] { - auto entity = create_geometry(sceneManager, vertices, numVertices, indices, numIndices, primitiveType, materialPath); + auto entity = create_geometry(sceneManager, vertices, numVertices, normals, numNormals, uvs, numUvs, indices, numIndices, primitiveType, materialPath); #ifdef __EMSCRIPTEN__ MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0,$1); @@ -864,31 +860,12 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void create_geometry_with_normals_ffi( - void *const sceneManager, - float *vertices, - int numVertices, - float *normals, - int numNormals, - uint16_t *indices, - int numIndices, - int primitiveType, - const char *materialPath, - bool keepData, - void (*callback)(EntityId)) - { - std::packaged_task lambda( + EMSCRIPTEN_KEEPALIVE void unproject_texture_ffi(void *const viewer, EntityId entity, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()) { + std::packaged_task lambda( [=] { - auto entity = create_geometry_with_normals(sceneManager, vertices, numVertices, normals, numNormals, indices, numIndices, primitiveType, materialPath); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0,$1); - }, callback, entity); - #else - callback(entity); - #endif - return entity; + unproject_texture(viewer, entity, out, outWidth, outHeight); + callback(); }); auto fut = _rl->add_task(lambda); } diff --git a/thermion_dart/native/src/UnprojectTexture.cpp b/thermion_dart/native/src/UnprojectTexture.cpp new file mode 100644 index 00000000..1c1a554e --- /dev/null +++ b/thermion_dart/native/src/UnprojectTexture.cpp @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Log.hpp" +#include +#include + +#include + +#include "CustomGeometry.hpp" +#include "UnprojectTexture.hpp" + +namespace thermion_filament { + +void UnprojectTexture::unproject(utils::Entity entity, const uint8_t* inputTexture, uint8_t* outputTexture, uint32_t inputWidth, uint32_t inputHeight, + uint32_t outputWidth, uint32_t outputHeight) { + auto& rm = _engine->getRenderableManager(); + auto& tm = _engine->getTransformManager(); + + // Get the inverse view-projection matrix + math::mat4 invViewProj = Camera::inverseProjection(_camera.getProjectionMatrix()) * _camera.getModelMatrix(); + + // Get the world transform of the entity + auto ti = tm.getInstance(entity); + math::mat4f worldTransform = tm.getWorldTransform(ti); + auto inverseWorldTransform = inverse(worldTransform); + + // Get vertex, normal, UV, and index data from CustomGeometry + const float* vertices = _geometry->vertices; + const float* uvs = _geometry->uvs; + const uint16_t* indices = _geometry->indices; + uint32_t numIndices = _geometry->numIndices; + + // Iterate over each pixel in the output texture + for (uint32_t y = 0; y < outputHeight; ++y) { + for (uint32_t x = 0; x < outputWidth; ++x) { + // Convert output texture coordinates to UV space + math::float2 uv(static_cast(x) / outputWidth, static_cast(y) / outputHeight); + + // Use the UV coordinates to get the corresponding 3D position on the renderable + math::float3 objectPos; + math::float2 interpolatedUV; + bool found = false; + + // Iterate over triangles to find which one contains this UV coordinate + for (size_t i = 0; i < numIndices; i += 3) { + math::float2 uv0 = *(math::float2*)&uvs[indices[i] * 2]; + math::float2 uv1 = *(math::float2*)&uvs[indices[i+1] * 2]; + math::float2 uv2 = *(math::float2*)&uvs[indices[i+2] * 2]; + + if (isInsideTriangle(uv, uv0, uv1, uv2)) { + // Compute barycentric coordinates in UV space + math::float3 bary = barycentric(uv, uv0, uv1, uv2); + + // Interpolate 3D position + math::float3 v0(vertices[indices[i] * 3], vertices[indices[i] * 3 + 1], vertices[indices[i] * 3 + 2]); + math::float3 v1(vertices[indices[i+1] * 3], vertices[indices[i+1] * 3 + 1], vertices[indices[i+1] * 3 + 2]); + math::float3 v2(vertices[indices[i+2] * 3], vertices[indices[i+2] * 3 + 1], vertices[indices[i+2] * 3 + 2]); + objectPos = v0 * bary.x + v1 * bary.y + v2 * bary.z; + + interpolatedUV = uv; + found = true; + break; + } + } + + if (found) { + // Transform the object position to world space + math::float3 worldPos = (worldTransform * math::float4(objectPos, 1.0f)).xyz; + + // Project the world position to screen space + math::float4 clipPos = _camera.getProjectionMatrix() * _camera.getViewMatrix() * math::float4(worldPos, 1.0f); + math::float3 ndcPos = clipPos.xyz / clipPos.w; + + // Convert NDC to screen coordinates + int sx = static_cast((ndcPos.x * 0.5f + 0.5f) * inputWidth); + int sy = static_cast((1.0f - (ndcPos.y * 0.5f + 0.5f)) * inputHeight); + + // Ensure we're within the input texture bounds + if (sx >= 0 && sx < inputWidth && sy >= 0 && sy < inputHeight) { + // Sample the input texture + int inputIndex = (sy * inputWidth + sx) * 4; + int outputIndex = (y * outputWidth + x) * 4; + + // Copy the color to the output texture + std::copy_n(&inputTexture[inputIndex], 4, &outputTexture[outputIndex]); + } + } + } + } +} + +math::float3 UnprojectTexture::doUnproject(const math::float2& screenPos, float depth, const math::mat4& invViewProj) { + math::float4 clipSpace(screenPos.x * 2.0f - 1.0f, screenPos.y * 2.0f - 1.0f, depth * 2.0f - 1.0f, 1.0f); + math::float4 worldSpace = invViewProj * clipSpace; + return math::float3(worldSpace.xyz) / worldSpace.w; +} + +bool UnprojectTexture::isInsideTriangle(const math::float2& p, const math::float2& a, const math::float2& b, const math::float2& c) { + float d1 = (p.x - b.x) * (a.y - b.y) - (a.x - b.x) * (p.y - b.y); + float d2 = (p.x - c.x) * (b.y - c.y) - (b.x - c.x) * (p.y - c.y); + float d3 = (p.x - a.x) * (c.y - a.y) - (c.x - a.x) * (p.y - a.y); + return (d1 >= 0 && d2 >= 0 && d3 >= 0) || (d1 <= 0 && d2 <= 0 && d3 <= 0); +} + +math::float3 UnprojectTexture::barycentric(const math::float2& p, const math::float2& a, const math::float2& b, const math::float2& c) { + math::float2 v0 = b - a, v1 = c - a, v2 = p - a; + float d00 = dot(v0, v0); + float d01 = dot(v0, v1); + float d11 = dot(v1, v1); + float d20 = dot(v2, v0); + float d21 = dot(v2, v1); + float denom = d00 * d11 - d01 * d01; + float v = (d11 * d20 - d01 * d21) / denom; + float w = (d00 * d21 - d01 * d20) / denom; + float u = 1.0f - v - w; + return math::float3(u, v, w); +} + +} // namespace thermion_filament \ No newline at end of file diff --git a/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart b/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart index 83f742e4..900df23b 100644 --- a/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart +++ b/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:flutter/services.dart'; import 'dart:ffi'; import 'package:thermion_dart/thermion_dart.dart'; -import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart'; import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; import 'package:thermion_flutter_platform_interface/thermion_flutter_texture.dart'; import 'package:logging/logging.dart'; From ab649e860dd731f3dc87225b480314be549076aa Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Mon, 16 Sep 2024 20:51:27 +0800 Subject: [PATCH 160/232] update gitattr --- .gitattributes | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index 1cff6e96..08910ca3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -153,10 +153,7 @@ thermion_dart/native/lib/ios/libibl-lite.a filter=lfs diff=lfs merge=lfs -text thermion_dart/native/lib/ios/libimageio.a filter=lfs diff=lfs merge=lfs -text materials/Makefile filter=lfs diff=lfs merge=lfs -text materials/gizmo.filamat filter=lfs diff=lfs merge=lfs -text -materials/gizmo.mat filter=lfs diff=lfs merge=lfs -text materials/image.filamat filter=lfs diff=lfs merge=lfs -text -materials/image.mat filter=lfs diff=lfs merge=lfs -text -materials/unlit_fade.mat filter=lfs diff=lfs merge=lfs -text materials/unlit_opaque.mat filter=lfs diff=lfs merge=lfs -text thermion_dart/native/lib/android/arm64-v8a/libktxreader.a filter=lfs diff=lfs merge=lfs -text thermion_dart/native/lib/android/armeabi-v7a/libcamutils.a filter=lfs diff=lfs merge=lfs -text From ddc433a12617996545ced6682c73b83d71662ebd Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:07:35 +0800 Subject: [PATCH 161/232] refactor: Dart types --- .../viewer/shared_types/entities.dart | 4 +--- .../viewer/shared_types/geometry.dart | 2 -- .../viewer/shared_types/light_options.dart | 20 +++++++++++++++++++ .../viewer/shared_types/material.dart | 9 +++++++++ .../viewer/shared_types/shared_types.dart | 2 ++ .../viewer/shared_types/texture.dart | 3 +++ 6 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/material.dart create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/texture.dart diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart index b59631ac..0de51188 100644 --- a/thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/entities.dart @@ -8,6 +8,4 @@ export 'light_options.dart'; // a handle that can be safely passed back to the rendering layer to manipulate an Entity typedef ThermionEntity = int; -abstract class ThermionTexture { - -} + diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart index 076b36c4..3417253e 100644 --- a/thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/geometry.dart @@ -8,7 +8,6 @@ class Geometry { final Float32List normals; final Float32List uvs; final PrimitiveType primitiveType; - final String? materialPath; Geometry( this.vertices, @@ -16,7 +15,6 @@ class Geometry { Float32List? normals, Float32List? uvs, this.primitiveType = PrimitiveType.TRIANGLES, - this.materialPath, }) : indices = Uint16List.fromList(indices), normals = normals ?? Float32List(0), uvs = uvs ?? Float32List(0) { diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart index 1bbe3c84..09e5a1ee 100644 --- a/thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart @@ -53,4 +53,24 @@ DirectLight.point({ direction: Vector3.zero(), falloffRadius: falloffRadius, ); + +DirectLight.sun({ + double color = 6500, + double intensity = 100000, + bool castShadows = true, + Vector3? direction, + double sunAngularRadius = 0.545, + double sunHaloSize = 10.0, + double sunHaloFalloff = 80.0, +}) : this( + type: LightType.DIRECTIONAL, + color: color, + intensity: intensity, + castShadows: castShadows, + position: Vector3(0, 0, 0), + direction: direction ?? Vector3(0, -1, 0), + sunAngularRadius: sunAngularRadius, + sunHaloSize: sunHaloSize, + sunHaloFallof: sunHaloFalloff, +); } diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/material.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/material.dart new file mode 100644 index 00000000..fad70382 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/material.dart @@ -0,0 +1,9 @@ +abstract class MaterialInstance { + +} + +enum AlphaMode { + OPAQUE, + MASK, + BLEND +} \ No newline at end of file diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/shared_types.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/shared_types.dart index c41d441e..ed30b00b 100644 --- a/thermion_dart/lib/thermion_dart/viewer/shared_types/shared_types.dart +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/shared_types.dart @@ -1,5 +1,7 @@ library shared_types; +export 'material.dart'; +export 'texture.dart'; export 'entities.dart'; export 'light.dart'; export 'shadow.dart'; diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/texture.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/texture.dart new file mode 100644 index 00000000..1279e39d --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/texture.dart @@ -0,0 +1,3 @@ +abstract class ThermionTexture { + +} \ No newline at end of file From 462f1f02bf4900b4cfbf595d1c8da1fa7701db3e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:09:16 +0800 Subject: [PATCH 162/232] refactor: move native types to own header, add methods for create/destroy material instance, add priority/layer to load_glb_from_buffer --- .../native/include/APIBoundaryTypes.h | 102 ++++++++++++++ .../native/include/ThermionDartApi.h | 130 +++++++++--------- 2 files changed, 164 insertions(+), 68 deletions(-) create mode 100644 thermion_dart/native/include/APIBoundaryTypes.h diff --git a/thermion_dart/native/include/APIBoundaryTypes.h b/thermion_dart/native/include/APIBoundaryTypes.h new file mode 100644 index 00000000..61bd908f --- /dev/null +++ b/thermion_dart/native/include/APIBoundaryTypes.h @@ -0,0 +1,102 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + + typedef int32_t EntityId; + typedef int32_t _ManipulatorMode; + typedef struct CameraPtr CameraPtr; + typedef struct TMaterialInstance TMaterialInstance; + + struct TMaterialKey { + bool doubleSided = 1; + bool unlit = 1; + bool hasVertexColors = 1; + bool hasBaseColorTexture = 1; + bool hasNormalTexture = 1; + bool hasOcclusionTexture = 1; + bool hasEmissiveTexture = 1; + bool useSpecularGlossiness = 1; + int alphaMode = 4; + bool enableDiagnostics = 4; + union { + #ifdef __cplusplus + struct { + bool hasMetallicRoughnessTexture; + uint8_t metallicRoughnessUV; + }; + struct { + bool hasSpecularGlossinessTexture; + uint8_t specularGlossinessUV; + }; + #else + struct { + bool hasMetallicRoughnessTexture = 1; + uint8_t metallicRoughnessUV = 7; + }; + struct { + bool hasSpecularGlossinessTexture = 1; + uint8_t specularGlossinessUV = 7; + }; + #endif + }; + uint8_t baseColorUV; + // -- 32 bit boundary -- + bool hasClearCoatTexture = 1; + uint8_t clearCoatUV = 7; + bool hasClearCoatRoughnessTexture = 1; + uint8_t clearCoatRoughnessUV = 7; + bool hasClearCoatNormalTexture = 1; + uint8_t clearCoatNormalUV = 7; + bool hasClearCoat = 1; + bool hasTransmission = 1; + bool hasTextureTransforms = 6; + // -- 32 bit boundary -- + uint8_t emissiveUV; + uint8_t aoUV; + uint8_t normalUV; + bool hasTransmissionTexture = 1; + uint8_t transmissionUV = 7; + // -- 32 bit boundary -- + bool hasSheenColorTexture = 1; + uint8_t sheenColorUV = 7; + bool hasSheenRoughnessTexture = 1; + uint8_t sheenRoughnessUV = 7; + bool hasVolumeThicknessTexture = 1; + uint8_t volumeThicknessUV = 7; + bool hasSheen = 1; + bool hasIOR = 1; + bool hasVolume = 1; + } ; + typedef struct TMaterialKey TMaterialKey; + + typedef struct { + float x; + float y; + float z; + float w; + } float4; + + typedef struct { + double col1[4]; + double col2[4]; + double col3[4]; + double col4[4]; + } double4x4; + + struct Aabb2 { + float minX; + float minY; + float maxX; + float maxY; + }; + + typedef struct Aabb2 Aabb2; + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 3ee7a047..1732be0e 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -46,33 +46,14 @@ #include #endif +#include "APIBoundaryTypes.h" #include "ResourceBuffer.hpp" -#include "Aabb2.h" - #ifdef __cplusplus extern "C" { #endif - typedef int32_t EntityId; - typedef int32_t _ManipulatorMode; - typedef struct CameraPtr CameraPtr; - - typedef struct { - float x; - float y; - float z; - float w; - } float4; - - typedef struct { - double col1[4]; - double col2[4]; - double col3[4]; - double col4[4]; - } double4x4; - EMSCRIPTEN_KEEPALIVE const void *create_filament_viewer(const void *const context, const void *const loader, void *const platform, const char *uberArchivePath); EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer(const void *const viewer); EMSCRIPTEN_KEEPALIVE void *get_scene_manager(const void *const viewer); @@ -90,19 +71,19 @@ extern "C" EMSCRIPTEN_KEEPALIVE void remove_skybox(const void *const viewer); EMSCRIPTEN_KEEPALIVE void remove_ibl(const void *const viewer); EMSCRIPTEN_KEEPALIVE EntityId add_light( - const void *const viewer, - uint8_t type, - float colour, - float intensity, - float posX, - float posY, - float posZ, - float dirX, - float dirY, - float dirZ, + const void *const viewer, + uint8_t type, + float colour, + float intensity, + float posX, + float posY, + float posZ, + float dirX, + float dirY, + float dirZ, float falloffRadius, - float spotLightConeInner, - float spotLightConeOuter, + float spotLightConeInner, + float spotLightConeOuter, float sunAngularRadius, float sunHaloSize, float sunHaloFallof, @@ -112,7 +93,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, EntityId light, float x, float y, float z); EMSCRIPTEN_KEEPALIVE void set_light_direction(const void *const viewer, EntityId light, float x, float y, float z); EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances, bool keepData); - EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length, bool keepData); + EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length, bool keepData, int priority, int layer); EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath, bool keepData); EMSCRIPTEN_KEEPALIVE EntityId create_instance(void *sceneManager, EntityId id); EMSCRIPTEN_KEEPALIVE int get_instance_count(void *sceneManager, EntityId entityId); @@ -160,6 +141,8 @@ extern "C" int numMorphTargets, int numFrames, float frameLengthInMs); + EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_material_instance(void *const sceneManager, TMaterialKey key); + EMSCRIPTEN_KEEPALIVE void destroy_material_instance(void *const sceneManager, TMaterialInstance *instance); EMSCRIPTEN_KEEPALIVE void clear_morph_animation( void *sceneManager, EntityId entity); @@ -179,13 +162,13 @@ extern "C" float fadeInInSecs, float maxDelta); EMSCRIPTEN_KEEPALIVE void get_local_transform(void *sceneManager, - EntityId entityId, float* const); + EntityId entityId, float *const); EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(void *sceneManager, - EntityId entityId, int skinIndex, float* const out, int numBones); + EntityId entityId, int skinIndex, float *const out, int numBones); EMSCRIPTEN_KEEPALIVE void get_world_transform(void *sceneManager, - EntityId entityId, float* const); + EntityId entityId, float *const); EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(void *sceneManager, - EntityId entityId, int skinIndex, int boneIndex, float* const); + EntityId entityId, int skinIndex, int boneIndex, float *const); EMSCRIPTEN_KEEPALIVE bool set_bone_transform( void *sceneManager, EntityId entity, @@ -199,13 +182,13 @@ extern "C" EMSCRIPTEN_KEEPALIVE void get_animation_name(void *sceneManager, EntityId entity, char *const outPtr, int index); EMSCRIPTEN_KEEPALIVE float get_animation_duration(void *sceneManager, EntityId entity, int index); EMSCRIPTEN_KEEPALIVE int get_bone_count(void *sceneManager, EntityId assetEntity, int skinIndex); - EMSCRIPTEN_KEEPALIVE void get_bone_names(void *sceneManager, EntityId assetEntity, const char** outPtr, int skinIndex); + EMSCRIPTEN_KEEPALIVE void get_bone_names(void *sceneManager, EntityId assetEntity, const char **outPtr, int skinIndex); EMSCRIPTEN_KEEPALIVE EntityId get_bone(void *sceneManager, - EntityId entityId, - int skinIndex, - int boneIndex); - EMSCRIPTEN_KEEPALIVE bool set_transform(void* sceneManager, EntityId entityId, const float* const transform); - EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(void* sceneManager, EntityId entityId); + EntityId entityId, + int skinIndex, + int boneIndex); + EMSCRIPTEN_KEEPALIVE bool set_transform(void *sceneManager, EntityId entityId, const float *const transform); + EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(void *sceneManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE void get_morph_target_name(void *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index); EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(void *sceneManager, EntityId assetEntity, EntityId childEntity); EMSCRIPTEN_KEEPALIVE void remove_entity(const void *const viewer, EntityId asset); @@ -222,22 +205,22 @@ extern "C" // Camera methods EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(const void *const viewer, bool enabled); - EMSCRIPTEN_KEEPALIVE void set_camera_exposure(CameraPtr* camera, float aperture, float shutterSpeed, float sensitivity); - EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(CameraPtr* camera, double4x4 matrix); - EMSCRIPTEN_KEEPALIVE CameraPtr* get_camera(const void *const viewer, EntityId entity); - EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(CameraPtr* const camera); - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_model_matrix(CameraPtr* const camera); - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_view_matrix(CameraPtr* const camera); - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_projection_matrix(CameraPtr* const camera); - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_culling_projection_matrix(CameraPtr* const camera); - EMSCRIPTEN_KEEPALIVE const double *const get_camera_frustum(CameraPtr* const camera); - EMSCRIPTEN_KEEPALIVE void set_camera_projection_matrix(CameraPtr* camera, double4x4 matrix, double near, double far); - EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(CameraPtr* camera, double fovInDegrees, double aspect, double near, double far, bool horizontal); - EMSCRIPTEN_KEEPALIVE double get_camera_near(CameraPtr* camera); - EMSCRIPTEN_KEEPALIVE double get_camera_culling_far(CameraPtr* camera); - EMSCRIPTEN_KEEPALIVE float get_camera_fov(CameraPtr* camera, bool horizontal); - EMSCRIPTEN_KEEPALIVE void set_camera_lens_projection(CameraPtr* camera, double near, double far, double aspect, double focalLength); - EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(CameraPtr* camera, float focusDistance); + EMSCRIPTEN_KEEPALIVE void set_camera_exposure(CameraPtr *camera, float aperture, float shutterSpeed, float sensitivity); + EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(CameraPtr *camera, double4x4 matrix); + EMSCRIPTEN_KEEPALIVE CameraPtr *get_camera(const void *const viewer, EntityId entity); + EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(CameraPtr *const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_model_matrix(CameraPtr *const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_view_matrix(CameraPtr *const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_projection_matrix(CameraPtr *const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_culling_projection_matrix(CameraPtr *const camera); + EMSCRIPTEN_KEEPALIVE const double *const get_camera_frustum(CameraPtr *const camera); + EMSCRIPTEN_KEEPALIVE void set_camera_projection_matrix(CameraPtr *camera, double4x4 matrix, double near, double far); + EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(CameraPtr *camera, double fovInDegrees, double aspect, double near, double far, bool horizontal); + EMSCRIPTEN_KEEPALIVE double get_camera_near(CameraPtr *camera); + EMSCRIPTEN_KEEPALIVE double get_camera_culling_far(CameraPtr *camera); + EMSCRIPTEN_KEEPALIVE float get_camera_fov(CameraPtr *camera, bool horizontal); + EMSCRIPTEN_KEEPALIVE void set_camera_lens_projection(CameraPtr *camera, double near, double far, double aspect, double focalLength); + EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(CameraPtr *camera, float focusDistance); EMSCRIPTEN_KEEPALIVE void set_camera_manipulator_options(const void *const viewer, _ManipulatorMode mode, double orbitSpeedX, double orbitSpeedY, double zoomSpeed); EMSCRIPTEN_KEEPALIVE int hide_mesh(void *sceneManager, EntityId entity, const char *meshName); @@ -262,7 +245,19 @@ extern "C" EMSCRIPTEN_KEEPALIVE bool add_animation_component(void *const sceneManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE void remove_animation_component(void *const sceneManager, EntityId entityId); - EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, float *uvs, int numUvs, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath); + EMSCRIPTEN_KEEPALIVE EntityId create_geometry( + void *const sceneManager, + float *vertices, + int numVertices, + float *normals, + int numNormals, + float *uvs, + int numUvs, + uint16_t *indices, + int numIndices, + int primitiveType, + TMaterialInstance *materialInstance, + bool keepData); EMSCRIPTEN_KEEPALIVE EntityId get_parent(void *const sceneManager, EntityId child); EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child); EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling); @@ -270,19 +265,18 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_priority(void *const sceneManager, EntityId entityId, int priority); EMSCRIPTEN_KEEPALIVE void get_gizmo(void *const sceneManager, EntityId *out); EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity); - EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float* minX, float* minY, float* maxX, float* maxY); + EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float *minX, float *minY, float *maxX, float *maxY); EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled); EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)); EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible); EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entity, float r, float g, float b); EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entity); - EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char* property, float value); - EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char* property, float4 value); - EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const sceneManager, EntityId entity, uint8_t* out, uint32_t outWidth, uint32_t outHeight); - EMSCRIPTEN_KEEPALIVE void* const create_texture(void *const sceneManager, uint8_t* data, size_t length); - EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void* const texture); - EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(void *const sceneManager, EntityId entity, void* const texture, const char* parameterName, int materialIndex); - + EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float value); + EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float4 value); + EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const sceneManager, EntityId entity, uint8_t *out, uint32_t outWidth, uint32_t outHeight); + EMSCRIPTEN_KEEPALIVE void *const create_texture(void *const sceneManager, uint8_t *data, size_t length); + EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void *const texture); + EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(void *const sceneManager, EntityId entity, void *const texture, const char *parameterName, int materialIndex); #ifdef __cplusplus } From c17919cd97fe07aa60ef0d70560809bfb283ed17 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:09:42 +0800 Subject: [PATCH 163/232] refactor: native types --- thermion_dart/native/include/Aabb2.h | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 thermion_dart/native/include/Aabb2.h diff --git a/thermion_dart/native/include/Aabb2.h b/thermion_dart/native/include/Aabb2.h deleted file mode 100644 index ba1196ec..00000000 --- a/thermion_dart/native/include/Aabb2.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#ifdef __cplusplus -extern "C" -{ -#endif -struct Aabb2 { - float minX; - float minY; - float maxX; - float maxY; -}; - -typedef struct Aabb2 Aabb2; - -#ifdef __cplusplus -} -#endif \ No newline at end of file From 0b34b4546e8bc70aea9ad9a4410b3ea2eaa01c6a Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:10:24 +0800 Subject: [PATCH 164/232] refactor: native types --- thermion_dart/native/include/Gizmo.hpp | 1 - thermion_dart/native/include/GridOverlay.hpp | 1 - 2 files changed, 2 deletions(-) diff --git a/thermion_dart/native/include/Gizmo.hpp b/thermion_dart/native/include/Gizmo.hpp index 5aef1e70..1358106b 100644 --- a/thermion_dart/native/include/Gizmo.hpp +++ b/thermion_dart/native/include/Gizmo.hpp @@ -19,7 +19,6 @@ #include "material/gizmo.h" -#include "Aabb2.h" #include "ThermionDartApi.h" namespace thermion_filament { diff --git a/thermion_dart/native/include/GridOverlay.hpp b/thermion_dart/native/include/GridOverlay.hpp index faf1ef6b..f4009bcd 100644 --- a/thermion_dart/native/include/GridOverlay.hpp +++ b/thermion_dart/native/include/GridOverlay.hpp @@ -21,7 +21,6 @@ #include "material/gizmo.h" -#include "Aabb2.h" namespace thermion_filament { From 4b740a9f5ab2751e3b5e0d5ede6dd7da9f8fb607 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:11:20 +0800 Subject: [PATCH 165/232] native types, add create/destroy material instance, add SceneManager::LAYERS enum --- thermion_dart/native/include/SceneManager.hpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 6e054c91..addfcc7f 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -23,14 +23,14 @@ #include "CustomGeometry.hpp" #include "Gizmo.hpp" - +#include "APIBoundaryTypes.h" #include "GridOverlay.hpp" #include "ResourceBuffer.hpp" #include "components/CollisionComponentManager.hpp" #include "components/AnimationComponentManager.hpp" #include "tsl/robin_map.h" -#include "Aabb2.h" + namespace thermion_filament { @@ -53,6 +53,11 @@ namespace thermion_filament const char *uberArchivePath); ~SceneManager(); + enum LAYERS { + DEFAULT_ASSETS = 0, + OVERLAY = 7, + }; + class HighlightOverlay { public: HighlightOverlay(EntityId id, SceneManager* const sceneManager, Engine* const engine, float r, float g, float b); @@ -87,7 +92,7 @@ namespace thermion_filament /// @return an Entity representing the FilamentAsset associated with the loaded FilamentAsset. /// EntityId loadGlb(const char *uri, int numInstances, bool keepData); - EntityId loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances = 1, bool keepData = false); + EntityId loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances = 1, bool keepData = false, int priority = 4, int layer = 2); EntityId createInstance(EntityId entityId); void remove(EntityId entity); @@ -244,10 +249,13 @@ namespace thermion_filament uint16_t *indices, uint32_t numIndices, filament::RenderableManager::PrimitiveType primitiveType = RenderableManager::PrimitiveType::TRIANGLES, - const char *materialPath = nullptr, + MaterialInstance* materialInstance = nullptr, bool keepData = false ); + MaterialInstance* createUbershaderInstance(TMaterialKey key); + void destroy(MaterialInstance* materialInstance); + friend class FilamentViewer; Gizmo* gizmo = nullptr; @@ -282,6 +290,8 @@ namespace thermion_filament void setMaterialProperty(EntityId entity, int materialIndex, const char* property, float value); void setMaterialProperty(EntityId entityId, int materialIndex, const char* property, filament::math::float4 value); + MaterialInstance* createUbershaderMaterialInstance(MaterialKey key); + private: gltfio::AssetLoader *_assetLoader = nullptr; const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; From 27a8ce18d50d67cac336e002d85a239fdb12a4fa Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:11:40 +0800 Subject: [PATCH 166/232] add priority/layer to load_glb_from_buffer --- .../native/include/ThermionDartFFIApi.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/thermion_dart/native/include/ThermionDartFFIApi.h b/thermion_dart/native/include/ThermionDartFFIApi.h index 4c2d3518..b27a78b4 100644 --- a/thermion_dart/native/include/ThermionDartFFIApi.h +++ b/thermion_dart/native/include/ThermionDartFFIApi.h @@ -66,7 +66,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void remove_light_ffi(void *const viewer, EntityId entityId); EMSCRIPTEN_KEEPALIVE void clear_lights_ffi(void *const viewer); EMSCRIPTEN_KEEPALIVE void load_glb_ffi(void *const sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, int priority, int layer, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void load_gltf_ffi(void *const sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void create_instance_ffi(void *const sceneManager, EntityId entityId, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void remove_entity_ffi(void *const viewer, EntityId asset, void (*callback)()); @@ -101,7 +101,20 @@ extern "C" void (*callback)(bool)); EMSCRIPTEN_KEEPALIVE void set_post_processing_ffi(void *const viewer, bool enabled); EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_ffi(void *const sceneManager, EntityId entityId, void(*callback)()); - EMSCRIPTEN_KEEPALIVE void create_geometry_ffi(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, float *uvs, int numUvs, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void create_geometry_ffi( + void *const sceneManager, + float *vertices, + int numVertices, + float *normals, + int numNormals, + float *uvs, + int numUvs, + uint16_t *indices, + int numIndices, + int primitiveType, + TMaterialInstance *materialInstance, + bool keepData, + void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void unproject_texture_ffi(void *const sceneManager, EntityId entity, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()); From adec48f253630916023b2d365792e1bf491d4c0e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:12:02 +0800 Subject: [PATCH 167/232] use SceneManager::LAYERS enum for gizmo --- thermion_dart/native/src/Gizmo.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/thermion_dart/native/src/Gizmo.cpp b/thermion_dart/native/src/Gizmo.cpp index 60067498..7041c629 100644 --- a/thermion_dart/native/src/Gizmo.cpp +++ b/thermion_dart/native/src/Gizmo.cpp @@ -6,7 +6,7 @@ #include #include #include - +#include "SceneManager.hpp" #include "material/gizmo.h" #include "Log.hpp" @@ -77,7 +77,7 @@ Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) .boundingBox({{-centerCubeSize, -centerCubeSize, -centerCubeSize}, {centerCubeSize, centerCubeSize, centerCubeSize}}) .material(0, _materialInstances[3]) - .layerMask(0xFF, 2) + .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) .priority(7) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, centerCubeVb, centerCubeIb, 0, 36) .culling(false) @@ -172,7 +172,7 @@ Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) .material(0, _materialInstances[i]) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, ib, 0, 54) .priority(6) - .layerMask(0xFF, 2) + .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) .culling(false) .receiveShadows(false) .castShadows(false) @@ -188,10 +188,6 @@ Gizmo::Gizmo(Engine &engine, View* view, Scene* scene) : _engine(engine) } createTransparentRectangles(); - - _view->setLayerEnabled(0, true); // scene assets - _view->setLayerEnabled(1, true); // gizmo - _view->setLayerEnabled(2, true); // world grid } Gizmo::~Gizmo() { @@ -284,7 +280,7 @@ void Gizmo::createTransparentRectangles() .material(0, _materialInstances[i]) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, volumeVb, volumeIb, 0, 36) .priority(7) - .layerMask(0xFF, 2) + .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) .culling(false) .receiveShadows(false) .castShadows(false) From d01861e9492faae81279226f49056deb4ba49d45 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:12:16 +0800 Subject: [PATCH 168/232] use SceneManager::LAYERS enum for Overlay --- thermion_dart/native/src/GridOverlay.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/thermion_dart/native/src/GridOverlay.cpp b/thermion_dart/native/src/GridOverlay.cpp index f7a358fd..6d3a59a6 100644 --- a/thermion_dart/native/src/GridOverlay.cpp +++ b/thermion_dart/native/src/GridOverlay.cpp @@ -8,6 +8,7 @@ #include #include "material/grid.h" +#include "SceneManager.hpp" #include "Log.hpp" namespace thermion_filament { @@ -92,7 +93,7 @@ GridOverlay::GridOverlay(Engine &engine) : _engine(engine) .material(0, _materialInstance) .geometry(0, RenderableManager::PrimitiveType::LINES, vb, ib, 0, vertexCount) .priority(6) - .layerMask(0xFF, 4) + .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) .culling(false) .receiveShadows(false) .castShadows(false) @@ -172,7 +173,7 @@ RenderableManager::Builder(1) {sphereRadius, sphereRadius, sphereRadius}}) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, sphereVb, sphereIb, 0, indexCount) .priority(6) - .layerMask(0xFF, 4) + .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) .culling(false) .receiveShadows(false) .castShadows(false) From 729f72e768468e8d3f01ff531615f620e040d895 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:12:57 +0800 Subject: [PATCH 169/232] use SceneManager::LAYERS enum for Overlay, set priority/layer in loadGlbFromBuffer, add create/destroy material instance --- thermion_dart/native/src/SceneManager.cpp | 67 ++++++++++++++++------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 71370760..14579d41 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -103,9 +103,8 @@ namespace thermion_filament _scene->addEntity(_gridOverlay->sphere()); _scene->addEntity(_gridOverlay->grid()); - _view->setLayerEnabled(0, true); // scene assets - _view->setLayerEnabled(1, true); // gizmo - _view->setLayerEnabled(2, false); // world grid + _view->setLayerEnabled(SceneManager::LAYERS::DEFAULT_ASSETS, true); + _view->setLayerEnabled(SceneManager::LAYERS::OVERLAY, false); // world grid + gizmo } SceneManager::~SceneManager() @@ -239,7 +238,7 @@ namespace thermion_filament return eid; } - EntityId SceneManager::loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances, bool keepData) + EntityId SceneManager::loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances, bool keepData, int priority, int layer) { FilamentAsset *asset = nullptr; @@ -263,6 +262,18 @@ namespace thermion_filament _scene->addEntities(asset->getEntities(), entityCount); + auto & rm = _engine->getRenderableManager(); + + for(int i=0; i < entityCount; i++) { + auto instance = rm.getInstance(asset->getEntities()[i]); + if(!instance.isValid()) { + Log("No valid renderable for entity"); + continue; + } + rm.setPriority(instance, priority); + rm.setLayerMask(instance, 0xFF, 1u << (uint8_t)layer); + } + #ifdef __EMSCRIPTEN__ if (!_gltfResourceLoader->asyncBeginLoad(asset)) { @@ -2424,7 +2435,7 @@ EntityId SceneManager::createGeometry( uint16_t *indices, uint32_t numIndices, filament::RenderableManager::PrimitiveType primitiveType, - const char *materialPath, + filament::MaterialInstance* materialInstance, bool keepData) { auto geometry = std::make_unique(vertices, numVertices, normals, numNormals, uvs, numUvs, indices, numIndices, primitiveType, _engine); @@ -2439,24 +2450,15 @@ EntityId SceneManager::createGeometry( .castShadows(true); filament::Material *mat = nullptr; - filament::MaterialInstance* materialInstance = nullptr; - - if (materialPath) - { - auto matData = _resourceLoaderWrapper->load(materialPath); - mat = Material::Builder().package(matData.data, matData.size).build(*_engine); - _resourceLoaderWrapper->free(matData); - materialInstance = mat->getDefaultInstance(); - } - else - { + + if (!materialInstance){ filament::gltfio::MaterialKey config; - config.unlit = false; + config.unlit = true; config.doubleSided = false; config.useSpecularGlossiness = false; config.alphaMode = filament::gltfio::AlphaMode::OPAQUE; - config.hasBaseColorTexture = uvs != nullptr; + config.hasBaseColorTexture = false; //uvs != nullptr; config.hasClearCoat = false; config.hasClearCoatNormalTexture = false; config.hasClearCoatRoughnessTexture = false; @@ -2479,9 +2481,16 @@ EntityId SceneManager::createGeometry( config.hasVolume = false; filament::gltfio::UvMap uvmap; + materialInstance = _ubershaderProvider->createMaterialInstance(&config, &uvmap); - materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4{1.0f, 0.0f, 1.0f, 1.0f}); + if(!materialInstance) { + Log("Failed to create material instance"); + return Entity::smuggle(Entity()); + } + + materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4{1.0f, 1.0f, 1.0f, 1.0f}); + materialInstance->setParameter("baseColorIndex", 0); } // Set up texture and sampler if UVs are available @@ -2528,7 +2537,7 @@ EntityId SceneManager::createGeometry( auto renderableInstance = rm.getInstance(entity); if (!renderableInstance.isValid()) { - Log("ERROR"); + Log("Error setting material property for entity %d: no renderable"); return; } auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); @@ -2548,7 +2557,7 @@ EntityId SceneManager::createGeometry( auto renderableInstance = rm.getInstance(entity); if (!renderableInstance.isValid()) { - Log("ERROR"); + Log("Error setting material property for entity %d: no renderable"); return; } auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); @@ -2561,4 +2570,20 @@ EntityId SceneManager::createGeometry( materialInstance->setParameter(property, value); } + void SceneManager::destroy(MaterialInstance* instance) { + _engine->destroy(instance); + } + + MaterialInstance* SceneManager::createUbershaderMaterialInstance(filament::gltfio::MaterialKey config) { + + filament::gltfio::UvMap uvmap; + auto * materialInstance = _ubershaderProvider->createMaterialInstance(&config, &uvmap); + if(!materialInstance) { + Log("Invalid material configuration"); + } + materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4{1.0f, 1.0f, 1.0f, 1.0f}); + materialInstance->setParameter("baseColorIndex", 0); + return materialInstance; + } + } // namespace thermion_filament From 98cedf821c690a8cdcdc01bd95cb6cbad19f40a4 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:14:10 +0800 Subject: [PATCH 170/232] update bindings --- .../viewer/ffi/thermion_dart.g.dart | 261 ++++++++++++++---- 1 file changed, 202 insertions(+), 59 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart index 6bdafd91..4aa6fe9f 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart @@ -16,16 +16,6 @@ external ffi.Pointer make_resource_loader( ffi.Pointer owner, ); -@ffi.Native< - ffi.Pointer Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer, ffi.Pointer)>(isLeaf: true) -external ffi.Pointer create_filament_viewer( - ffi.Pointer context, - ffi.Pointer loader, - ffi.Pointer platform, - ffi.Pointer uberArchivePath, -); - @ffi.Native)>(isLeaf: true) external void destroy_filament_viewer( ffi.Pointer viewer, @@ -221,12 +211,13 @@ external int load_glb( @ffi.Native< EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Size, - ffi.Bool)>(isLeaf: true) + ffi.Bool, ffi.Int)>(isLeaf: true) external int load_glb_from_buffer( ffi.Pointer sceneManager, ffi.Pointer data, int length, bool keepData, + int priority, ); @ffi.Native< @@ -422,6 +413,22 @@ external bool set_morph_animation( double frameLengthInMs, ); +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, TMaterialKey)>(isLeaf: true) +external ffi.Pointer create_material_instance( + ffi.Pointer sceneManager, + TMaterialKey key, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Pointer)>(isLeaf: true) +external void destroy_material_instance( + ffi.Pointer sceneManager, + ffi.Pointer instance, +); + @ffi.Native, EntityId)>(isLeaf: true) external void clear_morph_animation( ffi.Pointer sceneManager, @@ -1046,7 +1053,8 @@ external void remove_animation_component( ffi.Pointer, ffi.Int, ffi.Int, - ffi.Pointer)>(isLeaf: true) + ffi.Pointer, + ffi.Bool)>(isLeaf: true) external int create_geometry( ffi.Pointer sceneManager, ffi.Pointer vertices, @@ -1058,7 +1066,8 @@ external int create_geometry( ffi.Pointer indices, int numIndices, int primitiveType, - ffi.Pointer materialPath, + ffi.Pointer materialInstance, + bool keepData, ); @ffi.Native, EntityId)>(isLeaf: true) @@ -1492,6 +1501,8 @@ external void load_glb_ffi( ffi.Size, ffi.Int, ffi.Bool, + ffi.Int, + ffi.Int, ffi.Pointer>)>( isLeaf: true) external void load_glb_from_buffer_ffi( @@ -1500,6 +1511,8 @@ external void load_glb_from_buffer_ffi( int length, int numInstances, bool keepData, + int priority, + int layer, ffi.Pointer> callback, ); @@ -1713,7 +1726,7 @@ external void reset_to_rest_pose_ffi( ffi.Pointer, ffi.Int, ffi.Int, - ffi.Pointer, + ffi.Pointer, ffi.Bool, ffi.Pointer>)>( isLeaf: true) @@ -1728,7 +1741,7 @@ external void create_geometry_ffi( ffi.Pointer indices, int numIndices, int primitiveType, - ffi.Pointer materialPath, + ffi.Pointer materialInstance, bool keepData, ffi.Pointer> callback, ); @@ -1750,6 +1763,180 @@ external void unproject_texture_ffi( ffi.Pointer> callback, ); +final class CameraPtr extends ffi.Opaque {} + +final class TMaterialInstance extends ffi.Opaque {} + +final class TMaterialKey extends ffi.Struct { + @ffi.Bool() + external bool doubleSided; + + @ffi.Bool() + external bool unlit; + + @ffi.Bool() + external bool hasVertexColors; + + @ffi.Bool() + external bool hasBaseColorTexture; + + @ffi.Bool() + external bool hasNormalTexture; + + @ffi.Bool() + external bool hasOcclusionTexture; + + @ffi.Bool() + external bool hasEmissiveTexture; + + @ffi.Bool() + external bool useSpecularGlossiness; + + @ffi.Int() + external int alphaMode; + + @ffi.Bool() + external bool enableDiagnostics; + + external UnnamedUnion1 unnamed; + + @ffi.Uint8() + external int baseColorUV; + + @ffi.Bool() + external bool hasClearCoatTexture; + + @ffi.Uint8() + external int clearCoatUV; + + @ffi.Bool() + external bool hasClearCoatRoughnessTexture; + + @ffi.Uint8() + external int clearCoatRoughnessUV; + + @ffi.Bool() + external bool hasClearCoatNormalTexture; + + @ffi.Uint8() + external int clearCoatNormalUV; + + @ffi.Bool() + external bool hasClearCoat; + + @ffi.Bool() + external bool hasTransmission; + + @ffi.Bool() + external bool hasTextureTransforms; + + @ffi.Uint8() + external int emissiveUV; + + @ffi.Uint8() + external int aoUV; + + @ffi.Uint8() + external int normalUV; + + @ffi.Bool() + external bool hasTransmissionTexture; + + @ffi.Uint8() + external int transmissionUV; + + @ffi.Bool() + external bool hasSheenColorTexture; + + @ffi.Uint8() + external int sheenColorUV; + + @ffi.Bool() + external bool hasSheenRoughnessTexture; + + @ffi.Uint8() + external int sheenRoughnessUV; + + @ffi.Bool() + external bool hasVolumeThicknessTexture; + + @ffi.Uint8() + external int volumeThicknessUV; + + @ffi.Bool() + external bool hasSheen; + + @ffi.Bool() + external bool hasIOR; + + @ffi.Bool() + external bool hasVolume; +} + +final class UnnamedUnion1 extends ffi.Union { + external UnnamedStruct1 unnamed; + + external UnnamedStruct2 unnamed1; +} + +final class UnnamedStruct1 extends ffi.Struct { + @ffi.Bool() + external bool hasMetallicRoughnessTexture; + + @ffi.Uint8() + external int metallicRoughnessUV; +} + +final class UnnamedStruct2 extends ffi.Struct { + @ffi.Bool() + external bool hasSpecularGlossinessTexture; + + @ffi.Uint8() + external int specularGlossinessUV; +} + +final class float4 extends ffi.Struct { + @ffi.Float() + external double x; + + @ffi.Float() + external double y; + + @ffi.Float() + external double z; + + @ffi.Float() + external double w; +} + +final class double4x4 extends ffi.Struct { + @ffi.Array.multi([4]) + external ffi.Array col1; + + @ffi.Array.multi([4]) + external ffi.Array col2; + + @ffi.Array.multi([4]) + external ffi.Array col3; + + @ffi.Array.multi([4]) + external ffi.Array col4; +} + +final class Aabb2 extends ffi.Struct { + @ffi.Float() + external double minX; + + @ffi.Float() + external double minY; + + @ffi.Float() + external double maxX; + + @ffi.Float() + external double maxY; +} + final class ResourceBuffer extends ffi.Struct { external ffi.Pointer data; @@ -1799,50 +1986,6 @@ typedef LoadFilamentResourceIntoOutPointerFunction = ffi.Void Function( typedef DartLoadFilamentResourceIntoOutPointerFunction = void Function( ffi.Pointer uri, ffi.Pointer out); -final class Aabb2 extends ffi.Struct { - @ffi.Float() - external double minX; - - @ffi.Float() - external double minY; - - @ffi.Float() - external double maxX; - - @ffi.Float() - external double maxY; -} - -final class CameraPtr extends ffi.Opaque {} - -final class float4 extends ffi.Struct { - @ffi.Float() - external double x; - - @ffi.Float() - external double y; - - @ffi.Float() - external double z; - - @ffi.Float() - external double w; -} - -final class double4x4 extends ffi.Struct { - @ffi.Array.multi([4]) - external ffi.Array col1; - - @ffi.Array.multi([4]) - external ffi.Array col2; - - @ffi.Array.multi([4]) - external ffi.Array col3; - - @ffi.Array.multi([4]) - external ffi.Array col4; -} - /// This header replicates most of the methods in ThermionDartApi.h. /// It represents the interface for: /// - invoking those methods that must be called on the main Filament engine thread From 10b919e4f4d16c8da80b7feeb30fe2b7cb6d476a Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:14:55 +0800 Subject: [PATCH 171/232] add priority/layer to FFI viewer, use struct for model matrix, add createUbershaderMaterialInstance and destroyMaterialInstance --- .../viewer/ffi/thermion_viewer_ffi.dart | 134 ++++++++++++++++-- 1 file changed, 124 insertions(+), 10 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index 82e7b3e3..56ba1161 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -506,17 +506,27 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future loadGlbFromBuffer(Uint8List data, - {bool unlit = false, int numInstances = 1, bool keepData = false}) async { + {bool unlit = false, + int numInstances = 1, + bool keepData = false, + int priority = 4, + int layer = 0}) async { if (unlit) { throw Exception("Not yet implemented"); } + if (layer < 0 || layer > 6) { + throw Exception("Layer must be between 0 and 6"); + } + var entity = await withIntCallback((callback) => load_glb_from_buffer_ffi( _sceneManager!, data.address, data.length, numInstances, keepData, + priority, + layer, callback)); if (entity == _FILAMENT_ASSET_ERROR) { @@ -1335,10 +1345,9 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setCameraModelMatrix4(Matrix4 modelMatrix) async { var mainCamera = get_camera(_viewer!, await getMainCamera()); - final out = allocator(1); - matrix4ToDouble4x4(modelMatrix, out.ref); - set_camera_model_matrix(mainCamera, out.ref); - allocator.free(out); + final out = Struct.create(); + matrix4ToDouble4x4(modelMatrix, out); + set_camera_model_matrix(mainCamera, out); } /// @@ -1809,14 +1818,11 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future createGeometry(Geometry geometry, - {bool keepData = false}) async { + {MaterialInstance? materialInstance, bool keepData = false}) async { if (_viewer == null) { throw Exception("Viewer must not be null"); } - final materialPathPtr = - geometry.materialPath?.toNativeUtf8(allocator: allocator) ?? nullptr; - var entity = await withIntCallback((callback) => create_geometry_ffi( _sceneManager!, geometry.vertices.address, @@ -1828,7 +1834,9 @@ class ThermionViewerFFI extends ThermionViewer { geometry.indices.address, geometry.indices.length, geometry.primitiveType.index, - materialPathPtr.cast(), + materialInstance == null + ? nullptr + : (materialInstance as ThermionFFIMaterialInstance)._pointer, keepData, callback)); if (entity == _FILAMENT_ASSET_ERROR) { @@ -1991,9 +1999,109 @@ class ThermionViewerFFI extends ThermionViewer { }); } + /// + /// + /// Future destroyTexture(ThermionFFITexture texture) async { destroy_texture(_sceneManager!, texture._pointer); } + + Future createUbershaderMaterialInstance( + {bool doubleSided = false, + bool unlit = false, + bool hasVertexColors = false, + bool hasBaseColorTexture = false, + bool hasNormalTexture = false, + bool hasOcclusionTexture = false, + bool hasEmissiveTexture = false, + bool useSpecularGlossiness = false, + AlphaMode alphaMode = AlphaMode.OPAQUE, + bool enableDiagnostics = false, + bool hasMetallicRoughnessTexture = false, + int metallicRoughnessUV = 0, + int baseColorUV = 0, + bool hasClearCoatTexture = false, + int clearCoatUV = 0, + bool hasClearCoatRoughnessTexture = false, + int clearCoatRoughnessUV = 0, + bool hasClearCoatNormalTexture = false, + int clearCoatNormalUV = 0, + bool hasClearCoat = false, + bool hasTransmission = false, + bool hasTextureTransforms = false, + int emissiveUV = 0, + int aoUV = 0, + int normalUV = 0, + bool hasTransmissionTexture = false, + int transmissionUV = 0, + bool hasSheenColorTexture = false, + int sheenColorUV = 0, + bool hasSheenRoughnessTexture = false, + int sheenRoughnessUV = 0, + bool hasVolumeThicknessTexture = false, + int volumeThicknessUV = 0, + bool hasSheen = false, + bool hasIOR = false, + bool hasVolume = false}) async { + final key = Struct.create(); + + // Set all the fields of the TMaterialKey struct + key.doubleSided = doubleSided; + key.unlit = unlit; + key.hasVertexColors = hasVertexColors; + key.hasBaseColorTexture = hasBaseColorTexture; + key.hasNormalTexture = hasNormalTexture; + key.hasOcclusionTexture = hasOcclusionTexture; + key.hasEmissiveTexture = hasEmissiveTexture; + key.useSpecularGlossiness = useSpecularGlossiness; + key.alphaMode = alphaMode.index; + key.enableDiagnostics = enableDiagnostics; + key.unnamed.unnamed.hasMetallicRoughnessTexture = + hasMetallicRoughnessTexture; + key.unnamed.unnamed.metallicRoughnessUV = metallicRoughnessUV; + key.baseColorUV = baseColorUV; + key.hasClearCoatTexture = hasClearCoatTexture; + key.clearCoatUV = clearCoatUV; + key.hasClearCoatRoughnessTexture = hasClearCoatRoughnessTexture; + key.clearCoatRoughnessUV = clearCoatRoughnessUV; + key.hasClearCoatNormalTexture = hasClearCoatNormalTexture; + key.clearCoatNormalUV = clearCoatNormalUV; + key.hasClearCoat = hasClearCoat; + key.hasTransmission = hasTransmission; + key.hasTextureTransforms = hasTextureTransforms; + key.emissiveUV = emissiveUV; + key.aoUV = aoUV; + key.normalUV = normalUV; + key.hasTransmissionTexture = hasTransmissionTexture; + key.transmissionUV = transmissionUV; + key.hasSheenColorTexture = hasSheenColorTexture; + key.sheenColorUV = sheenColorUV; + key.hasSheenRoughnessTexture = hasSheenRoughnessTexture; + key.sheenRoughnessUV = sheenRoughnessUV; + key.hasVolumeThicknessTexture = hasVolumeThicknessTexture; + key.volumeThicknessUV = volumeThicknessUV; + key.hasSheen = hasSheen; + key.hasIOR = hasIOR; + key.hasVolume = hasVolume; + + // Assuming there's a method to create the MaterialInstance using the key + final materialInstance = create_material_instance(_sceneManager!, key); + + if (materialInstance == nullptr) { + throw Exception("Failed to create material instance"); + } + + // Don't forget to free the memory allocated for the struct + return ThermionFFIMaterialInstance(materialInstance); + } + + /// + /// + /// + Future destroyMaterialInstance( + ThermionFFIMaterialInstance materialInstance) async { + destroy_material_instance(_viewer!, materialInstance._pointer); + } } class ThermionFFITexture extends ThermionTexture { @@ -2001,3 +2109,9 @@ class ThermionFFITexture extends ThermionTexture { ThermionFFITexture(this._pointer); } + +class ThermionFFIMaterialInstance extends MaterialInstance { + final Pointer _pointer; + + ThermionFFIMaterialInstance(this._pointer); +} From 18bb45dcd8a85751daa63269186a575f3dfdb70c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:16:06 +0800 Subject: [PATCH 172/232] use TMaterialInstance for FFI API, add priority/layer params to load_glb_from_buffer --- thermion_dart/native/src/ThermionDartFFIApi.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/thermion_dart/native/src/ThermionDartFFIApi.cpp b/thermion_dart/native/src/ThermionDartFFIApi.cpp index f8153fca..80ca6222 100644 --- a/thermion_dart/native/src/ThermionDartFFIApi.cpp +++ b/thermion_dart/native/src/ThermionDartFFIApi.cpp @@ -407,12 +407,14 @@ extern "C" size_t length, int numInstances, bool keepData, + int priority, + int layer, void (*callback)(EntityId)) { std::packaged_task lambda( [=]() mutable { - auto entity = load_glb_from_buffer(sceneManager, data, length, keepData); + auto entity = load_glb_from_buffer(sceneManager, data, length, keepData, priority, layer); callback(entity); return entity; }); @@ -840,14 +842,14 @@ extern "C" uint16_t *indices, int numIndices, int primitiveType, - const char *materialPath, + TMaterialInstance * materialInstance, bool keepData, void (*callback)(EntityId)) { std::packaged_task lambda( [=] { - auto entity = create_geometry(sceneManager, vertices, numVertices, normals, numNormals, uvs, numUvs, indices, numIndices, primitiveType, materialPath); + auto entity = create_geometry(sceneManager, vertices, numVertices, normals, numNormals, uvs, numUvs, indices, numIndices, primitiveType, materialInstance, keepData); #ifdef __EMSCRIPTEN__ MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0,$1); From f6077012b180a2ff9f6bb69fe22d7fc0a06fff5e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:16:45 +0800 Subject: [PATCH 173/232] widget cleanup --- .../lib/thermion/widgets/camera/camera_options_widget.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_options_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_options_widget.dart index 7e100c7d..b3d543f4 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_options_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_options_widget.dart @@ -1,10 +1,9 @@ import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import '../../utils/camera_orientation.dart'; import 'dart:math'; -import 'package:vector_math/vector_math_64.dart' as v64; + class CameraOptionsWidget extends StatefulWidget { final ThermionViewer controller; From 31d31dd58329c79858fd2299e156ca4dbb333378 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:17:45 +0800 Subject: [PATCH 174/232] ThermionViewer: add create/destroy materialinstance, add MaterialInstance property to createGeometry, priority/layer to loadGlbFromBuffer --- .../viewer/thermion_viewer_base.dart | 50 ++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart index 025af6e9..bdac6c24 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart @@ -189,7 +189,7 @@ abstract class ThermionViewer { /// If [keepData] is false, the source glTF data will be released and [createInstance] will throw an exception. /// Future loadGlbFromBuffer(Uint8List data, - {int numInstances = 1, bool keepData = false}); + {int numInstances = 1, bool keepData = false, int priority=4, int layer=0}); /// /// Create a new instance of [entity]. @@ -786,7 +786,7 @@ abstract class ThermionViewer { /// Creates a (renderable) entity with the specified geometry and adds to the scene. /// If [keepData] is true, the source data will not be released. /// - Future createGeometry(Geometry geometry, {bool keepData = false}); + Future createGeometry(Geometry geometry, {MaterialInstance? materialInstance, bool keepData = false}); /// /// Gets the parent entity of [entity]. Returns null if the entity has no parent. @@ -869,4 +869,50 @@ abstract class ThermionViewer { /// Future destroyTexture(covariant ThermionTexture texture); + /// + /// + /// + Future createUbershaderMaterialInstance({ + bool doubleSided = false, + bool unlit = false, + bool hasVertexColors = false, + bool hasBaseColorTexture = false, + bool hasNormalTexture = false, + bool hasOcclusionTexture = false, + bool hasEmissiveTexture = false, + bool useSpecularGlossiness = false, + AlphaMode alphaMode = AlphaMode.OPAQUE, + bool enableDiagnostics = false, + bool hasMetallicRoughnessTexture = false, + int metallicRoughnessUV = 0, + int baseColorUV = 0, + bool hasClearCoatTexture = false, + int clearCoatUV = 0, + bool hasClearCoatRoughnessTexture = false, + int clearCoatRoughnessUV = 0, + bool hasClearCoatNormalTexture = false, + int clearCoatNormalUV = 0, + bool hasClearCoat = false, + bool hasTransmission = false, + bool hasTextureTransforms = false, + int emissiveUV = 0, + int aoUV = 0, + int normalUV = 0, + bool hasTransmissionTexture = false, + int transmissionUV = 0, + bool hasSheenColorTexture = false, + int sheenColorUV = 0, + bool hasSheenRoughnessTexture = false, + int sheenRoughnessUV = 0, + bool hasVolumeThicknessTexture = false, + int volumeThicknessUV = 0, + bool hasSheen = false, + bool hasIOR = false, + bool hasVolume = false, + }); + + /// + /// + /// + Future destroyMaterialInstance(covariant MaterialInstance materialInstance); } From 242b2f6faa61b24aa86b86c8111cb261477cbd3e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 09:19:23 +0800 Subject: [PATCH 175/232] gesture detector fixes --- .../v2/default_zoom_camera_delegate.dart | 23 +-- .../gestures/v2/delegate_gesture_handler.dart | 51 ++++-- .../widgets/camera/gestures/v2/delegates.dart | 2 +- .../fixed_orbit_camera_rotation_delegate.dart | 148 +++++++++++------- .../v2/free_flight_camera_delegate.dart | 13 +- 5 files changed, 146 insertions(+), 91 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart index 30c8cd64..a8571173 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart @@ -14,16 +14,19 @@ class DefaultZoomCameraDelegate { DefaultZoomCameraDelegate(this.viewer, {this.zoomSensitivity = 0.005, this.getDistanceToTarget}); - double calculateZoomDistance(double scrollDelta, Vector2? velocity, Vector3 cameraPosition) { - double? distanceToTarget = getDistanceToTarget?.call(cameraPosition); - double zoomDistance = scrollDelta * zoomSensitivity; - if (distanceToTarget != null) { - zoomDistance *= distanceToTarget; - if (zoomDistance.abs() < 0.0001) { - zoomDistance = scrollDelta * zoomSensitivity; - } + /// + /// Converts the given [scrollDelta] (usually somewhere between 1 and -1) to + /// a percentage of the current camera distance (either to the origin, + /// or to a custom target) along its forward vector. + /// In other words, "shift " + /// + double calculateZoomFactor( + double scrollDelta, Vector2? velocity) { + double zoomFactor = scrollDelta * zoomSensitivity; + if (zoomFactor.abs() < 0.0001) { + zoomFactor = scrollDelta * zoomSensitivity; } - return max(zoomDistance, scrollDelta * zoomSensitivity); + return zoomFactor; } @override @@ -36,7 +39,7 @@ class DefaultZoomCameraDelegate { forwardVector.normalize(); var zoomDistance = - calculateZoomDistance(scrollDelta, velocity, cameraPosition); + calculateZoomFactor(scrollDelta, velocity); Vector3 newPosition = cameraPosition + (forwardVector * zoomDistance); await viewer.setCameraPosition(newPosition.x, newPosition.y, newPosition.z); diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart index 142b73aa..8e898e3a 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart @@ -9,6 +9,7 @@ import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.d import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart'; import 'package:thermion_flutter/thermion_flutter.dart'; +import 'package:vector_math/vector_math_64.dart'; class DelegateGestureHandler implements ThermionGestureHandler { final ThermionViewer viewer; @@ -48,10 +49,16 @@ class DelegateGestureHandler implements ThermionGestureHandler { _initializeAccumulatedDeltas(); } - factory DelegateGestureHandler.fixedOrbit(ThermionViewer viewer) => + factory DelegateGestureHandler.fixedOrbit(ThermionViewer viewer, + {double? Function(Vector3)? getDistanceToTarget, + double rotationSensitivity = 0.001, + double zoomSensitivity = 0.001}) => DelegateGestureHandler( viewer: viewer, - cameraDelegate: FixedOrbitRotateCameraDelegate(viewer), + cameraDelegate: FixedOrbitRotateCameraDelegate(viewer, + getDistanceToTarget: getDistanceToTarget, + rotationSensitivity: rotationSensitivity, + zoomSensitivity: zoomSensitivity), velocityDelegate: DefaultVelocityDelegate(), ); @@ -96,7 +103,8 @@ class DelegateGestureHandler implements ThermionGestureHandler { // Do nothing break; default: - _logger.warning("Unsupported gesture action: $action for type: $gestureType"); + _logger.warning( + "Unsupported gesture action: $action for type: $gestureType"); break; } @@ -105,12 +113,13 @@ class DelegateGestureHandler implements ThermionGestureHandler { } if (_accumulatedScrollDelta != 0.0) { - await cameraDelegate?.zoom(_accumulatedScrollDelta, velocityDelegate?.velocity); + await cameraDelegate?.zoom( + _accumulatedScrollDelta, velocityDelegate?.velocity); _accumulatedScrollDelta = 0.0; } } - @override + @override Future onPointerDown(Offset localPosition, int buttons) async { velocityDelegate?.stopDeceleration(); _activePointers++; @@ -120,13 +129,18 @@ class DelegateGestureHandler implements ThermionGestureHandler { } @override - Future onPointerMove(Offset localPosition, Offset delta, int buttons) async { + Future onPointerMove( + Offset localPosition, Offset delta, int buttons) async { GestureType gestureType = _getGestureTypeFromButtons(buttons); if (gestureType == GestureType.MMB_HOLD_AND_MOVE || - (_actions[GestureType.POINTER_MOVE] == GestureAction.ROTATE_CAMERA && gestureType == GestureType.POINTER_MOVE)) { - _accumulatedDeltas[GestureType.MMB_HOLD_AND_MOVE] = (_accumulatedDeltas[GestureType.MMB_HOLD_AND_MOVE] ?? Offset.zero) + delta; + (_actions[GestureType.POINTER_MOVE] == GestureAction.ROTATE_CAMERA && + gestureType == GestureType.POINTER_MOVE)) { + _accumulatedDeltas[GestureType.MMB_HOLD_AND_MOVE] = + (_accumulatedDeltas[GestureType.MMB_HOLD_AND_MOVE] ?? Offset.zero) + + delta; } else { - _accumulatedDeltas[gestureType] = (_accumulatedDeltas[gestureType] ?? Offset.zero) + delta; + _accumulatedDeltas[gestureType] = + (_accumulatedDeltas[gestureType] ?? Offset.zero) + delta; } } @@ -142,22 +156,26 @@ class DelegateGestureHandler implements ThermionGestureHandler { } GestureType _getGestureTypeFromButtons(int buttons) { - if (buttons & kPrimaryMouseButton != 0) return GestureType.LMB_HOLD_AND_MOVE; - if (buttons & kMiddleMouseButton != 0 || _isMiddleMouseButtonPressed) return GestureType.MMB_HOLD_AND_MOVE; + if (buttons & kPrimaryMouseButton != 0) + return GestureType.LMB_HOLD_AND_MOVE; + if (buttons & kMiddleMouseButton != 0 || _isMiddleMouseButtonPressed) + return GestureType.MMB_HOLD_AND_MOVE; return GestureType.POINTER_MOVE; } @override Future onPointerHover(Offset localPosition, Offset delta) async { if (_actions[GestureType.POINTER_MOVE] == GestureAction.ROTATE_CAMERA) { - _accumulatedDeltas[GestureType.POINTER_MOVE] = (_accumulatedDeltas[GestureType.POINTER_MOVE] ?? Offset.zero) + delta; + _accumulatedDeltas[GestureType.POINTER_MOVE] = + (_accumulatedDeltas[GestureType.POINTER_MOVE] ?? Offset.zero) + delta; } } - + @override Future onPointerScroll(Offset localPosition, double scrollDelta) async { if (_actions[GestureType.SCROLLWHEEL] != GestureAction.ZOOM_CAMERA) { - throw Exception("Unsupported action: ${_actions[GestureType.SCROLLWHEEL]}"); + throw Exception( + "Unsupported action: ${_actions[GestureType.SCROLLWHEEL]}"); } try { @@ -203,6 +221,9 @@ class DelegateGestureHandler implements ThermionGestureHandler { } bool _handleKeyEvent(KeyEvent event) { + if (_actions[GestureType.KEYDOWN] == GestureAction.NONE) { + return false; + } if (event is KeyDownEvent || event is KeyRepeatEvent) { cameraDelegate?.onKeypress(event.physicalKey); return true; @@ -212,4 +233,4 @@ class DelegateGestureHandler implements ThermionGestureHandler { } return false; } -} \ No newline at end of file +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart index f85a7935..e7bf15ec 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart @@ -5,7 +5,7 @@ import 'package:vector_math/vector_math_64.dart'; abstract class CameraDelegate { Future rotate(Offset delta, Vector2? velocity); Future pan(Offset delta, Vector2? velocity); - Future zoom(double scrollDelta, Vector2? velocity); + Future zoom(double yScrollDeltaInPixels, Vector2? velocity); Future onKeypress(PhysicalKeyboardKey key); Future onKeyRelease(PhysicalKeyboardKey key); } diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart index 24fb612e..57675aec 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:math'; import 'dart:ui'; import 'package:flutter/src/services/keyboard_key.g.dart'; @@ -10,21 +11,30 @@ import 'package:vector_math/vector_math_64.dart'; class FixedOrbitRotateCameraDelegate implements CameraDelegate { final ThermionViewer viewer; - static final _up = Vector3(0, 1, 0); - static final _forward = Vector3(0, 0, -1); - static final Vector3 _right = Vector3(1, 0, 0); - static const double _rotationSensitivity = 0.01; + double rotationSensitivity = 0.01; late DefaultZoomCameraDelegate _zoomCameraDelegate; Offset _accumulatedRotationDelta = Offset.zero; double _accumulatedZoomDelta = 0.0; - + + static final _up = Vector3(0, 1, 0); + Timer? _updateTimer; - - FixedOrbitRotateCameraDelegate(this.viewer) { - _zoomCameraDelegate = DefaultZoomCameraDelegate(this.viewer); + + Vector3 _targetPosition = Vector3(0, 0, 0); + + double? Function(Vector3)? getDistanceToTarget; + + FixedOrbitRotateCameraDelegate(this.viewer, + {this.getDistanceToTarget, + double? rotationSensitivity, + double zoomSensitivity = 0.005}) { + _zoomCameraDelegate = DefaultZoomCameraDelegate(this.viewer, + zoomSensitivity: zoomSensitivity, + getDistanceToTarget: getDistanceToTarget); + this.rotationSensitivity = rotationSensitivity ?? 0.01; _startUpdateTimer(); } @@ -49,64 +59,88 @@ class FixedOrbitRotateCameraDelegate implements CameraDelegate { } @override - Future zoom(double scrollDelta, Vector2? velocity) async { - _accumulatedZoomDelta += scrollDelta; + Future zoom(double yScrollDeltaInPixels, Vector2? velocity) async { + if (yScrollDeltaInPixels > 1) { + _accumulatedZoomDelta++; + } else { + _accumulatedZoomDelta--; + } } Future _applyAccumulatedUpdates() async { - if (_accumulatedRotationDelta != Offset.zero || _accumulatedZoomDelta != 0.0) { - Matrix4 currentModelMatrix = await viewer.getCameraModelMatrix(); - Vector3 currentPosition = currentModelMatrix.getTranslation(); - double distance = currentPosition.length; - Quaternion currentRotation = - Quaternion.fromRotation(currentModelMatrix.getRotation()); - - // Apply rotation - if (_accumulatedRotationDelta != Offset.zero) { - double deltaX = _accumulatedRotationDelta.dx * _rotationSensitivity * viewer.pixelRatio; - double deltaY = _accumulatedRotationDelta.dy * _rotationSensitivity * viewer.pixelRatio; - - Quaternion yawRotation = Quaternion.axisAngle(_up, -deltaX); - Quaternion pitchRotation = Quaternion.axisAngle(_right, -deltaY); - - currentRotation = currentRotation * yawRotation * pitchRotation; - currentRotation.normalize(); - - _accumulatedRotationDelta = Offset.zero; - } - - // Apply zoom - if (_accumulatedZoomDelta != 0.0) { - var zoomDistance = _zoomCameraDelegate.calculateZoomDistance( - _accumulatedZoomDelta, - null, - Vector3.zero() - ); - distance += zoomDistance; - distance = distance.clamp(0.1, 1000.0); // Adjust these limits as needed - - _accumulatedZoomDelta = 0.0; - } - - // Calculate new position - Vector3 newPosition = _forward.clone() - ..applyQuaternion(currentRotation) - ..scale(-distance); - - // Create and set new model matrix - Matrix4 newModelMatrix = - Matrix4.compose(newPosition, currentRotation, Vector3(1, 1, 1)); - await viewer.setCameraModelMatrix4(newModelMatrix); + if (_accumulatedRotationDelta.distanceSquared == 0.0 && + _accumulatedZoomDelta == 0.0) { + return; } + + var modelMatrix = await viewer.getCameraModelMatrix(); + Vector3 cameraPosition = modelMatrix.getTranslation(); + + final heightAboveSurface = getDistanceToTarget?.call(cameraPosition) ?? 1.0; + + final sphereRadius = cameraPosition.length - heightAboveSurface; + + // Apply rotation + if (_accumulatedRotationDelta.distanceSquared > 0) { + // Calculate the distance factor + final distanceFactor = sqrt((heightAboveSurface / sphereRadius) + 1); + + // Adjust the base angle per meter + final baseAnglePerMeter = 10000 / sphereRadius; + final adjustedAnglePerMeter = baseAnglePerMeter * distanceFactor; + + final metersOnSurface = _accumulatedRotationDelta; + final rotationX = metersOnSurface.dy * adjustedAnglePerMeter; + final rotationY = metersOnSurface.dx * adjustedAnglePerMeter; + + Matrix4 rotation = Matrix4.rotationX(rotationX)..rotateY(rotationY); + Vector3 newPos = rotation.getRotation() * cameraPosition; + cameraPosition = newPos; + } + + // Normalize the position to maintain constant distance from center + cameraPosition = + cameraPosition.normalized() * (sphereRadius + heightAboveSurface); + + // Apply zoom (modified to ensure minimum 10m distance) + if (_accumulatedZoomDelta != 0.0) { + var zoomFactor = -0.5 * _accumulatedZoomDelta; + + double newHeight = heightAboveSurface * (1 - zoomFactor); + newHeight = newHeight.clamp( + 10.0, double.infinity); // Prevent getting closer than 10m to surface + cameraPosition = cameraPosition.normalized() * (sphereRadius + newHeight); + + _accumulatedZoomDelta = 0.0; + } + + // Ensure minimum 10m distance even after rotation + final currentHeight = cameraPosition.length - sphereRadius; + if (currentHeight < 10.0) { + cameraPosition = cameraPosition.normalized() * (sphereRadius + 10.0); + } + + // Calculate view matrix (unchanged) + Vector3 forward = cameraPosition.normalized(); + Vector3 up = Vector3(0, 1, 0); + final right = up.cross(forward)..normalize(); + up = forward.cross(right); + + Matrix4 viewMatrix = makeViewMatrix(cameraPosition, Vector3.zero(), up); + viewMatrix.invert(); + + // Set the camera model matrix + await viewer.setCameraModelMatrix4(viewMatrix); + _accumulatedRotationDelta = Offset.zero; } @override Future onKeyRelease(PhysicalKeyboardKey key) async { - //ignore + // Ignore } @override - Future onKeypress(PhysicalKeyboardKey key) async { - //ignore + Future onKeypress(PhysicalKeyboardKey key) async { + // Ignore } -} \ No newline at end of file +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart index 73bde712..2a97290f 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart @@ -9,8 +9,6 @@ import 'package:vector_math/vector_math_64.dart'; class FreeFlightCameraDelegate implements CameraDelegate { final ThermionViewer viewer; - final bool lockPitch; - final bool lockYaw; final bool lockRoll; final Vector3? minBounds; final Vector3? maxBounds; @@ -36,8 +34,7 @@ class FreeFlightCameraDelegate implements CameraDelegate { FreeFlightCameraDelegate( this.viewer, { - this.lockPitch = false, - this.lockYaw = false, + this.lockRoll = false, this.minBounds, this.maxBounds, @@ -76,9 +73,9 @@ class FreeFlightCameraDelegate implements CameraDelegate { // Apply rotation if (_accumulatedRotation != Offset.zero) { - double deltaX = lockYaw ? 0 : _accumulatedRotation.dx * rotationSensitivity * viewer.pixelRatio; - double deltaY = lockPitch ? 0 : _accumulatedRotation.dy * rotationSensitivity * viewer.pixelRatio; - double deltaZ = lockRoll ? 0 : (_accumulatedRotation.dx + _accumulatedRotation.dy) * rotationSensitivity * 0.5 * viewer.pixelRatio; + double deltaX = _accumulatedRotation.dx * rotationSensitivity * viewer.pixelRatio; + double deltaY = _accumulatedRotation.dy * rotationSensitivity * viewer.pixelRatio; + double deltaZ = (_accumulatedRotation.dx + _accumulatedRotation.dy) * rotationSensitivity * 0.5 * viewer.pixelRatio; Quaternion yawRotation = Quaternion.axisAngle(_up, -deltaX); Quaternion pitchRotation = Quaternion.axisAngle(_right, -deltaY); @@ -150,7 +147,7 @@ class FreeFlightCameraDelegate implements CameraDelegate { @override Future zoom(double scrollDelta, Vector2? velocity) async { - _accumulatedZoom += scrollDelta; + _accumulatedZoom -= scrollDelta; _lastVelocity = velocity; } From 82d85386c08b5ceca599836f61d49b7aa5480ce7 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 12:50:57 +0800 Subject: [PATCH 176/232] fixes for createMaterialInstance --- .../viewer/ffi/thermion_dart.g.dart | 15 +- .../viewer/ffi/thermion_viewer_ffi.dart | 8 +- thermion_dart/native/include/SceneManager.hpp | 8 +- .../native/include/ThermionDartApi.h | 3 +- thermion_dart/native/src/SceneManager.cpp | 26 +-- thermion_dart/native/src/ThermionDartApi.cpp | 173 ++++++++++++------ 6 files changed, 149 insertions(+), 84 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart index 4aa6fe9f..4e8176ec 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart @@ -16,6 +16,16 @@ external ffi.Pointer make_resource_loader( ffi.Pointer owner, ); +@ffi.Native< + ffi.Pointer Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(isLeaf: true) +external ffi.Pointer create_filament_viewer( + ffi.Pointer context, + ffi.Pointer loader, + ffi.Pointer platform, + ffi.Pointer uberArchivePath, +); + @ffi.Native)>(isLeaf: true) external void destroy_filament_viewer( ffi.Pointer viewer, @@ -211,13 +221,14 @@ external int load_glb( @ffi.Native< EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Size, - ffi.Bool, ffi.Int)>(isLeaf: true) + ffi.Bool, ffi.Int, ffi.Int)>(isLeaf: true) external int load_glb_from_buffer( ffi.Pointer sceneManager, ffi.Pointer data, int length, bool keepData, int priority, + int layer, ); @ffi.Native< @@ -418,7 +429,7 @@ external bool set_morph_animation( ffi.Pointer, TMaterialKey)>(isLeaf: true) external ffi.Pointer create_material_instance( ffi.Pointer sceneManager, - TMaterialKey key, + TMaterialKey materialConfig, ); @ffi.Native< diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index 56ba1161..a1ba8d29 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -2045,7 +2045,6 @@ class ThermionViewerFFI extends ThermionViewer { bool hasVolume = false}) async { final key = Struct.create(); - // Set all the fields of the TMaterialKey struct key.doubleSided = doubleSided; key.unlit = unlit; key.hasVertexColors = hasVertexColors; @@ -2058,7 +2057,7 @@ class ThermionViewerFFI extends ThermionViewer { key.enableDiagnostics = enableDiagnostics; key.unnamed.unnamed.hasMetallicRoughnessTexture = hasMetallicRoughnessTexture; - key.unnamed.unnamed.metallicRoughnessUV = metallicRoughnessUV; + key.unnamed.unnamed.metallicRoughnessUV = 0; key.baseColorUV = baseColorUV; key.hasClearCoatTexture = hasClearCoatTexture; key.clearCoatUV = clearCoatUV; @@ -2084,14 +2083,11 @@ class ThermionViewerFFI extends ThermionViewer { key.hasIOR = hasIOR; key.hasVolume = hasVolume; - // Assuming there's a method to create the MaterialInstance using the key final materialInstance = create_material_instance(_sceneManager!, key); - if (materialInstance == nullptr) { throw Exception("Failed to create material instance"); } - // Don't forget to free the memory allocated for the struct return ThermionFFIMaterialInstance(materialInstance); } @@ -2100,7 +2096,7 @@ class ThermionViewerFFI extends ThermionViewer { /// Future destroyMaterialInstance( ThermionFFIMaterialInstance materialInstance) async { - destroy_material_instance(_viewer!, materialInstance._pointer); + destroy_material_instance(_sceneManager!, materialInstance._pointer); } } diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index addfcc7f..8d958880 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -253,9 +253,6 @@ namespace thermion_filament bool keepData = false ); - MaterialInstance* createUbershaderInstance(TMaterialKey key); - void destroy(MaterialInstance* materialInstance); - friend class FilamentViewer; Gizmo* gizmo = nullptr; @@ -291,6 +288,11 @@ namespace thermion_filament void setMaterialProperty(EntityId entityId, int materialIndex, const char* property, filament::math::float4 value); MaterialInstance* createUbershaderMaterialInstance(MaterialKey key); + void destroy(MaterialInstance* materialInstance); + + gltfio::MaterialProvider* getUbershaderProvider() { + return _ubershaderProvider; + } private: gltfio::AssetLoader *_assetLoader = nullptr; diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 1732be0e..35b09957 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -141,7 +141,8 @@ extern "C" int numMorphTargets, int numFrames, float frameLengthInMs); - EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_material_instance(void *const sceneManager, TMaterialKey key); + EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_material_instance(void *const sceneManager, TMaterialKey materialConfig); + EMSCRIPTEN_KEEPALIVE void destroy_material_instance(void *const sceneManager, TMaterialInstance *instance); EMSCRIPTEN_KEEPALIVE void clear_morph_animation( void *sceneManager, diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 14579d41..2892ae62 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -2451,14 +2451,17 @@ EntityId SceneManager::createGeometry( filament::Material *mat = nullptr; - if (!materialInstance){ + if (!materialInstance) { + Log("Using default ubershader material"); filament::gltfio::MaterialKey config; - config.unlit = true; + memset(&config, 0, sizeof(config)); // Initialize all bits to zero + + config.unlit = false; config.doubleSided = false; config.useSpecularGlossiness = false; config.alphaMode = filament::gltfio::AlphaMode::OPAQUE; - config.hasBaseColorTexture = false; //uvs != nullptr; + config.hasBaseColorTexture = numUvs > 0; config.hasClearCoat = false; config.hasClearCoatNormalTexture = false; config.hasClearCoatRoughnessTexture = false; @@ -2479,18 +2482,13 @@ EntityId SceneManager::createGeometry( config.baseColorUV = 0; config.hasVertexColors = false; config.hasVolume = false; - - filament::gltfio::UvMap uvmap; - materialInstance = _ubershaderProvider->createMaterialInstance(&config, &uvmap); + materialInstance = createUbershaderMaterialInstance(config); if(!materialInstance) { Log("Failed to create material instance"); return Entity::smuggle(Entity()); } - - materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4{1.0f, 1.0f, 1.0f, 1.0f}); - materialInstance->setParameter("baseColorIndex", 0); } // Set up texture and sampler if UVs are available @@ -2575,15 +2573,17 @@ EntityId SceneManager::createGeometry( } MaterialInstance* SceneManager::createUbershaderMaterialInstance(filament::gltfio::MaterialKey config) { - - filament::gltfio::UvMap uvmap; + filament::gltfio::UvMap uvmap {}; auto * materialInstance = _ubershaderProvider->createMaterialInstance(&config, &uvmap); if(!materialInstance) { Log("Invalid material configuration"); + return nullptr; } - materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4{1.0f, 1.0f, 1.0f, 1.0f}); - materialInstance->setParameter("baseColorIndex", 0); + materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4{0.0f, 1.0f, 1.0f, 1.0f}); + materialInstance->setParameter("baseColorIndex", -1); return materialInstance; } + + } // namespace thermion_filament diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index f5ab7c2e..73ad329e 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -35,14 +35,13 @@ extern "C" } // Helper function to convert double4x4 to filament::math::mat4 - static filament::math::mat4 convert_double4x4_to_mat4(const double4x4& d_mat) + static filament::math::mat4 convert_double4x4_to_mat4(const double4x4 &d_mat) { return filament::math::mat4{ filament::math::float4{float(d_mat.col1[0]), float(d_mat.col1[1]), float(d_mat.col1[2]), float(d_mat.col1[3])}, filament::math::float4{float(d_mat.col2[0]), float(d_mat.col2[1]), float(d_mat.col2[2]), float(d_mat.col2[3])}, filament::math::float4{float(d_mat.col3[0]), float(d_mat.col3[1]), float(d_mat.col3[2]), float(d_mat.col3[3])}, - filament::math::float4{float(d_mat.col4[0]), float(d_mat.col4[1]), float(d_mat.col4[2]), float(d_mat.col4[3])} - }; + filament::math::float4{float(d_mat.col4[0]), float(d_mat.col4[1]), float(d_mat.col4[2]), float(d_mat.col4[3])}}; } EMSCRIPTEN_KEEPALIVE const void *create_filament_viewer(const void *context, const void *const loader, void *const platform, const char *uberArchivePath) @@ -178,9 +177,9 @@ extern "C" return ((SceneManager *)sceneManager)->loadGlb(assetPath, numInstances, keepData); } - EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length, bool keepData) + EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length, bool keepData, int priority, int layer) { - return ((SceneManager *)sceneManager)->loadGlbFromBuffer((const uint8_t *)data, length, keepData); + return ((SceneManager *)sceneManager)->loadGlbFromBuffer((const uint8_t *)data, length, 1, keepData, priority, layer); } EMSCRIPTEN_KEEPALIVE EntityId create_instance(void *sceneManager, EntityId entityId) @@ -218,82 +217,84 @@ extern "C" return ((FilamentViewer *)viewer)->setCamera(asset, nodeName); } - EMSCRIPTEN_KEEPALIVE float get_camera_fov(CameraPtr* camera, bool horizontal) + EMSCRIPTEN_KEEPALIVE float get_camera_fov(CameraPtr *camera, bool horizontal) { - auto cam = reinterpret_cast(camera); + auto cam = reinterpret_cast(camera); return cam->getFieldOfViewInDegrees(horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); } - EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(CameraPtr* const camera) { - auto cam = reinterpret_cast(camera); + EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(CameraPtr *const camera) + { + auto cam = reinterpret_cast(camera); return cam->getFocalLength(); } - EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(CameraPtr* camera, double fovInDegrees, double aspect, double near, double far, bool horizontal) + EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(CameraPtr *camera, double fovInDegrees, double aspect, double near, double far, bool horizontal) { - auto cam = reinterpret_cast(camera); + auto cam = reinterpret_cast(camera); cam->setProjection(fovInDegrees, aspect, near, far, horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); } - EMSCRIPTEN_KEEPALIVE CameraPtr* get_camera(const void *const viewer, EntityId entity) { - auto filamentCamera = ((FilamentViewer*)viewer)->getCamera(entity); - return reinterpret_cast(filamentCamera); + EMSCRIPTEN_KEEPALIVE CameraPtr *get_camera(const void *const viewer, EntityId entity) + { + auto filamentCamera = ((FilamentViewer *)viewer)->getCamera(entity); + return reinterpret_cast(filamentCamera); } - double4x4 get_camera_model_matrix(CameraPtr* camera) + double4x4 get_camera_model_matrix(CameraPtr *camera) { - const auto &mat = reinterpret_cast(camera)->getModelMatrix(); + const auto &mat = reinterpret_cast(camera)->getModelMatrix(); return convert_mat4_to_double4x4(mat); } - double4x4 get_camera_view_matrix(CameraPtr* camera) + double4x4 get_camera_view_matrix(CameraPtr *camera) { - const auto &mat = reinterpret_cast(camera)->getViewMatrix(); + const auto &mat = reinterpret_cast(camera)->getViewMatrix(); return convert_mat4_to_double4x4(mat); } - double4x4 get_camera_projection_matrix(CameraPtr* camera) + double4x4 get_camera_projection_matrix(CameraPtr *camera) { - const auto &mat = reinterpret_cast(camera)->getProjectionMatrix(); + const auto &mat = reinterpret_cast(camera)->getProjectionMatrix(); return convert_mat4_to_double4x4(mat); } - double4x4 get_camera_culling_projection_matrix(CameraPtr* camera) + double4x4 get_camera_culling_projection_matrix(CameraPtr *camera) { - const auto &mat = reinterpret_cast(camera)->getCullingProjectionMatrix(); + const auto &mat = reinterpret_cast(camera)->getCullingProjectionMatrix(); return convert_mat4_to_double4x4(mat); } - void set_camera_projection_matrix(CameraPtr* camera, double4x4 matrix, double near, double far) + void set_camera_projection_matrix(CameraPtr *camera, double4x4 matrix, double near, double far) { - auto cam = reinterpret_cast(camera); - const auto& mat = convert_double4x4_to_mat4(matrix); + auto cam = reinterpret_cast(camera); + const auto &mat = convert_double4x4_to_mat4(matrix); cam->setCustomProjection(mat, near, far); } - void set_camera_lens_projection(CameraPtr* camera, double near, double far, double aspect, double focalLength) + void set_camera_lens_projection(CameraPtr *camera, double near, double far, double aspect, double focalLength) { - auto cam = reinterpret_cast(camera); + auto cam = reinterpret_cast(camera); cam->setLensProjection(focalLength, aspect, near, far); } - double get_camera_near(CameraPtr* camera) + double get_camera_near(CameraPtr *camera) { - auto cam = reinterpret_cast(camera); + auto cam = reinterpret_cast(camera); return cam->getNear(); } - double get_camera_culling_far(CameraPtr* camera) + double get_camera_culling_far(CameraPtr *camera) { - auto cam = reinterpret_cast(camera); + auto cam = reinterpret_cast(camera); return cam->getCullingFar(); } - const double *const get_camera_frustum(CameraPtr* camera) + const double *const get_camera_frustum(CameraPtr *camera) { - - const auto frustum = reinterpret_cast(camera)->getFrustum(); - + + const auto frustum = reinterpret_cast(camera)->getFrustum(); + const math::float4 *planes = frustum.getNormalizedPlanes(); double *array = (double *)calloc(24, sizeof(double)); for (int i = 0; i < 6; i++) @@ -318,22 +319,22 @@ extern "C" ((FilamentViewer *)viewer)->setViewFrustumCulling(enabled); } - EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(CameraPtr* camera, float distance) + EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(CameraPtr *camera, float distance) { - auto * cam = reinterpret_cast(camera); + auto *cam = reinterpret_cast(camera); cam->setFocusDistance(distance); } - EMSCRIPTEN_KEEPALIVE void set_camera_exposure(CameraPtr* camera, float aperture, float shutterSpeed, float sensitivity) + EMSCRIPTEN_KEEPALIVE void set_camera_exposure(CameraPtr *camera, float aperture, float shutterSpeed, float sensitivity) { - auto * cam = reinterpret_cast(camera); + auto *cam = reinterpret_cast(camera); cam->setExposure(aperture, shutterSpeed, sensitivity); } - EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(CameraPtr* camera, double4x4 matrix) + EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(CameraPtr *camera, double4x4 matrix) { - auto * cam = reinterpret_cast(camera); - const filament::math::mat4& mat = convert_double4x4_to_mat4(matrix); + auto *cam = reinterpret_cast(camera); + const filament::math::mat4 &mat = convert_double4x4_to_mat4(matrix); cam->setModelMatrix(mat); } @@ -352,11 +353,11 @@ extern "C" uint8_t *pixelBuffer, void (*callback)(void)) { - #ifdef __EMSCRIPTEN__ +#ifdef __EMSCRIPTEN__ bool useFence = true; - #else +#else bool useFence = false; - #endif +#endif ((FilamentViewer *)viewer)->capture(pixelBuffer, useFence, callback); }; @@ -855,10 +856,21 @@ extern "C" ((SceneManager *)sceneManager)->removeAnimationComponent(entityId); } - - EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, float *uvs, int numUvs, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) + EMSCRIPTEN_KEEPALIVE EntityId create_geometry( + void *const sceneManager, + float *vertices, + int numVertices, + float *normals, + int numNormals, + float *uvs, + int numUvs, + uint16_t *indices, + int numIndices, + int primitiveType, + TMaterialInstance *materialInstance, + bool keepData) { - return ((SceneManager *)sceneManager)->createGeometry(vertices, (uint32_t)numVertices, normals, (uint32_t)numNormals, uvs, numUvs, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, materialPath); + return ((SceneManager *)sceneManager)->createGeometry(vertices, (uint32_t)numVertices, normals, (uint32_t)numNormals, uvs, numUvs, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, reinterpret_cast(materialInstance), keepData); } EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(void *const sceneManager, const EntityId parent, const char *name) @@ -945,30 +957,73 @@ extern "C" ((SceneManager *)sceneManager)->removeStencilHighlight(entityId); } - EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char* property, float value) { + EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float value) + { ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value); } - - EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char* property, float4 value) { - filament::math::float4 filamentValue { value.x, value.y, value.z, value.w }; + + EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float4 value) + { + filament::math::float4 filamentValue{value.x, value.y, value.z, value.w}; ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, filamentValue); } - EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const viewer, EntityId entity, uint8_t* out, uint32_t outWidth, uint32_t outHeight) { + EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const viewer, EntityId entity, uint8_t *out, uint32_t outWidth, uint32_t outHeight) + { ((FilamentViewer *)viewer)->unprojectTexture(entity, out, outWidth, outHeight); } - EMSCRIPTEN_KEEPALIVE void* const create_texture(void *const sceneManager, uint8_t* data, size_t length) { - return (void* const) ((SceneManager *)sceneManager)->createTexture(data, length, "SOMETEXTURE"); + EMSCRIPTEN_KEEPALIVE void *const create_texture(void *const sceneManager, uint8_t *data, size_t length) + { + return (void *const)((SceneManager *)sceneManager)->createTexture(data, length, "SOMETEXTURE"); } - EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(void *const sceneManager, EntityId entity, void* const texture, const char* parameterName, int materialIndex) { - ((SceneManager*)sceneManager)->applyTexture(entity, reinterpret_cast(texture), parameterName, materialIndex); + EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(void *const sceneManager, EntityId entity, void *const texture, const char *parameterName, int materialIndex) + { + ((SceneManager *)sceneManager)->applyTexture(entity, reinterpret_cast(texture), parameterName, materialIndex); } - EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void* const texture) { - ((SceneManager*)sceneManager)->destroyTexture(reinterpret_cast(texture)); + EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void *const texture) + { + ((SceneManager *)sceneManager)->destroyTexture(reinterpret_cast(texture)); } + EMSCRIPTEN_KEEPALIVE TMaterialInstance* create_material_instance(void *const sceneManager, TMaterialKey materialConfig) +{ + + filament::gltfio::MaterialKey config; + memset(&config, 0, sizeof(MaterialKey)); + + // Set and log each field + config.unlit = materialConfig.unlit; + config.doubleSided = materialConfig.doubleSided; + config.useSpecularGlossiness = materialConfig.useSpecularGlossiness; + config.alphaMode = static_cast(materialConfig.alphaMode); + config.hasBaseColorTexture = materialConfig.hasBaseColorTexture; + config.hasClearCoat = materialConfig.hasClearCoat; + config.hasClearCoatNormalTexture = materialConfig.hasClearCoatNormalTexture; + config.hasClearCoatRoughnessTexture = materialConfig.hasClearCoatRoughnessTexture; + config.hasEmissiveTexture = materialConfig.hasEmissiveTexture; + config.hasIOR = materialConfig.hasIOR; + config.hasMetallicRoughnessTexture = materialConfig.hasMetallicRoughnessTexture; + config.hasNormalTexture = materialConfig.hasNormalTexture; + config.hasOcclusionTexture = materialConfig.hasOcclusionTexture; + config.hasSheen = materialConfig.hasSheen; + config.hasSheenColorTexture = materialConfig.hasSheenColorTexture; + config.hasSheenRoughnessTexture = materialConfig.hasSheenRoughnessTexture; + config.hasTextureTransforms = materialConfig.hasTextureTransforms; + config.hasTransmission = materialConfig.hasTransmission; + config.hasTransmissionTexture = materialConfig.hasTransmissionTexture; + config.hasVolume = materialConfig.hasVolume; + config.hasVolumeThicknessTexture = materialConfig.hasVolumeThicknessTexture; + config.baseColorUV = materialConfig.baseColorUV; + config.hasVertexColors = materialConfig.hasVertexColors; + auto materialInstance = ((SceneManager *)sceneManager)->createUbershaderMaterialInstance(config); + return reinterpret_cast(materialInstance); +} + +EMSCRIPTEN_KEEPALIVE void destroy_material_instance(void *const sceneManager, TMaterialInstance *instance) { + ((SceneManager *)sceneManager)->destroy(reinterpret_cast(instance)); +} } From fb441e151c8ff260e6f249e26f6e565a02948a7f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 12:51:09 +0800 Subject: [PATCH 177/232] update ffigen with new headers --- thermion_dart/ffigen/native.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/thermion_dart/ffigen/native.yaml b/thermion_dart/ffigen/native.yaml index 20ad4ff0..2062f1ab 100644 --- a/thermion_dart/ffigen/native.yaml +++ b/thermion_dart/ffigen/native.yaml @@ -1,15 +1,14 @@ -output: '../lib/thermion_dart/compatibility/native/thermion_dart.g.dart' +output: '../lib/thermion_dart/viewer/ffi/thermion_dart.g.dart' headers: entry-points: - '../native/include/ThermionDartFFIApi.h' - '../native/include/ThermionDartApi.h' - '../native/include/ResourceBuffer.h' - - '../native/include/Aabb2.h' include-directives: - '../native/include/ThermionDartFFIApi.h' - '../native/include/ThermionDartApi.h' - '../native/include/ResourceBuffer.h' - - '../native/include/Aabb2.h' + - '../native/include/APIBoundaryTypes.h' ffi-native: assetId: package:thermion_dart/thermion_dart.dart ignore-source-errors: true From a55f63a428589c27f3963b599f882f61bc83e70a Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 12:51:30 +0800 Subject: [PATCH 178/232] increase min Dart SDK to 3.5 for .address FFI accessors --- thermion_dart/pubspec.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/thermion_dart/pubspec.yaml b/thermion_dart/pubspec.yaml index 6625a16e..6342fb30 100644 --- a/thermion_dart/pubspec.yaml +++ b/thermion_dart/pubspec.yaml @@ -5,7 +5,7 @@ homepage: https://thermion.dev repository: https://github.com/nmfisher/thermion environment: - sdk: ">=3.3.0 <4.0.0" + sdk: ">=3.5.0 <4.0.0" dependencies: vector_math: ^2.1.2 @@ -21,3 +21,4 @@ dependencies: dev_dependencies: ffigen: ^12.0.0 test: + image: \ No newline at end of file From 666506aed01744e11d0b4ae07155333a3b5311ae Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 12:52:16 +0800 Subject: [PATCH 179/232] widget updates --- .../thermion_gesture_detector_desktop.dart | 2 +- .../gestures/thermion_gesture_handler.dart | 3 +- .../thermion/widgets/lights/light_slider.dart | 364 +++++++++--------- 3 files changed, 185 insertions(+), 184 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart index 948b92ab..aa766ab4 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_detector_desktop.dart @@ -35,7 +35,7 @@ class _ThermionGestureDetectorDesktopState Widget build(BuildContext context) { return Listener( onPointerHover: (event) => - widget.gestureHandler.onPointerHover(event.localPosition), + widget.gestureHandler.onPointerHover(event.localPosition, event.delta), onPointerSignal: (PointerSignalEvent pointerSignal) { if (pointerSignal is PointerScrollEvent) { widget.gestureHandler.onPointerScroll( diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart index 0306afa4..454e9846 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart @@ -16,7 +16,8 @@ enum GestureType { SCALE1, SCALE2, SCROLLWHEEL, - POINTER_MOVE + POINTER_MOVE, + KEYDOWN } enum GestureAction { diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/lights/light_slider.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/lights/light_slider.dart index a355b29f..10ca8d82 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/lights/light_slider.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/lights/light_slider.dart @@ -1,194 +1,194 @@ -import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; -import 'package:thermion_dart/thermion_dart/utils/light_options.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; +// import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +// import 'package:thermion_dart/thermion_dart/utils/light_options.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter/widgets.dart'; -import 'package:vector_math/vector_math_64.dart' as v; +// import 'package:vector_math/vector_math_64.dart' as v; -class LightSliderWidget extends StatefulWidget { - final ThermionViewer controller; +// class LightSliderWidget extends StatefulWidget { +// final ThermionViewer controller; - final LightOptions options; - final bool showControls; +// final LightOptions options; +// final bool showControls; - LightSliderWidget( - {super.key, - required this.controller, - this.showControls = false, - required this.options}); - @override - State createState() => _LightSliderWidgetState(); -} +// LightSliderWidget( +// {super.key, +// required this.controller, +// this.showControls = false, +// required this.options}); +// @override +// State createState() => _LightSliderWidgetState(); +// } -class _LightSliderWidgetState extends State { - ThermionEntity? _light; +// class _LightSliderWidgetState extends State { +// ThermionEntity? _light; - @override - void initState() { - _set(); - super.initState(); - } +// @override +// void initState() { +// _set(); +// super.initState(); +// } - Future _set() async { - await widget.controller.clearLights(); +// Future _set() async { +// await widget.controller.clearLights(); - if (widget.options.iblPath != null) { - _light = await widget.controller.loadIbl(widget.options.iblPath!, - intensity: widget.options.iblIntensity); - } +// if (widget.options.iblPath != null) { +// _light = await widget.controller.loadIbl(widget.options.iblPath!, +// intensity: widget.options.iblIntensity); +// } - _light = await widget.controller.addLight( - LightType.values[ - widget.options.directionalType], - widget.options.directionalColor, - widget.options.directionalIntensity, - widget.options.directionalPosition.x, - widget.options.directionalPosition.y, - widget.options.directionalPosition.z, - widget.options.directionalDirection.x, - widget.options.directionalDirection.y, - widget.options.directionalDirection.z, - castShadows:widget.options.directionalCastShadows); +// _light = await widget.controller.addLight( +// LightType.values[ +// widget.options.directionalType], +// widget.options.directionalColor, +// widget.options.directionalIntensity, +// widget.options.directionalPosition.x, +// widget.options.directionalPosition.y, +// widget.options.directionalPosition.z, +// widget.options.directionalDirection.x, +// widget.options.directionalDirection.y, +// widget.options.directionalDirection.z, +// castShadows:widget.options.directionalCastShadows); - setState(() {}); - } +// setState(() {}); +// } - @override - Widget build(BuildContext context) { - if (_light == null || !widget.showControls) { - return Container(); - } - return Theme( - data: ThemeData(platform: TargetPlatform.android), - child: Container( - decoration: BoxDecoration(color: Colors.white.withOpacity(0.5)), - child: SliderTheme( - data: const SliderThemeData( - showValueIndicator: ShowValueIndicator.always, - valueIndicatorTextStyle: TextStyle(color: Colors.black)), - child: Column(mainAxisSize: MainAxisSize.min, children: [ - Text("Directional"), - Row(children: [ - Expanded( - child: Slider( - label: - "POSX ${widget.options.directionalPosition.x}", - value: widget.options.directionalPosition.x, - min: -10.0, - max: 10.0, - onChanged: (value) { - widget.options.directionalPosition.x = value; - _set(); - })), - Expanded( - child: Slider( - label: - "POSY ${widget.options.directionalPosition.y}", - value: widget.options.directionalPosition.y, - min: -100.0, - max: 100.0, - onChanged: (value) { - widget.options.directionalPosition.y = value; - _set(); - })), - Expanded( - child: Slider( - label: - "POSZ ${widget.options.directionalPosition.z}", - value: widget.options.directionalPosition.z, - min: -100.0, - max: 100.0, - onChanged: (value) { - widget.options.directionalPosition.z = value; - _set(); - })) - ]), - Row(children: [ - Expanded( - child: Slider( - label: "DIRX", - value: widget.options.directionalDirection.x, - min: -1.0, - max: 1.0, - onChanged: (value) { - widget.options.directionalDirection.x = value; - _set(); - })), - Expanded( - child: Slider( - label: "DIRY", - value: widget.options.directionalDirection.y, - min: -1.0, - max: 1.0, - onChanged: (value) { - widget.options.directionalDirection.y = value; - _set(); - })), - Expanded( - child: Slider( - label: "DIRZ", - value: widget.options.directionalDirection.z, - min: -1.0, - max: 1.0, - onChanged: (value) { - widget.options.directionalDirection.z = value; - _set(); - })) - ]), - Slider( - label: "Color", - value: widget.options.directionalColor, - min: 0, - max: 16000, - onChanged: (value) { - widget.options.directionalColor = value; - _set(); - }), - Slider( - label: "Intensity ${widget.options.directionalIntensity}", - value: widget.options.directionalIntensity, - min: 0, - max: 1000000, - onChanged: (value) { - widget.options.directionalIntensity = value; - _set(); - }), - DropdownButton( - onChanged: (v) { - this.widget.options.directionalType = v; - _set(); - }, - value: this.widget.options.directionalType, - items: List.generate( - 5, - (idx) => DropdownMenuItem( - value: idx, - child: Text("$idx"), - ))), - Row(children: [ - Text( - "Shadows: ${this.widget.options.directionalCastShadows}"), - Checkbox( - value: widget.options.directionalCastShadows, - onChanged: (v) { - this.widget.options.directionalCastShadows = v!; - _set(); - }) - ]), - Text("Indirect"), - Row(children: [ - Expanded( - child: Slider( - label: "Intensity ${widget.options.iblIntensity}", - value: widget.options.iblIntensity, - min: 0.0, - max: 200000, - onChanged: (value) { - widget.options.iblIntensity = value; - _set(); - })), - ]) - ])))); - } -} +// @override +// Widget build(BuildContext context) { +// if (_light == null || !widget.showControls) { +// return Container(); +// } +// return Theme( +// data: ThemeData(platform: TargetPlatform.android), +// child: Container( +// decoration: BoxDecoration(color: Colors.white.withOpacity(0.5)), +// child: SliderTheme( +// data: const SliderThemeData( +// showValueIndicator: ShowValueIndicator.always, +// valueIndicatorTextStyle: TextStyle(color: Colors.black)), +// child: Column(mainAxisSize: MainAxisSize.min, children: [ +// Text("Directional"), +// Row(children: [ +// Expanded( +// child: Slider( +// label: +// "POSX ${widget.options.directionalPosition.x}", +// value: widget.options.directionalPosition.x, +// min: -10.0, +// max: 10.0, +// onChanged: (value) { +// widget.options.directionalPosition.x = value; +// _set(); +// })), +// Expanded( +// child: Slider( +// label: +// "POSY ${widget.options.directionalPosition.y}", +// value: widget.options.directionalPosition.y, +// min: -100.0, +// max: 100.0, +// onChanged: (value) { +// widget.options.directionalPosition.y = value; +// _set(); +// })), +// Expanded( +// child: Slider( +// label: +// "POSZ ${widget.options.directionalPosition.z}", +// value: widget.options.directionalPosition.z, +// min: -100.0, +// max: 100.0, +// onChanged: (value) { +// widget.options.directionalPosition.z = value; +// _set(); +// })) +// ]), +// Row(children: [ +// Expanded( +// child: Slider( +// label: "DIRX", +// value: widget.options.directionalDirection.x, +// min: -1.0, +// max: 1.0, +// onChanged: (value) { +// widget.options.directionalDirection.x = value; +// _set(); +// })), +// Expanded( +// child: Slider( +// label: "DIRY", +// value: widget.options.directionalDirection.y, +// min: -1.0, +// max: 1.0, +// onChanged: (value) { +// widget.options.directionalDirection.y = value; +// _set(); +// })), +// Expanded( +// child: Slider( +// label: "DIRZ", +// value: widget.options.directionalDirection.z, +// min: -1.0, +// max: 1.0, +// onChanged: (value) { +// widget.options.directionalDirection.z = value; +// _set(); +// })) +// ]), +// Slider( +// label: "Color", +// value: widget.options.directionalColor, +// min: 0, +// max: 16000, +// onChanged: (value) { +// widget.options.directionalColor = value; +// _set(); +// }), +// Slider( +// label: "Intensity ${widget.options.directionalIntensity}", +// value: widget.options.directionalIntensity, +// min: 0, +// max: 1000000, +// onChanged: (value) { +// widget.options.directionalIntensity = value; +// _set(); +// }), +// DropdownButton( +// onChanged: (v) { +// this.widget.options.directionalType = v; +// _set(); +// }, +// value: this.widget.options.directionalType, +// items: List.generate( +// 5, +// (idx) => DropdownMenuItem( +// value: idx, +// child: Text("$idx"), +// ))), +// Row(children: [ +// Text( +// "Shadows: ${this.widget.options.directionalCastShadows}"), +// Checkbox( +// value: widget.options.directionalCastShadows, +// onChanged: (v) { +// this.widget.options.directionalCastShadows = v!; +// _set(); +// }) +// ]), +// Text("Indirect"), +// Row(children: [ +// Expanded( +// child: Slider( +// label: "Intensity ${widget.options.iblIntensity}", +// value: widget.options.iblIntensity, +// min: 0.0, +// max: 200000, +// onChanged: (value) { +// widget.options.iblIntensity = value; +// _set(); +// })), +// ]) +// ])))); +// } +// } From 4b2811931884b7b456ad4aedb1cb7cdea99a24d4 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 12:52:27 +0800 Subject: [PATCH 180/232] test updates --- thermion_dart/test/integration_test.dart | 198 ++++++++++++++++++++--- 1 file changed, 178 insertions(+), 20 deletions(-) diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index 1117ec0c..e2b5e77f 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -8,6 +8,7 @@ import 'package:animation_tools_dart/animation_tools_dart.dart'; import 'package:path/path.dart' as p; import 'package:thermion_dart/thermion_dart/utils/geometry.dart'; import 'package:thermion_dart/thermion_dart/viewer/events.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart'; import 'package:vector_math/vector_math_64.dart'; import 'helpers.dart'; @@ -24,7 +25,7 @@ void main() async { Future _capture(ThermionViewer viewer, String outputFilename) async { var outPath = p.join(outDir.path, "$outputFilename.bmp"); var pixelBuffer = await viewer.capture(); - await pixelBufferToBmp(pixelBuffer, viewportDimensions.width, + await savePixelBufferToBmp(pixelBuffer, viewportDimensions.width, viewportDimensions.height, outPath); } @@ -110,15 +111,50 @@ void main() async { }); group("gltf", () { - test('load glb', () async { + test('load glb from file', () async { var viewer = await createViewer(); - var model = await viewer.loadGlb("$testDir/cube.glb"); + var model = await viewer.loadGlb("file://$testDir/cube.glb"); await viewer.transformToUnitCube(model); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); await viewer.setCameraPosition(0, 1, 5); await viewer .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - await _capture(viewer, "load_glb"); + await _capture(viewer, "load_glb_from_file"); + }); + + test('load glb from buffer', () async { + var viewer = await createViewer(); + var buffer = File("$testDir/cube.glb").readAsBytesSync(); + var model = await viewer.loadGlbFromBuffer(buffer); + await viewer.transformToUnitCube(model); + await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); + await viewer.setCameraPosition(0, 1, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + await _capture(viewer, "load_glb_from_buffer"); + }); + + test('load glb from buffer with priority', () async { + var viewer = await createViewer(); + await viewer.addDirectLight(DirectLight.sun()); + await viewer.setBackgroundColor(1.0, 1.0, 1.0, 1.0); + await viewer.setCameraPosition(0, 3, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + + var buffer = File("$testDir/cube.glb").readAsBytesSync(); + var model1 = await viewer.loadGlbFromBuffer(buffer, priority: 7); + var model2 = await viewer.loadGlbFromBuffer(buffer, priority: 0); + + for (final entity in await viewer.getChildEntities(model1, true)) { + await viewer.setMaterialPropertyFloat4( + entity, "baseColorFactor", 0, 0, 0, 1.0, 1.0); + } + for (final entity in await viewer.getChildEntities(model2, true)) { + await viewer.setMaterialPropertyFloat4( + entity, "baseColorFactor", 0, 0, 1.0, 0.0, 1.0); + } + await _capture(viewer, "load_glb_from_buffer_with_priority"); }); }); @@ -242,12 +278,27 @@ void main() async { }); group("custom geometry", () { + test('create cube (no uvs/normals)', () async { + var viewer = await createViewer(); + await viewer.addLight(LightType.SUN, 6500, 1000000, 0, 0, 0, 0, 0, -1); + await viewer.setCameraPosition(0, 2, 6); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); + await viewer.setBackgroundColor(1.0, 1.0, 1.0, 1.0); + await viewer + .createGeometry(GeometryHelper.cube(normals: false, uvs: false)); + + await _capture(viewer, "geometry_cube_no_uv_no_normal"); + }); + test('create cube (no normals)', () async { var viewer = await createViewer(); var light = await viewer.addLight( - LightType.POINT, 6500, 1000000, 0, 0.6, 0.6, 0, 0, 0, - falloffRadius: 2.0); - await viewer.setCameraPosition(0, 0, 6); + LightType.POINT, 6500, 10000000, 0, 2, 0, 0, 0, 0, + falloffRadius: 100.0); + await viewer.setCameraPosition(0, 2, 6); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0); await viewer .createGeometry(GeometryHelper.cube(normals: false, uvs: false)); @@ -258,15 +309,36 @@ void main() async { var viewer = await createViewer(); var light = await viewer.addLight( - LightType.POINT, 6500, 1000000, 0, 0.5, 1, 0, 0, 0, + LightType.POINT, 6500, 10000000, 0, 2, 0, 0, 0, 0, falloffRadius: 100.0); - await viewer.setCameraPosition(0, 0, 6); - await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0); + await viewer.setCameraPosition(0, 2, 6); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); + await viewer.setBackgroundColor(1.0, 1.0, 1.0, 1.0); await viewer .createGeometry(GeometryHelper.cube(normals: true, uvs: false)); await _capture(viewer, "geometry_cube_with_normals"); }); + test('create cube with custom material instance', () async { + var viewer = await createViewer(); + await viewer.addLight(LightType.SUN, 6500, 1000000, 0, 0, 0, 0, 0, -1); + await viewer.setCameraPosition(0, 2, 6); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); + await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0); + + // var materialInstance = + // await viewer.createUbershaderMaterialInstance(unlit: true); + final cube = await viewer.createGeometry( + GeometryHelper.cube(uvs: false, normals: true), + materialInstance: null); + // await viewer.setMaterialPropertyFloat4( + // cube, "baseColorFactor", 0, 0.0, 1.0, 0.0, 0.0); + // await viewer.destroyMaterialInstance(materialInstance); + await _capture(viewer, "geometry_cube_with_custom_material"); + }); + test('create sphere (no normals)', () async { var viewer = await createViewer(); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); @@ -445,16 +517,35 @@ void main() async { }); }); - // test('enable grid overlay', () async { - // await viewer.setBackgroundColor(0, 0, 0, 1); - // await viewer.setCameraPosition(0, 0.5, 0); - // await viewer - // .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.1)); - // await viewer.setRendering(true); - // await viewer.setLayerEnabled(2, true); - // await _capture(viewer, "grid"); - // await viewer.setRendering(false); - // }); + group("layers & overlays", () { + test('enable grid overlay', () async { + var viewer = await createViewer(); + await viewer.setBackgroundColor(0, 0, 0, 1); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); + await viewer.setCameraPosition(0, 2, 0); + await _capture(viewer, "grid_overlay_default"); + await viewer.setLayerEnabled(7, true); + await _capture(viewer, "grid_overlay_enabled"); + await viewer.setLayerEnabled(7, false); + await _capture(viewer, "grid_overlay_disabled"); + }); + + test('load glb from buffer with layer', () async { + var viewer = await createViewer(); + + await viewer.setBackgroundColor(1, 0, 1, 1); + await viewer.setCameraPosition(0, 2, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + + var buffer = File("$testDir/cube.glb").readAsBytesSync(); + var model = await viewer.loadGlbFromBuffer(buffer, layer: 1); + await _capture(viewer, "load_glb_from_buffer_with_layer_disabled"); + await viewer.setLayerEnabled(1, true); + await _capture(viewer, "load_glb_from_buffer_with_layer_enabled"); + }); + }); // test('point light', () async { // var model = await viewer.loadGlb("$testDir/cube.glb"); @@ -618,4 +709,71 @@ void main() async { await _capture(viewer, "stencil_highlight_multiple_geometry_removed"); }); }); + + group("texture", () { + test("create/apply/dispose texture", () async { + var viewer = await createViewer(); + + var textureData = + File("$testDir/cube_texture_512x512.png").readAsBytesSync(); + var texture = await viewer.createTexture(textureData); + await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); + await viewer.createIbl(1.0, 1.0, 1.0, 60000.0); + await viewer.setCameraPosition(0, 2, 6); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); + + var cube = await viewer.createGeometry(GeometryHelper.cube()); + + await viewer.applyTexture(texture, cube, + materialIndex: 0, parameterName: "baseColorMap"); + + await _capture(viewer, "texture_applied_to_geometry"); + + await viewer.removeEntity(cube); + await viewer.destroyTexture(texture); + }); + }); + + group("unproject", () { + test("unproject", () async { + var viewer = await createViewer(); + await viewer.setPostProcessing(false); + // await viewer.setToneMapping(ToneMapper.LINEAR); + await viewer.setBackgroundColor(1.0, 1.0, 1.0, 1.0); + // await viewer.createIbl(1.0, 1.0, 1.0, 100000); + await viewer.addLight(LightType.SUN, 6500, 100000, -2, 0, 0, 1, -1, 0); + await viewer.addLight(LightType.SPOT, 6500, 500000, 0, 0, 2, 0, 0, -1, + falloffRadius: 10, spotLightConeInner: 1.0, spotLightConeOuter: 2.0); + + await viewer.setCameraPosition(-3, 4, 6); + await viewer.setCameraRotation( + Quaternion.axisAngle(Vector3(0, 1, 0), -pi / 8) * + Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 6)); + var cube = + await viewer.createGeometry(GeometryHelper.cube(), keepData: true); + await viewer.setMaterialPropertyFloat4( + cube, "baseColorFactor", 0, 1.0, 1.0, 1.0, 1.0); + var textureData = + File("$testDir/cube_texture_512x512.png").readAsBytesSync(); + var texture = await viewer.createTexture(textureData); + await viewer.applyTexture(texture, cube, + materialIndex: 0, parameterName: "baseColorMap"); + + await _capture(viewer, "unproject_temporary"); + + var pixelBuffer = + await (await viewer as ThermionViewerFFI).unproject(cube, 256, 256); + + await savePixelBufferToBmp( + pixelBuffer, 256, 256, p.join(outDir.path, "unproject.bmp")); + var pixelBufferPng = await bmpToPng(pixelBuffer, 256, 256); + File("${outDir.path}/unproject_texture.png") + .writeAsBytesSync(pixelBufferPng); + var reconstructed = await viewer.createTexture(pixelBufferPng); + await viewer.applyTexture(reconstructed, cube); + + await _capture(viewer, "unproject_reconstruct"); + }); + }); } From 66b626e605962a238a8b526cc78f2fb1278a5a16 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 12:53:30 +0800 Subject: [PATCH 181/232] update showcase --- docs/showcase.mdx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/showcase.mdx b/docs/showcase.mdx index 6a5b18e8..4cc9de77 100644 --- a/docs/showcase.mdx +++ b/docs/showcase.mdx @@ -6,6 +6,13 @@ A custom DartPad that lets you experiment with Thermion from your browser (curre [![Screenshot of Thermion Dartpad](images/dartpad.thermion.dev_.png)](https://dartpad.thermion.dev) +## mixreel (Flutter/Web) + +Create 3D worlds and translate to AI video. + +[![Screenshot of the mixreeel app](images/ixlabs.app_app.png)](https://mixreel.ai) + + ## Nick Fisher My personal website, where I create an interactive clone of myself with Avaturn & Cartesia (no Flutter, made with Thermion and the [Jaspr Dart UI framework](https://github.com/schultek/jaspr)). From c70cc9abb5e52b60bb9831028b2e31be65c6b957 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 12:53:44 +0800 Subject: [PATCH 182/232] add image methods to test helper --- thermion_dart/test/helpers.dart | 131 ++++++++++++++++++++++---------- 1 file changed, 92 insertions(+), 39 deletions(-) diff --git a/thermion_dart/test/helpers.dart b/thermion_dart/test/helpers.dart index 2710e2a1..6b1cb195 100644 --- a/thermion_dart/test/helpers.dart +++ b/thermion_dart/test/helpers.dart @@ -1,6 +1,7 @@ import 'dart:ffi'; import 'dart:io'; - +import 'dart:math'; +import 'package:image/image.dart' as img; import 'dart:typed_data'; import 'package:ffi/ffi.dart'; import 'package:thermion_dart/thermion_dart.dart'; @@ -10,11 +11,8 @@ import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_dart.g.dart'; import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart'; - - final viewportDimensions = (width: 500, height: 500); - /// Test files are run in a variety of ways, find this package root in all. /// /// Test files can be run from source from any working directory. The Dart SDK @@ -56,61 +54,116 @@ extension on Uri { late String testDir; -Future pixelBufferToBmp( +Future savePixelBufferToBmp( Uint8List pixelBuffer, int width, int height, String outputPath) async { - // BMP file header (14 bytes) - final fileHeader = ByteData(14); - fileHeader.setUint16(0, 0x4D42, Endian.little); // 'BM' - final fileSize = 54 + width * height * 3; // 54 bytes header + RGB data - fileHeader.setUint32(2, fileSize, Endian.little); - fileHeader.setUint32(10, 54, Endian.little); // Offset to pixel data + var data = await pixelBufferToBmp(pixelBuffer, width, height); + File(outputPath).writeAsBytesSync(data); + print("Wrote bitmap to ${outputPath}"); + return data; +} - // BMP info header (40 bytes) - final infoHeader = ByteData(40); - infoHeader.setUint32(0, 40, Endian.little); // Info header size - infoHeader.setInt32(4, width, Endian.little); - infoHeader.setInt32(8, -height, Endian.little); // Negative for top-down - infoHeader.setUint16(12, 1, Endian.little); // Number of color planes - infoHeader.setUint16(14, 24, Endian.little); // Bits per pixel (RGB) - infoHeader.setUint32(16, 0, Endian.little); // No compression - infoHeader.setUint32(20, width * height * 3, Endian.little); // Image size - infoHeader.setInt32(24, 2835, Endian.little); // X pixels per meter - infoHeader.setInt32(28, 2835, Endian.little); // Y pixels per meter - - // Calculate row size and padding +Future pixelBufferToBmp( + Uint8List pixelBuffer, int width, int height) async { final rowSize = (width * 3 + 3) & ~3; final padding = rowSize - (width * 3); + final fileSize = 54 + rowSize * height; + + final data = Uint8List(fileSize); + final buffer = data.buffer; + final bd = ByteData.view(buffer); + + // BMP file header (14 bytes) + bd.setUint16(0, 0x4D42, Endian.little); // 'BM' + bd.setUint32(2, fileSize, Endian.little); + bd.setUint32(10, 54, Endian.little); // Offset to pixel data + + // BMP info header (40 bytes) + bd.setUint32(14, 40, Endian.little); // Info header size + bd.setInt32(18, width, Endian.little); + bd.setInt32(22, -height, Endian.little); // Negative for top-down + bd.setUint16(26, 1, Endian.little); // Number of color planes + bd.setUint16(28, 24, Endian.little); // Bits per pixel (RGB) + bd.setUint32(30, 0, Endian.little); // No compression + bd.setUint32(34, rowSize * height, Endian.little); // Image size + bd.setInt32(38, 2835, Endian.little); // X pixels per meter + bd.setInt32(42, 2835, Endian.little); // Y pixels per meter // Pixel data (BMP stores in BGR format) - final bmpData = Uint8List(rowSize * height); for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { final srcIndex = (y * width + x) * 4; // RGBA format - final dstIndex = y * rowSize + x * 3; // BGR format - bmpData[dstIndex] = pixelBuffer[srcIndex + 2]; // Blue - bmpData[dstIndex + 1] = pixelBuffer[srcIndex + 1]; // Green - bmpData[dstIndex + 2] = pixelBuffer[srcIndex]; // Red + final dstIndex = 54 + y * rowSize + x * 3; // BGR format + data[dstIndex] = pixelBuffer[srcIndex + 2]; // Blue + data[dstIndex + 1] = pixelBuffer[srcIndex + 1]; // Green + data[dstIndex + 2] = pixelBuffer[srcIndex]; // Red // Alpha channel is discarded } // Add padding to the end of each row for (var p = 0; p < padding; p++) { - bmpData[y * rowSize + width * 3 + p] = 0; + data[54 + y * rowSize + width * 3 + p] = 0; } } - // Write BMP file - final file = File(outputPath); - final sink = file.openWrite(); - sink.add(fileHeader.buffer.asUint8List()); - sink.add(infoHeader.buffer.asUint8List()); - sink.add(bmpData); - await sink.close(); + return data; +} - print('BMP image saved to: $outputPath'); +Future bmpToPng(Uint8List pixelBuffer, int width, int height) async { + final image = img.Image(width: width, height: height); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + final int pixelIndex = (y * width + x) * 4; + double r = pixelBuffer[pixelIndex] / 255.0; + double g = pixelBuffer[pixelIndex + 1] / 255.0; + double b = pixelBuffer[pixelIndex + 2] / 255.0; + int a = pixelBuffer[pixelIndex + 3]; + + // Apply inverse ACES tone mapping + bool invertAces = false; + if (invertAces) { + r = _inverseACESToneMapping(r); + g = _inverseACESToneMapping(g); + b = _inverseACESToneMapping(b); + } + + // Convert from linear to sRGB + final int sRgbR = _linearToSRGB(r); + final int sRgbG = _linearToSRGB(g); + final int sRgbB = _linearToSRGB(b); + + image.setPixel( + x, y, img.ColorUint8(4)..setRgba(sRgbR, sRgbG, sRgbB, 1.0)); + } + } + + return img.encodePng(image); +} + +double _inverseACESToneMapping(double x) { + const double a = 2.51; + const double b = 0.03; + const double c = 2.43; + const double d = 0.59; + const double e = 0.14; + + // Ensure x is in the valid range [0, 1] + x = x.clamp(0.0, 1.0); + + // Inverse ACES filmic tone mapping function + return (x * (x * a + b)) / (x * (x * c + d) + e); +} + +int _linearToSRGB(double linearValue) { + if (linearValue <= 0.0031308) { + return (linearValue * 12.92 * 255.0).round().clamp(0, 255); + } else { + return ((1.055 * pow(linearValue, 1.0 / 2.4) - 0.055) * 255.0) + .round() + .clamp(0, 255); + } } Future createViewer() async { - final packageUri = findPackageRoot('thermion_dart'); final lib = ThermionDartTexture1(DynamicLibrary.open( From d8a0859f165cdbddc7b8ab6f943cfe850e3e1732 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 13:00:40 +0800 Subject: [PATCH 183/232] update test --- thermion_dart/test/integration_test.dart | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index e2b5e77f..a8fcc755 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -328,15 +328,16 @@ void main() async { .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0); - // var materialInstance = - // await viewer.createUbershaderMaterialInstance(unlit: true); + var materialInstance = + await viewer.createUbershaderMaterialInstance(unlit: true); final cube = await viewer.createGeometry( GeometryHelper.cube(uvs: false, normals: true), - materialInstance: null); - // await viewer.setMaterialPropertyFloat4( - // cube, "baseColorFactor", 0, 0.0, 1.0, 0.0, 0.0); - // await viewer.destroyMaterialInstance(materialInstance); + materialInstance: materialInstance); + await viewer.setMaterialPropertyFloat4( + cube, "baseColorFactor", 0, 0.0, 1.0, 0.0, 0.0); await _capture(viewer, "geometry_cube_with_custom_material"); + await viewer.removeEntity(cube); + await viewer.destroyMaterialInstance(materialInstance); }); test('create sphere (no normals)', () async { From 523141d54bb6a3072ba82abaa1b4727a51e13fc7 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 13:02:51 +0800 Subject: [PATCH 184/232] add test cube texture image --- thermion_dart/test/cube_texture_512x512.png | Bin 0 -> 10492 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 thermion_dart/test/cube_texture_512x512.png diff --git a/thermion_dart/test/cube_texture_512x512.png b/thermion_dart/test/cube_texture_512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..733472542865c497bd4dd0bb6fff0ddab4bb9147 GIT binary patch literal 10492 zcmeHt`9GB1|No?<2z8e>q=jTpk=+!bv5oAE;V#KCcE&J_Q7VO~LGH-D8%(lgn?a=P z3?>F+U&bDT8OwaG-rvXf`zO3V-yiNDu5-*I`Q$(b%?0A;SN+@@Yk{SH}iVxk9y?m z1VW)uvaX&8KgUPjPO@IU&dDq47eS!QAjtiD=7FD*8TGB}-J&0#e0l%!q}DOm z%_YgdPM);8>wWm)Jrla=vV|LAxMk+?z@Xcz1+2oB3WJ%)Pd>jIb++;4Rr~|du>9kX zjI=tm{`wNJ?hhMztC^Dr|afAKAw)CE(h=^w=h=IigtD+ zxVgEv8RlVk1_mu}D50M9k8|Tm_1ouYscB@*m5D|6BRrG6?q?;|OTayX>i$l$;m&6qx8YSB7jA zh8d4XgUXeTfO_~^nl}@tT}q3-+=2=SRCDvkT3K5so^=#fyPncKbjXGO7${vhNu8-k zaKc-$t2CL@O8UmB89Z_!&0J+1J*g)_VOK0HINN^gB+3&Nr=r_u<|x1Q z?m0RZfB7=_Vvh3V?{B8a zW%LRp85}kh1^C*pip6U(_96JDCRIe!i*x<;yDkI$@pL?4tiJ{cU8tbQ4hW;%AO8J! zU=-u`h7$g(vi3FIJ*_uyrp#fm5;;TX!OUN?6`>17b;@CP~U zT^x*@D`QgSIT!SywT0Ib4o}cz?_n!^rfA5qpzSJaxm#ZnJ?oJPs{Zq{HiIPgnfjf{ z>b7=+fvshBU)Uit=pY&7E#xBt8dtEg{7}5N*BSX{fi^jg?Rj^l3WBTjfGsJWy)>57 z(&&H_;sf(u3W*YxkV15>r`-&Tdkz8_`?a)Oz-8y>H(R!5Wd$4HA|r3b1SWG;S=gug zMVB2OmpTISPQnwwmm$8@S7E{^)o;^tbLJQfx031OP4(o*doLX2 z>#C0_^_Domy7^PLAs}(#L!eKy&!4O2W7$6oOJw_oE1;F<@dUzPTS6y_SAFgitbWkL zCI3Bj^w;B|l~EBy`v)t5ix=CKKw$yVghL!h?RJfQUbE1)p) z3-Sf&L@E74hZ^l2g;ho8!3R@jGH`TNr5D!W!i7}`?)mep{*9dcRm|GMnVEkHh=2_j z7I+4JSxf!Qc=2N5BKSZ8xvI&!uPF=?KM#!Tx^7IJ)iu2_>TKYXCvyAqdIsiZW|@6` z(#&11LdRB7CR2rKCoU~*OtDvkdRD;_5`wr-oUkx4X@2vMW>{P_2o&v8oq6WmIY#)P zkFpT3$iVk*bBy!Y9XSRHyLSW#21nOVfk1MP9>Ep-W<#0G^=ll;@O6S<*tv*rP+1Cp ztug5CZj&C+@cezC`1|A`(EsfS^!vB+zhaQ-d8H?>sgyVnpZFr4aAtZd@!Q1OA7E7c zSv>sxx|kSa9r*W+`*qqaow>bfabhZ$_X9cc>u$XXR)sMCazY+Qxr8G-boBGQ_P%G+ zY6yU$?>>0g=Z2-PdB1FFVWMRluBZs{A){g}SG!UGkWDwT!0iczM)F-V_i^Llg#UVoJG!uq^*>YqN`q`x4|Me@_y9*ez#C-?dbF zM4;qH&jV!4e9=uSYy6@`zq!i*1wXyIN@(YD2sQNE>4cGbhdmIAi+N@7XA=Dlsb5}z zc2WGetHs-|rCDp8qyAv-p^{nl&_GKK*X9`Kymd zOswGp<)AnfjsXTkzq8$J`}HvgD5toMVPJG<$V99d1o;*zDJ|6>NwAzJM?({;<;>*9 z)-$y@wAEu{kG<*Hd`O);L3`NbM|MLZrl^$`TDLxB1nyJT!<348T zGSS=(kC4X}(%<|%4U?{AHYF=M4xX4fGv~q_oJmsf$2m(&D(K(--l;r9Zr(l#YR%8c z)h#G{Dls*RvPeo0V>jGw;TJAEMcT`$IdNe!Xr!?9k{Mu7Ty`g+E)y<-5rssGsG1w` z^0I!vRT70z&&rrCq-vxxUX27KPe$;nz3D!--0Q5Of_7>@3x6Mh``A!=X*G!_>tjzw5P{ z_BEXD4JWI}uBCunS(RO!<@U!9ak)AYQRNz5wMipJ7e^dFdsfe%MV?@Dt?tD0_6CoiSxSkd>#-F@D~BnVLtDtuz~-;sARb%<#{=Z}CD+ly%F>6m2KwcmtM(QY$|AT+ zMGsdl26o^flf@t(b8=G8zsnvE193Fuf6vv0m`05A$$U^!xZ?t$|HWA9Crg12wkBu_ z>@p@UJ7z+7W^Rq#3Ih-JbsC64jEszmk2bVR*;}^7oB<$!lj|tHuu@;8MP(RQts^(O zj(h&;9xgj4IT3BVPk=a(9}C`=O}z&iUpvd*X>Fs`*(7Rgf9l$2cF%Y#i$bc?uq9Tl z(Y?V{qqz=FP7;@utx+NCFEwjcHH)#c7mQNC4u?zXD_bi6tiv&OH@m+Ds-DryuRb1? z7jD+SS6*(Jn07%BA1W^+SHwc-M_z@?Y5;^uwF+T1pmayFX<+Z$(zBWN3P~vgG8b>3 zLELqT=Apfz#owc~NJd>yjn9Nu4h@-D^P-~8Z5NN(^?ww535}qe^R5mL_??~T$}wOx zCn=_a{!wv@|1N%AGH6g5P9~(CwMUJvAK>q*k$ZlnzpcHakLz0T**aBRHi;KVVh@Fg z-4~zVrm*cb)EM!i1O1fwWro*c0@U8sZ?xD3rs%kL0{$^1M=M;*!rDHcYb@|?El&W# zVptNYARX*|fhKhFkaxc?m~E#9-nkoILbCscU5`5Jxc=>x1aphZ81n0O-6pY%HBXCI zmI{pbjNo!R(`fWxaZ}%eI2-0yMj2cE1(Ca0uJtd&w)N$%ajHkTs+4yO`o1>b9|gO` zhgSLKJk80azvq#2FJ0MbzK;oPFXd*f1(DB23)hlsI>IG#rX){c} zJiZhK*LhKm?E}BzGOz9{gXM3q6?(375hD7yt2HRf%1nFxcj3^^ZEMM{AMcKVgv27U zNmc8t3uA3cAlaoM^5VFhqQf=s^o)Cnn=7M#l8>DF;6;>_m7CMkTr1EE&ZB6)11_eD z5M4kZ=Xs&zjHP)#%DkUH&{A1=S@u`4d~6JWSPkI2W_pGilTrKnh5F^Se^;r#LYb3x zLcxK2Ks>Q;uhB&%hzeMo*&km{SveM#W&R;W24cJ23U(V6VgH()qDx9a2jjhylHPv` z>7f27&VMH==0D#<-)ST)&%`H+tl!Zl@xHmf^7J?)<6g$a!CEFdr;l#x@pB~e7hh@3 z`g1{naqN?bq{+y~5YxmTvaKHWja{=h#!K*Hz}pzhQ44*}X%?{?-Ci32ua2SdTu`=+ z*quOm_xt?NtJq`%X}d;KbI{Nr`GtEFQXi%e5hx=O(ffbOKY5}T#1sbyE16%l-(noR{mZjwsizLNQeVF~Qq93peq9YFfJE9)8B}^DioRVK zSo~*;ET7FZ_S)qaQqEmY-{wLSz2J~otMH>)EG-FM&vPW)!9YfnpY9+0w>esy@yypSgQddrp9f{oi|By z|Es#(uPuPCurkx{^7N4_+~>Mx1rJ$RO5%$QOTs{%De6Oumq1|iu(Y(NqT-88UO|Ov z5w;0s&D&ydVBte!IAg>qQ8>@}`BpYGQIo|OAPr`1hzyvq(fXyQN+b64$6LZ>E$tzx zvqhh>f);0kK8Obx_d~z$-7f=wlmU|*v8$>F9qVYn0uyC>8RC4wedHEV7!!1Y7F5hF7h~HNW$S=saS1(JnPU%)R zJDh85v9#@(kaY9$3!HO@iTUG9${k_82+zIo!x&b_?Y8|rzX2cwQ1c(sn@7nVH6B0S zT_gIcNT}N0#>FWrXc9YHU#OZkjmsmzxsZ(eyx`WJ&|>8dT!0^{(~3#c!QaM+8N)P&2dHkB&L&w_(dS)S9Usb z^a$NKanF$ISB1~de85HLyHQ|(V-QXfZaK^iK^a#i}=;zOU#=-7s zKwg^t({Q+^;_kQBj=>I2(iWgcXzSbj)1(MEfc3x1(f_7uW(=bax|@B^yFg6+E+NrC zISrDw`Faz+F^d^^Y-4WzSxf5^y-&K|;(KaEMu%bjl!HmQRo9z z=(koD19;TxoT7_K5pnOgb8ETWc>3~U6+ZK8X6O35*C*j@8U;^H_Z0WBbm2J!+G*(c zm<33eF5PJx8&VbSLwp)*4Ziy`auPKxdgw*9%0zzWV?y<{b7RFoXNajbCVXpdiISu= z=rZ>z1--hk?LUV{u>xNKbhSa;t^}l`Q>~7TiS#YNvdDE%@;A(wO^Q@Z$>GZh>YS<%VfB@T`b20mwqzFG8V`W4-WXc ztsS#q7cS@&7Py+wi1OUL$khCWZ(MedWUHGYiaU-(W`EvwEAle8x%cstY+jRN9e72H3drPVCIf243I@X6b#+Tu zY7hmMMZdCgb7xzDVffQ9a|_S7blbZLOpqFC#S$>PDWs3ZP>GB=2zM4F=koS9zrpyE zjiN*$3kxr0zPHA%7FUhc3~tPk*qE$K82^Od8&VqWy3r4MHo6^39(|jHb*vJ1HT#x^ zk{PT;vvMTj*(Geq+qQNf7uE>YrN33mb@}xUNR(Lrih)Rey7dWR@-$#we zZ{A=J_FNJQ@u+Qr+jFsXpwgz_hffSxQbMbGt{??_j1u>j{t`Q3xHfF>8d~t7+qNVc zdBH6o@lI3)Zp^qaq?eT&YnqrX8}SM1V_a&V#;lgz`iDpEGR&o2>`KWtjh6A_LE`u5g@vK6hG(UbZ+Qp)k=Lkj>AmyvC8yiS*VWK9-b+GrOm^!f zSdQK$n}QPfH)OZQwS;#)_mY+7T*vAN{=GT`dK@&g$gg{u9u$H^*6ZuL`EPVanOj4wJ_*5c1ssaCP1>F>sr^8oj5?hVe+Hv< z;5h+Xxn5;@HunKe7p~NXP{-;KwXSOQqx>CoT678u3Lw=~-wG*Y;_Qf;9yoZxInsD% zrQ%^-m30|b6E=`DK=%pYM+*Kj;sZx)xsPQLz)V|VRiyG0Q2cbleA@P&S%O$X5{p`J zo&Vr3U|BWqFU6xK%DzKGx zsyN1rYMK4Vj-I2cE>qtx0LErS8>Oh4Siu>&o}_(;;V(0JzRE%}gGRt?M#&lXH9SiZ zRZLqEQ45H%By{201=4d2yn1F5(jIlQ>8v^Q}SIX}Jc5kJGWE%}Om>G|*Vt0p+vwLnah5CgGjQ0g}r5akVW@i9EsX{Kx z6!)A4v9ZiwrGA@jQdWrRAG74tpr8cSczBAwVRT>g1#Me(O?7n>esIXMT%%-ymHp7j zPCW{v;y{Fc$qz!4QV4Zhtw+(;@V z_WIFDqU>6V?mKw!^G{Vl_9zQa|-I>O&_!A0biGeZ11C}v^E>K{U z{ChgUz&T}LXmPZ1bJTVBt)O2lbzP_Za6j@{WZMhnUEAKmL9QlM|D~wV7@5(vX&PBv#i=IRN%H5P)jXRwi zfv7l`E50wDcpc7J%WZCNUQ$C>?G7~4j+O3%O362t=DcRRYFf>cLOY5%!fv%$wzj*srq!^^Ju`^GfijD}mc~VQO zj-*d%Ti<#uZt+l``DezmPV3{aIGTg4o_JfA;UH5_KyNs8p(pf?q=wp z|0mr8QMpi`M?)~83F?Q;vtLa9iJ=!&n!m_b(Vy%5k z0bF3=IS*QB=Jrb+LE313Q<2t7-B*Q+VY7sHm+HjtdRP=wru?dc9VmT%-q7kM_;7_! zA`n#q-zp6%(UU!B<<YTy0L z9tWUiLY!GiOH@@sU7aNm2J|Qn;0HKh*SseV8bhw25Q`ykWBq2(x0L*cqZZcIIf)Kq zML`=xU^_p>zg;F=gX*Wcui*W6QKhF$k6h?F5KaX1hlh_2^eebbHqU-O4=gV!tEcoB zwGZnfyXGE&qib;KbwluyPkFeTSG zg-}I1u=OJCS2))mIuweYe$T_$NJ|S2Ik@FLY_s1zFvcU?xjH6C+;1ngM zCsii6-0z!l{l>gn>dbqe_cc3}QH<5ZgXM~XM^^l1j+iXXpqbM$!J#%$@>X9Be4Lwu ziZ?J5@)I=+3&{$*D?_&HecYT8T!?wmU{t36*JA9k=K)t#s!3y5Y||-P#DRH*GqfOJ z`S*b|_-a$mKmVKrLT=CxhM%8Q`IDak%R}V7TF@WnwzK|5=JCWXz~m~>$PZg9GFI;H z`CV#+Wb}5-@91;qM0(m1KDKp8TNoO?e#O5^XH*~12Wa~8n$nWFr*4T*C?66+&uq?k1F*dw zr3Kmz1xfRi)Ab}AI(;&1%Y8Vjug;Y72xq>dmL5a7Rxb+1>+IPT|E)XYl5;TD&LYXG zaKCzYX3Z~uZb-uje&(MqH(vth7QAbKEY)l9Flbq?t?7&`#}QD&)qjtH0U7!KH|OHg zK@L!mvT2#Kmt|n!J3`)}atVNKzEv~=w1Y`NQ;3MKP&8n3xs{ Date: Thu, 19 Sep 2024 13:44:17 +0800 Subject: [PATCH 185/232] add spot constructor --- .../viewer/shared_types/light_options.dart | 92 ++++++++++++------- 1 file changed, 57 insertions(+), 35 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart index 09e5a1ee..b128772c 100644 --- a/thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/light_options.dart @@ -38,39 +38,61 @@ class DirectLight { this.sunHaloSize = 10.0, this.sunHaloFallof = 80.0, }); -DirectLight.point({ - double color = 6500, - double intensity = 100000, - bool castShadows = false, - Vector3? position, - double falloffRadius = 1.0, -}) : this( - type: LightType.POINT, - color: color, - intensity: intensity, - castShadows: castShadows, - position: position ?? Vector3(0, 1, 0), - direction: Vector3.zero(), - falloffRadius: falloffRadius, -); -DirectLight.sun({ - double color = 6500, - double intensity = 100000, - bool castShadows = true, - Vector3? direction, - double sunAngularRadius = 0.545, - double sunHaloSize = 10.0, - double sunHaloFalloff = 80.0, -}) : this( - type: LightType.DIRECTIONAL, - color: color, - intensity: intensity, - castShadows: castShadows, - position: Vector3(0, 0, 0), - direction: direction ?? Vector3(0, -1, 0), - sunAngularRadius: sunAngularRadius, - sunHaloSize: sunHaloSize, - sunHaloFallof: sunHaloFalloff, -); -} + DirectLight.point({ + double color = 6500, + double intensity = 100000, + bool castShadows = false, + Vector3? position, + double falloffRadius = 1.0, + }) : this( + type: LightType.POINT, + color: color, + intensity: intensity, + castShadows: castShadows, + position: position ?? Vector3(0, 1, 0), + direction: Vector3.zero(), + falloffRadius: falloffRadius, + ); + + DirectLight.sun({ + double color = 6500, + double intensity = 100000, + bool castShadows = true, + Vector3? direction, + double sunAngularRadius = 0.545, + double sunHaloSize = 10.0, + double sunHaloFalloff = 80.0, + }) : this( + type: LightType.DIRECTIONAL, + color: color, + intensity: intensity, + castShadows: castShadows, + position: Vector3(0, 0, 0), + direction: direction ?? Vector3(0, -1, 0), + sunAngularRadius: sunAngularRadius, + sunHaloSize: sunHaloSize, + sunHaloFallof: sunHaloFalloff, + ); + + DirectLight.spot({ + double color = 6500, + double intensity = 100000, + bool castShadows = true, + Vector3? position, + Vector3? direction, + double falloffRadius = 1.0, + double spotLightConeInner = pi / 8, + double spotLightConeOuter = pi / 4, + }) : this( + type: LightType.SPOT, + color: color, + intensity: intensity, + castShadows: castShadows, + position: position ?? Vector3(0, 1, 0), + direction: direction ?? Vector3(0, -1, 0), + falloffRadius: falloffRadius, + spotLightConeInner: spotLightConeInner, + spotLightConeOuter: spotLightConeOuter, + ); +} \ No newline at end of file From 3b2d7d8c4770df5acd1639518c545e0189d3aa78 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 16:59:01 +0800 Subject: [PATCH 186/232] depth pre-pass when projecting texture --- thermion_dart/native/src/UnprojectTexture.cpp | 253 ++++++++++++------ 1 file changed, 167 insertions(+), 86 deletions(-) diff --git a/thermion_dart/native/src/UnprojectTexture.cpp b/thermion_dart/native/src/UnprojectTexture.cpp index 1c1a554e..0f576c70 100644 --- a/thermion_dart/native/src/UnprojectTexture.cpp +++ b/thermion_dart/native/src/UnprojectTexture.cpp @@ -20,111 +20,192 @@ #include "CustomGeometry.hpp" #include "UnprojectTexture.hpp" -namespace thermion_filament { +namespace thermion_filament +{ -void UnprojectTexture::unproject(utils::Entity entity, const uint8_t* inputTexture, uint8_t* outputTexture, uint32_t inputWidth, uint32_t inputHeight, - uint32_t outputWidth, uint32_t outputHeight) { - auto& rm = _engine->getRenderableManager(); - auto& tm = _engine->getTransformManager(); + bool UnprojectTexture::isInsideTriangle(const math::float2 &p, const math::float2 &a, const math::float2 &b, const math::float2 &c) + { + float d1 = (p.x - b.x) * (a.y - b.y) - (a.x - b.x) * (p.y - b.y); + float d2 = (p.x - c.x) * (b.y - c.y) - (b.x - c.x) * (p.y - c.y); + float d3 = (p.x - a.x) * (c.y - a.y) - (c.x - a.x) * (p.y - a.y); + return (d1 >= 0 && d2 >= 0 && d3 >= 0) || (d1 <= 0 && d2 <= 0 && d3 <= 0); + } - // Get the inverse view-projection matrix - math::mat4 invViewProj = Camera::inverseProjection(_camera.getProjectionMatrix()) * _camera.getModelMatrix(); + math::float3 UnprojectTexture::barycentric(const math::float2 &p, const math::float2 &a, const math::float2 &b, const math::float2 &c) + { + math::float2 v0 = b - a; + math::float2 v1 = c - a; + math::float2 v2 = p - a; - // Get the world transform of the entity - auto ti = tm.getInstance(entity); - math::mat4f worldTransform = tm.getWorldTransform(ti); - auto inverseWorldTransform = inverse(worldTransform); + float d00 = dot(v0, v0); + float d01 = dot(v0, v1); + float d11 = dot(v1, v1); + float d20 = dot(v2, v0); + float d21 = dot(v2, v1); - // Get vertex, normal, UV, and index data from CustomGeometry - const float* vertices = _geometry->vertices; - const float* uvs = _geometry->uvs; - const uint16_t* indices = _geometry->indices; - uint32_t numIndices = _geometry->numIndices; + float denom = d00 * d11 - d01 * d01; - // Iterate over each pixel in the output texture - for (uint32_t y = 0; y < outputHeight; ++y) { - for (uint32_t x = 0; x < outputWidth; ++x) { - // Convert output texture coordinates to UV space - math::float2 uv(static_cast(x) / outputWidth, static_cast(y) / outputHeight); - - // Use the UV coordinates to get the corresponding 3D position on the renderable - math::float3 objectPos; - math::float2 interpolatedUV; - bool found = false; + float v = (d11 * d20 - d01 * d21) / denom; + float w = (d00 * d21 - d01 * d20) / denom; + float u = 1.0f - v - w; - // Iterate over triangles to find which one contains this UV coordinate - for (size_t i = 0; i < numIndices; i += 3) { - math::float2 uv0 = *(math::float2*)&uvs[indices[i] * 2]; - math::float2 uv1 = *(math::float2*)&uvs[indices[i+1] * 2]; - math::float2 uv2 = *(math::float2*)&uvs[indices[i+2] * 2]; + return math::float3(u, v, w); + } - if (isInsideTriangle(uv, uv0, uv1, uv2)) { - // Compute barycentric coordinates in UV space - math::float3 bary = barycentric(uv, uv0, uv1, uv2); + void UnprojectTexture::unproject(utils::Entity entity, const uint8_t *inputTexture, uint8_t *outputTexture, + uint32_t inputWidth, uint32_t inputHeight, + uint32_t outputWidth, uint32_t outputHeight) + { - // Interpolate 3D position - math::float3 v0(vertices[indices[i] * 3], vertices[indices[i] * 3 + 1], vertices[indices[i] * 3 + 2]); - math::float3 v1(vertices[indices[i+1] * 3], vertices[indices[i+1] * 3 + 1], vertices[indices[i+1] * 3 + 2]); - math::float3 v2(vertices[indices[i+2] * 3], vertices[indices[i+2] * 3 + 1], vertices[indices[i+2] * 3 + 2]); - objectPos = v0 * bary.x + v1 * bary.y + v2 * bary.z; + auto &rm = _engine->getRenderableManager(); - interpolatedUV = uv; - found = true; - break; + auto &tm = _engine->getTransformManager(); + + math::mat4 invViewProj = Camera::inverseProjection(_camera.getProjectionMatrix()) * _camera.getModelMatrix(); + + auto ti = tm.getInstance(entity); + math::mat4f worldTransform = tm.getWorldTransform(ti); + auto inverseWorldTransform = inverse(worldTransform); + + const float *vertices = _geometry->vertices; + const float *uvs = _geometry->uvs; + const uint16_t *indices = _geometry->indices; + uint32_t numIndices = _geometry->numIndices; + + // Create a depth buffer + std::vector depthBuffer(inputWidth * inputHeight, std::numeric_limits::infinity()); + + // Create a buffer to store the triangle index for each pixel + std::vector triangleIndexBuffer(inputWidth * inputHeight, -1); + + auto max = 0.0f; + auto min = 99.0f; + + // Depth pre-pass + for (size_t i = 0; i < numIndices; i += 3) + { + math::float3 v0(vertices[indices[i] * 3], vertices[indices[i] * 3 + 1], vertices[indices[i] * 3 + 2]); + math::float3 v1(vertices[indices[i + 1] * 3], vertices[indices[i + 1] * 3 + 1], vertices[indices[i + 1] * 3 + 2]); + math::float3 v2(vertices[indices[i + 2] * 3], vertices[indices[i + 2] * 3 + 1], vertices[indices[i + 2] * 3 + 2]); + + math::float2 uv0(uvs[(indices[i] * 2)], uvs[(indices[i] * 2) + 1]); + math::float2 uv1(uvs[(indices[i + 1] * 2)], uvs[(indices[i + 1] * 2) + 1]); + math::float2 uv2(uvs[(indices[i + 2] * 2)], uvs[(indices[i + 2] * 2) + 1]); + + // Transform vertices to world space + v0 = (worldTransform * math::float4(v0, 1.0f)).xyz; + v1 = (worldTransform * math::float4(v1, 1.0f)).xyz; + v2 = (worldTransform * math::float4(v2, 1.0f)).xyz; + + // Project vertices to screen space + math::float4 clipPos0 = _camera.getProjectionMatrix() * _camera.getViewMatrix() * math::float4(v0, 1.0f); + math::float4 clipPos1 = _camera.getProjectionMatrix() * _camera.getViewMatrix() * math::float4(v1, 1.0f); + math::float4 clipPos2 = _camera.getProjectionMatrix() * _camera.getViewMatrix() * math::float4(v2, 1.0f); + + math::float3 ndcPos0 = clipPos0.xyz / clipPos0.w; + math::float3 ndcPos1 = clipPos1.xyz / clipPos1.w; + math::float3 ndcPos2 = clipPos2.xyz / clipPos2.w; + + // Convert NDC to screen coordinates + math::float2 screenPos0((ndcPos0.x * 0.5f + 0.5f) * inputWidth, (1.0f - (ndcPos0.y * 0.5f + 0.5f)) * inputHeight); + math::float2 screenPos1((ndcPos1.x * 0.5f + 0.5f) * inputWidth, (1.0f - (ndcPos1.y * 0.5f + 0.5f)) * inputHeight); + math::float2 screenPos2((ndcPos2.x * 0.5f + 0.5f) * inputWidth, (1.0f - (ndcPos2.y * 0.5f + 0.5f)) * inputHeight); + + // Compute bounding box of the triangle + int minX = std::max(0, static_cast(std::min({screenPos0.x, screenPos1.x, screenPos2.x}))); + int maxX = std::min(static_cast(inputWidth) - 1, static_cast(std::max({screenPos0.x, screenPos1.x, screenPos2.x}))); + int minY = std::max(0, static_cast(std::min({screenPos0.y, screenPos1.y, screenPos2.y}))); + int maxY = std::min(static_cast(inputHeight) - 1, static_cast(std::max({screenPos0.y, screenPos1.y, screenPos2.y}))); + + // Iterate over the bounding box + for (int y = minY; y <= maxY; ++y) + { + for (int x = minX; x <= maxX; ++x) + { + math::float2 pixelPos(x + 0.5f, y + 0.5f); + + if (isInsideTriangle(pixelPos, screenPos0, screenPos1, screenPos2)) + { + math::float3 bary = barycentric(pixelPos, screenPos0, screenPos1, screenPos2); + + // Interpolate depth + float depth = bary.x * ndcPos0.z + bary.y * ndcPos1.z + bary.z * ndcPos2.z; + + // Depth test + if (depth < depthBuffer[y * inputWidth + x]) + { + + if (depth > max) + { + max = depth; + } + if (depth < min) + { + min = depth; + } + depthBuffer[y * inputWidth + x] = depth; + triangleIndexBuffer[y * inputWidth + x] = i / 3; // Store triangle index + } + } } } + } - if (found) { - // Transform the object position to world space - math::float3 worldPos = (worldTransform * math::float4(objectPos, 1.0f)).xyz; + for (uint32_t y = 0; y < outputHeight; ++y) + { + for (uint32_t x = 0; x < outputWidth; ++x) + { - // Project the world position to screen space - math::float4 clipPos = _camera.getProjectionMatrix() * _camera.getViewMatrix() * math::float4(worldPos, 1.0f); - math::float3 ndcPos = clipPos.xyz / clipPos.w; + math::float2 uv(static_cast(x) / outputWidth, static_cast(y) / outputHeight); - // Convert NDC to screen coordinates - int sx = static_cast((ndcPos.x * 0.5f + 0.5f) * inputWidth); - int sy = static_cast((1.0f - (ndcPos.y * 0.5f + 0.5f)) * inputHeight); + // Use the UV coordinates to get the corresponding 3D position on the renderable + math::float3 objectPos; + math::float2 interpolatedUV; + bool found = false; - // Ensure we're within the input texture bounds - if (sx >= 0 && sx < inputWidth && sy >= 0 && sy < inputHeight) { - // Sample the input texture - int inputIndex = (sy * inputWidth + sx) * 4; - int outputIndex = (y * outputWidth + x) * 4; + // Iterate over triangles to find which one contains this UV coordinate + for (size_t i = 0; i < numIndices; i += 3) + { + math::float2 uv0 = *(math::float2 *)&uvs[indices[i] * 2]; + math::float2 uv1 = *(math::float2 *)&uvs[indices[i + 1] * 2]; + math::float2 uv2 = *(math::float2 *)&uvs[indices[i + 2] * 2]; - // Copy the color to the output texture - std::copy_n(&inputTexture[inputIndex], 4, &outputTexture[outputIndex]); + if (isInsideTriangle(uv, uv0, uv1, uv2)) + { + // Compute barycentric coordinates in UV space + math::float3 bary = barycentric(uv, uv0, uv1, uv2); + + // Interpolate 3D position + math::float3 v0(vertices[indices[i] * 3], vertices[indices[i] * 3 + 1], vertices[indices[i] * 3 + 2]); + math::float3 v1(vertices[indices[i + 1] * 3], vertices[indices[i + 1] * 3 + 1], vertices[indices[i + 1] * 3 + 2]); + math::float3 v2(vertices[indices[i + 2] * 3], vertices[indices[i + 2] * 3 + 1], vertices[indices[i + 2] * 3 + 2]); + + objectPos = v0 * bary.x + v1 * bary.y + v2 * bary.z; + interpolatedUV = uv; + + // Find the screen coordinates on the input texture + math::float3 worldPos = (worldTransform * math::float4(objectPos, 1.0f)).xyz; + // Project the world position to screen space + math::float4 clipPos = _camera.getProjectionMatrix() * _camera.getViewMatrix() * math::float4(worldPos, 1.0f); + math::float3 ndcPos = clipPos.xyz / clipPos.w; + // Convert NDC to screen coordinates + uint32_t screenX = (ndcPos.x * 0.5f + 0.5f) * inputWidth; + uint32_t screenY = (1.0f - (ndcPos.y * 0.5f + 0.5f)) * inputHeight; + + if (triangleIndexBuffer[(screenY * inputWidth) + screenX] == i / 3) + { + if (screenX >= 0 && screenX < inputWidth && screenY >= 0 && screenY < inputHeight) + { + int inputIndex = (screenY * inputWidth + screenX) * 4; + int outputIndex = (y * outputWidth + x) * 4; + std::copy_n(&inputTexture[inputIndex], 4, &outputTexture[outputIndex]); + } + } + } } } } } -} -math::float3 UnprojectTexture::doUnproject(const math::float2& screenPos, float depth, const math::mat4& invViewProj) { - math::float4 clipSpace(screenPos.x * 2.0f - 1.0f, screenPos.y * 2.0f - 1.0f, depth * 2.0f - 1.0f, 1.0f); - math::float4 worldSpace = invViewProj * clipSpace; - return math::float3(worldSpace.xyz) / worldSpace.w; -} +} // namespace thermion_filament -bool UnprojectTexture::isInsideTriangle(const math::float2& p, const math::float2& a, const math::float2& b, const math::float2& c) { - float d1 = (p.x - b.x) * (a.y - b.y) - (a.x - b.x) * (p.y - b.y); - float d2 = (p.x - c.x) * (b.y - c.y) - (b.x - c.x) * (p.y - c.y); - float d3 = (p.x - a.x) * (c.y - a.y) - (c.x - a.x) * (p.y - a.y); - return (d1 >= 0 && d2 >= 0 && d3 >= 0) || (d1 <= 0 && d2 <= 0 && d3 <= 0); -} - -math::float3 UnprojectTexture::barycentric(const math::float2& p, const math::float2& a, const math::float2& b, const math::float2& c) { - math::float2 v0 = b - a, v1 = c - a, v2 = p - a; - float d00 = dot(v0, v0); - float d01 = dot(v0, v1); - float d11 = dot(v1, v1); - float d20 = dot(v2, v0); - float d21 = dot(v2, v1); - float denom = d00 * d11 - d01 * d01; - float v = (d11 * d20 - d01 * d21) / denom; - float w = (d00 * d21 - d01 * d20) / denom; - float u = 1.0f - v - w; - return math::float3(u, v, w); -} - -} // namespace thermion_filament \ No newline at end of file From 10826466a4c1dc83f1bbc6095ad2c97b52d7847c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 17:08:06 +0800 Subject: [PATCH 187/232] set default material for geometry to baseColorIndex 0 --- thermion_dart/native/src/SceneManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 2892ae62..847bc720 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -2580,7 +2580,7 @@ EntityId SceneManager::createGeometry( return nullptr; } materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4{0.0f, 1.0f, 1.0f, 1.0f}); - materialInstance->setParameter("baseColorIndex", -1); + materialInstance->setParameter("baseColorIndex", 0); return materialInstance; } From aa21c0fb769539e04c82542aa8a25f6c61db5b84 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 21:08:55 +0800 Subject: [PATCH 188/232] don't call clearBackgroundImage when setBackgroundImage is called (would deadlock) --- thermion_dart/native/src/FilamentViewer.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 95c7a004..2dd12708 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -603,7 +603,6 @@ namespace thermion_filament { _engine->destroy(_imageTexture); _imageTexture = nullptr; - Log("Destroyed background image texture"); } } @@ -619,14 +618,11 @@ namespace thermion_filament string resourcePathString(resourcePath); - clearBackgroundImage(); - loadTextureFromPath(resourcePathString); // This currently just anchors the image at the bottom left of the viewport at its original size // TODO - implement stretch/etc const Viewport &vp = _view->getViewport(); - // Log("Image width %d height %d vp width %d height %d", _imageWidth, _imageHeight, vp.width, vp.height); float xScale = float(vp.width) / float(_imageWidth); @@ -645,6 +641,7 @@ namespace thermion_filament _imageMaterial->setDefaultParameter("transform", _imageScale); _imageMaterial->setDefaultParameter("image", _imageTexture, _imageSampler); _imageMaterial->setDefaultParameter("showImage", 1); + } /// @@ -1468,19 +1465,18 @@ namespace thermion_filament }); } - void FilamentViewer::unprojectTexture(EntityId entityId, uint8_t* out, uint32_t outWidth, uint32_t outHeight) { + void FilamentViewer::unprojectTexture(EntityId entityId, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t* out, uint32_t outWidth, uint32_t outHeight) { const auto * geometry = _sceneManager->getGeometry(entityId); if(!geometry->uvs) { Log("No UVS"); return; } - const auto& viewport = _view->getViewport(); - auto viewportCapture = new uint8_t[viewport.width * viewport.height * 4]; - capture(viewportCapture, true, nullptr); UnprojectTexture unproject(geometry, _view->getCamera(), _engine); + + // TODO - check that input dimensions match viewport? - unproject.unproject(utils::Entity::import(entityId), viewportCapture, out, viewport.width, viewport.height, outWidth, outHeight); + unproject.unproject(utils::Entity::import(entityId), input, out, inputWidth, inputHeight, outWidth, outHeight); } From e8ae7193ee38d60aa6d3cda0e82553c4cb7ed3c6 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 21:09:23 +0800 Subject: [PATCH 189/232] update unproject texture to accept input texture --- thermion_dart/native/include/FilamentViewer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index 6f26b3e3..4fb91590 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -151,7 +151,7 @@ namespace thermion_filament return (SceneManager *const)_sceneManager; } - void unprojectTexture(EntityId entity, uint8_t* out, uint32_t outWidth, uint32_t outHeight); + void unprojectTexture(EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t* out, uint32_t outWidth, uint32_t outHeight); private: const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; From fa43149c986aa6be89a5e2590b097b42f3be3394 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 21:10:10 +0800 Subject: [PATCH 190/232] update unproject texture to accept input texture --- thermion_dart/native/include/ThermionDartApi.h | 2 +- thermion_dart/native/include/ThermionDartFFIApi.h | 2 +- thermion_dart/native/src/ThermionDartApi.cpp | 4 ++-- thermion_dart/native/src/ThermionDartFFIApi.cpp | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 35b09957..6df4e459 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -274,7 +274,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float value); EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float4 value); - EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const sceneManager, EntityId entity, uint8_t *out, uint32_t outWidth, uint32_t outHeight); + EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const sceneManager, EntityId entity,uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight); EMSCRIPTEN_KEEPALIVE void *const create_texture(void *const sceneManager, uint8_t *data, size_t length); EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void *const texture); EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(void *const sceneManager, EntityId entity, void *const texture, const char *parameterName, int materialIndex); diff --git a/thermion_dart/native/include/ThermionDartFFIApi.h b/thermion_dart/native/include/ThermionDartFFIApi.h index b27a78b4..2a6dc3fd 100644 --- a/thermion_dart/native/include/ThermionDartFFIApi.h +++ b/thermion_dart/native/include/ThermionDartFFIApi.h @@ -115,7 +115,7 @@ extern "C" TMaterialInstance *materialInstance, bool keepData, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void unproject_texture_ffi(void *const sceneManager, EntityId entity, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()); + EMSCRIPTEN_KEEPALIVE void unproject_texture_ffi(void *const sceneManager, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()); #ifdef __cplusplus diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 73ad329e..14e5e5fb 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -968,9 +968,9 @@ extern "C" ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, filamentValue); } - EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const viewer, EntityId entity, uint8_t *out, uint32_t outWidth, uint32_t outHeight) + EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const viewer, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight) { - ((FilamentViewer *)viewer)->unprojectTexture(entity, out, outWidth, outHeight); + ((FilamentViewer *)viewer)->unprojectTexture(entity, input, inputWidth, inputHeight, out, outWidth, outHeight); } EMSCRIPTEN_KEEPALIVE void *const create_texture(void *const sceneManager, uint8_t *data, size_t length) diff --git a/thermion_dart/native/src/ThermionDartFFIApi.cpp b/thermion_dart/native/src/ThermionDartFFIApi.cpp index 80ca6222..366efca1 100644 --- a/thermion_dart/native/src/ThermionDartFFIApi.cpp +++ b/thermion_dart/native/src/ThermionDartFFIApi.cpp @@ -862,11 +862,11 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void unproject_texture_ffi(void *const viewer, EntityId entity, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()) { + EMSCRIPTEN_KEEPALIVE void unproject_texture_ffi(void *const viewer, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()) { std::packaged_task lambda( [=] { - unproject_texture(viewer, entity, out, outWidth, outHeight); + unproject_texture(viewer, entity, input, inputWidth, inputHeight, out, outWidth, outHeight); callback(); }); auto fut = _rl->add_task(lambda); From ebdaf65b8960eebefedf6cac14b2eeaad3f76917 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 21:10:22 +0800 Subject: [PATCH 191/232] update unproject texture to accept input texture --- .../lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index a1ba8d29..c52c9129 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -1976,11 +1976,11 @@ class ThermionViewerFFI extends ThermionViewer { } Future unproject( - ThermionEntity entity, int outWidth, int outHeight) async { + ThermionEntity entity, Uint8List input, int inputWidth, int inputHeight, int outWidth, int outHeight) async { final outPtr = Uint8List(outWidth * outHeight * 4); await withVoidCallback((callback) { unproject_texture_ffi( - _viewer!, entity, outPtr.address, outWidth, outHeight, callback); + _viewer!, entity, input.address, inputWidth, inputHeight, outPtr.address, outWidth, outHeight, callback); }); return outPtr.buffer.asUint8List(); From 72dacc5b21c9ce7a4afe16f9572cea1a2f9dbc29 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 21:10:28 +0800 Subject: [PATCH 192/232] update unproject texture to accept input texture --- .../viewer/ffi/thermion_dart.g.dart | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart index 4e8176ec..33742218 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart @@ -1220,11 +1220,21 @@ external void set_material_property_float4( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Uint32, ffi.Uint32)>(isLeaf: true) + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Uint32, + ffi.Uint32, + ffi.Pointer, + ffi.Uint32, + ffi.Uint32)>(isLeaf: true) external void unproject_texture( ffi.Pointer sceneManager, int entity, + ffi.Pointer input, + int inputWidth, + int inputHeight, ffi.Pointer out, int outWidth, int outHeight, @@ -1764,10 +1774,16 @@ external void create_geometry_ffi( ffi.Pointer, ffi.Uint32, ffi.Uint32, + ffi.Pointer, + ffi.Uint32, + ffi.Uint32, ffi.Pointer>)>(isLeaf: true) external void unproject_texture_ffi( ffi.Pointer sceneManager, int entity, + ffi.Pointer input, + int inputWidth, + int inputHeight, ffi.Pointer out, int outWidth, int outHeight, From 74e808d1dc3ad122b433fbd6d4262c5b8750fa80 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Sep 2024 21:10:42 +0800 Subject: [PATCH 193/232] update tests --- thermion_dart/test/integration_test.dart | 148 ++++++++++++++++++++--- 1 file changed, 134 insertions(+), 14 deletions(-) diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index a8fcc755..d1a0b0ba 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:io'; import 'dart:math'; +import 'dart:typed_data'; import 'package:thermion_dart/thermion_dart.dart'; import 'package:test/test.dart'; @@ -25,8 +26,12 @@ void main() async { Future _capture(ThermionViewer viewer, String outputFilename) async { var outPath = p.join(outDir.path, "$outputFilename.bmp"); var pixelBuffer = await viewer.capture(); - await savePixelBufferToBmp(pixelBuffer, viewportDimensions.width, - viewportDimensions.height, outPath); + await savePixelBufferToBmp( + pixelBuffer, + viewer.viewportDimensions.$1.toInt(), + viewer.viewportDimensions.$2.toInt(), + outPath); + return pixelBuffer; } group('camera', () { @@ -108,6 +113,16 @@ void main() async { await Future.delayed(Duration(seconds: 1)); await _capture(viewer, "skybox"); }); + + test('set background image', () async { + var viewer = await createViewer(); + await viewer + .setBackgroundImage("file:///$testDir/cube_texture_512x512.png"); + await viewer.setPostProcessing(true); + await viewer.setToneMapping(ToneMapper.LINEAR); + await _capture(viewer, "set_background_image"); + await viewer.dispose(); + }); }); group("gltf", () { @@ -719,12 +734,25 @@ void main() async { File("$testDir/cube_texture_512x512.png").readAsBytesSync(); var texture = await viewer.createTexture(textureData); await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); - await viewer.createIbl(1.0, 1.0, 1.0, 60000.0); + await viewer.addDirectLight( + DirectLight.sun(direction: Vector3(0, -10, -1)..normalize())); + await viewer.addDirectLight(DirectLight.spot( + intensity: 1000000, + position: Vector3(0, 0, 1.5), + direction: Vector3(0, 0, -1)..normalize(), + falloffRadius: 10, + spotLightConeInner: 1, + spotLightConeOuter: 1)); await viewer.setCameraPosition(0, 2, 6); await viewer .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); + var materialInstance = + await viewer.createUbershaderMaterialInstance(unlit: true); + var cube = await viewer.createGeometry(GeometryHelper.cube(), + materialInstance: materialInstance); - var cube = await viewer.createGeometry(GeometryHelper.cube()); + await viewer.setPostProcessing(false); + //await viewer.setToneMapping(ToneMapper.LINEAR); await viewer.applyTexture(texture, cube, materialIndex: 0, parameterName: "baseColorMap"); @@ -738,7 +766,9 @@ void main() async { group("unproject", () { test("unproject", () async { - var viewer = await createViewer(); + final dimensions = (width: 1280, height: 768); + + var viewer = await createViewer(viewportDimensions: dimensions); await viewer.setPostProcessing(false); // await viewer.setToneMapping(ToneMapper.LINEAR); await viewer.setBackgroundColor(1.0, 1.0, 1.0, 1.0); @@ -761,20 +791,110 @@ void main() async { await viewer.applyTexture(texture, cube, materialIndex: 0, parameterName: "baseColorMap"); - await _capture(viewer, "unproject_temporary"); + var numFrames = 60; - var pixelBuffer = - await (await viewer as ThermionViewerFFI).unproject(cube, 256, 256); + // first do the render + for (int i = 0; i < numFrames; i++) { + await viewer.setCameraPosition(-3 + (i / numFrames * 2), 4, 6); - await savePixelBufferToBmp( - pixelBuffer, 256, 256, p.join(outDir.path, "unproject.bmp")); - var pixelBufferPng = await bmpToPng(pixelBuffer, 256, 256); + await viewer.setCameraRotation( + Quaternion.axisAngle(Vector3(0, 1, 0), -pi / 8) * + Quaternion.axisAngle( + Vector3(1, 0, 0), -pi / 6 - (i / numFrames * pi / 6))); + + var rendered = await _capture(viewer, "unproject_render$i"); + var renderPng = + await pixelsToPng(rendered, dimensions.width, dimensions.height); + + File("${outDir.path}/unproject_render${i}.png") + .writeAsBytesSync(renderPng); + } + + // then go off and convert the video + + // now unproject the render back onto the geometry + final textureSize = (width: 1280, height: 768); + var pixels = []; + // note we skip the first frame + for (int i = 0; i < numFrames; i++) { + await viewer.setCameraPosition(-3 + (i / numFrames * 2), 4, 6); + + await viewer.setCameraRotation( + Quaternion.axisAngle(Vector3(0, 1, 0), -pi / 8) * + Quaternion.axisAngle( + Vector3(1, 0, 0), -pi / 6 - (i / numFrames * pi / 6))); + + var input = pngToPixelBuffer(File( + "${outDir.path}/a8c317af-6081-4848-8a06-f6b69bc57664_${i + 1}.png") + .readAsBytesSync()); + var pixelBuffer = await (await viewer as ThermionViewerFFI).unproject( + cube, + input, + dimensions.width, + dimensions.height, + textureSize.width, + textureSize.height); + + // var png = await pixelsToPng(Uint8List.fromList(pixelBuffer), + // dimensions.width, dimensions.height); + + await savePixelBufferToBmp( + pixelBuffer, + textureSize.width, + textureSize.height, + p.join(outDir.path, "unprojected_texture${i}.bmp")); + + pixels.add(pixelBuffer); + + if (i > 10) { + break; + } + } + + // } + + final aggregatePixelBuffer = medianImages(pixels); + await savePixelBufferToBmp(aggregatePixelBuffer, textureSize.width, + textureSize.height, "unproject_texture.bmp"); + var pixelBufferPng = await pixelsToPng( + Uint8List.fromList(aggregatePixelBuffer), + dimensions.width, + dimensions.height); File("${outDir.path}/unproject_texture.png") .writeAsBytesSync(pixelBufferPng); - var reconstructed = await viewer.createTexture(pixelBufferPng); - await viewer.applyTexture(reconstructed, cube); + await viewer.clearLights(); + await viewer.setPostProcessing(true); + await viewer.setToneMapping(ToneMapper.ACES); + + final unlit = await viewer.createUbershaderMaterialInstance(unlit: true); + await viewer.removeEntity(cube); + cube = await viewer.createGeometry(GeometryHelper.cube(), + materialInstance: unlit); + var reconstructedTexture = await viewer.createTexture(pixelBufferPng); + await viewer.applyTexture(reconstructedTexture, cube); + + await viewer.setCameraRotation( + Quaternion.axisAngle(Vector3(0, 1, 0), -pi / 8) * + Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 6)); await _capture(viewer, "unproject_reconstruct"); - }); + + // now re-render + for (int i = 0; i < numFrames; i++) { + await viewer.setCameraPosition(-3 + (i / numFrames * 2), 4, 6); + + await viewer.setCameraRotation( + Quaternion.axisAngle(Vector3(0, 1, 0), -pi / 8) * + Quaternion.axisAngle( + Vector3(1, 0, 0), -pi / 6 - (i / numFrames * pi / 6))); + + var rendered = await _capture(viewer, "unproject_rerender$i"); + var renderPng = + await pixelsToPng(rendered, dimensions.width, dimensions.height); + + File("${outDir.path}/unproject_rerender${i}.png") + .writeAsBytesSync(renderPng); + } + }, timeout: Timeout(Duration(minutes: 2))); }); } From 1788c74d4cb5646f70c4a77d546e0836e82b996b Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:01:02 +0800 Subject: [PATCH 194/232] change float4 to double4 --- thermion_dart/native/include/APIBoundaryTypes.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/thermion_dart/native/include/APIBoundaryTypes.h b/thermion_dart/native/include/APIBoundaryTypes.h index 61bd908f..b811c330 100644 --- a/thermion_dart/native/include/APIBoundaryTypes.h +++ b/thermion_dart/native/include/APIBoundaryTypes.h @@ -75,11 +75,11 @@ extern "C" typedef struct TMaterialKey TMaterialKey; typedef struct { - float x; - float y; - float z; - float w; - } float4; + double x; + double y; + double z; + double w; + } double4; typedef struct { double col1[4]; From 196cc6b980b475938643c6332d61585d097427b8 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:01:41 +0800 Subject: [PATCH 195/232] set default layer for loadGlb to 0,. add setMaterialProperty for int --- thermion_dart/native/include/SceneManager.hpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 8d958880..9eea41e9 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -92,7 +92,7 @@ namespace thermion_filament /// @return an Entity representing the FilamentAsset associated with the loaded FilamentAsset. /// EntityId loadGlb(const char *uri, int numInstances, bool keepData); - EntityId loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances = 1, bool keepData = false, int priority = 4, int layer = 2); + EntityId loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances = 1, bool keepData = false, int priority = 4, int layer = 0); EntityId createInstance(EntityId entityId); void remove(EntityId entity); @@ -285,7 +285,8 @@ namespace thermion_filament } void setMaterialProperty(EntityId entity, int materialIndex, const char* property, float value); - void setMaterialProperty(EntityId entityId, int materialIndex, const char* property, filament::math::float4 value); + void setMaterialProperty(EntityId entity, int materialIndex, const char* property, int32_t value); + void setMaterialProperty(EntityId entityId, int materialIndex, const char* property, filament::math::float4& value); MaterialInstance* createUbershaderMaterialInstance(MaterialKey key); void destroy(MaterialInstance* materialInstance); @@ -294,6 +295,8 @@ namespace thermion_filament return _ubershaderProvider; } + MaterialInstance* createUnlitMaterialInstance(); + private: gltfio::AssetLoader *_assetLoader = nullptr; const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; From ef48dbce302a5e4887e5b04b7c2e3dace3171a39 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:01:59 +0800 Subject: [PATCH 196/232] add base color/texture to unlit --- materials/unlit.mat | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/materials/unlit.mat b/materials/unlit.mat index 3d75dff5..ee11c77c 100644 --- a/materials/unlit.mat +++ b/materials/unlit.mat @@ -1,34 +1,38 @@ material { name : unlit, + requires : [ uv0 ], parameters : [ { - type : float3, - name : color + type : sampler2d, + name : baseColorMap }, - { - type : float, - name : scale + { + type : float4, + name : baseColorFactor + }, + { + type : int, + name : baseColorIndex } ], depthWrite : true, - depthCulling : false, + depthCulling : true, shadingModel : unlit, blending: opaque, culling: none, instanced: false, vertexDomain: object } - vertex { - void materialVertex(inout MaterialVertexInputs material) { - float4 position = getPosition(); - position.xyz *= materialParams.scale; - material.worldPosition = getWorldFromModelMatrix() * position; - } - } - + fragment { void material(inout MaterialInputs material) { prepareMaterial(material); - material.baseColor = float4(materialParams.color, 1.0); + material.baseColor = materialParams.baseColorFactor; + + if (materialParams.baseColorIndex > -1) { + highp float2 uv = getUV0(); + uv.y = 1.0 - uv.y; + material.baseColor *= texture(materialParams_baseColorMap, uv); + } } } From e8a1b976e14a2e43f8ea2822d4fbd16bc6068b3c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:02:30 +0800 Subject: [PATCH 197/232] set default layer for loadGlb to 0,. add setMaterialProperty for int, add SceneManager::createUnlitMaterialInstance --- thermion_dart/native/src/SceneManager.cpp | 32 ++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 847bc720..109510b4 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -2489,7 +2489,7 @@ EntityId SceneManager::createGeometry( Log("Failed to create material instance"); return Entity::smuggle(Entity()); } - } + } // Set up texture and sampler if UVs are available if (uvs != nullptr && numUvs > 0) @@ -2548,7 +2548,7 @@ EntityId SceneManager::createGeometry( materialInstance->setParameter(property, value); } - void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char *property, filament::math::float4 value) + void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char *property, int32_t value) { auto entity = Entity::import(entityId); const auto &rm = _engine->getRenderableManager(); @@ -2568,6 +2568,26 @@ EntityId SceneManager::createGeometry( materialInstance->setParameter(property, value); } + void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char *property, filament::math::float4& value) + { + auto entity = Entity::import(entityId); + const auto &rm = _engine->getRenderableManager(); + auto renderableInstance = rm.getInstance(entity); + if (!renderableInstance.isValid()) + { + Log("Error setting material property for entity %d: no renderable"); + return; + } + auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); + + if (!materialInstance->getMaterial()->hasParameter(property)) + { + Log("Parameter %s not found", property); + return; + } + materialInstance->setParameter(property, filament::math::float4 { value.x, value.y, value.z, value.w }); + } + void SceneManager::destroy(MaterialInstance* instance) { _engine->destroy(instance); } @@ -2579,11 +2599,17 @@ EntityId SceneManager::createGeometry( Log("Invalid material configuration"); return nullptr; } - materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4{0.0f, 1.0f, 1.0f, 1.0f}); + materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4{1.0f, 0.0f, 1.0f, 1.0f}); materialInstance->setParameter("baseColorIndex", 0); return materialInstance; } + MaterialInstance* SceneManager::createUnlitMaterialInstance() { + UvMap uvmap; + auto instance = _unlitMaterialProvider->createMaterialInstance(nullptr, &uvmap); + return instance; + } + } // namespace thermion_filament From 92814aed56bee35fcc5feee16d2d3029c24755a7 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:03:29 +0800 Subject: [PATCH 198/232] add setMaterialProperty for int, add create_unlit_material_instance --- thermion_dart/native/src/ThermionDartApi.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 14e5e5fb..2eb7cb25 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -962,9 +962,19 @@ extern "C" ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value); } - EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float4 value) + EMSCRIPTEN_KEEPALIVE void set_material_property_int(void *const sceneManager, EntityId entity, int materialIndex, const char *property, int32_t value) { - filament::math::float4 filamentValue{value.x, value.y, value.z, value.w}; + + ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value); + } + + EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, double4 value) + { + filament::math::float4 filamentValue; + filamentValue.x = static_cast(value.x); + filamentValue.y = static_cast(value.y); + filamentValue.z = static_cast(value.z); + filamentValue.w = static_cast(value.w); ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, filamentValue); } @@ -1023,6 +1033,11 @@ extern "C" return reinterpret_cast(materialInstance); } +EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_unlit_material_instance(void *const sceneManager) { + auto * instance = ((SceneManager*)sceneManager)->createUnlitMaterialInstance(); + return reinterpret_cast(instance); +} + EMSCRIPTEN_KEEPALIVE void destroy_material_instance(void *const sceneManager, TMaterialInstance *instance) { ((SceneManager *)sceneManager)->destroy(reinterpret_cast(instance)); } From f943756624b31cab8a011db16a284212d89cc95b Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:03:50 +0800 Subject: [PATCH 199/232] add setMaterialProperty for int, add create_unlit_material_instance, use double4 instead of float4 --- thermion_dart/native/include/ThermionDartApi.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 6df4e459..9c33462f 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -141,9 +141,11 @@ extern "C" int numMorphTargets, int numFrames, float frameLengthInMs); + EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_material_instance(void *const sceneManager, TMaterialKey materialConfig); - + EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_unlit_material_instance(void *const sceneManager); EMSCRIPTEN_KEEPALIVE void destroy_material_instance(void *const sceneManager, TMaterialInstance *instance); + EMSCRIPTEN_KEEPALIVE void clear_morph_animation( void *sceneManager, EntityId entity); @@ -273,7 +275,8 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entity, float r, float g, float b); EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float value); - EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float4 value); + EMSCRIPTEN_KEEPALIVE void set_material_property_int(void *const sceneManager, EntityId entity, int materialIndex, const char *property, int value); + EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, double4 value); EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const sceneManager, EntityId entity,uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight); EMSCRIPTEN_KEEPALIVE void *const create_texture(void *const sceneManager, uint8_t *data, size_t length); EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void *const texture); From 8e85042e37bf8a8f75d418b7e5fe3645d6f622ea Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:04:11 +0800 Subject: [PATCH 200/232] remove old default paramsf rom UnlitMaterialProvider --- .../native/include/material/UnlitMaterialProvider.hpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/thermion_dart/native/include/material/UnlitMaterialProvider.hpp b/thermion_dart/native/include/material/UnlitMaterialProvider.hpp index c1f9dffc..7aa7e56e 100644 --- a/thermion_dart/native/include/material/UnlitMaterialProvider.hpp +++ b/thermion_dart/native/include/material/UnlitMaterialProvider.hpp @@ -35,11 +35,6 @@ public: const char* label = "unlit", const char* extras = nullptr) override { auto instance = mUnlitMaterial->createInstance(); - - // Set default parameters - instance->setParameter("color", filament::math::float3{1.0f, 1.0f, 1.0f}); - instance->setParameter("scale", 1.0f); - return instance; } From b5e278183ad5115838cbff05dcefeb1b8744e570 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:04:27 +0800 Subject: [PATCH 201/232] update built unlit material --- thermion_dart/native/include/material/unlit.S | 2 +- .../native/include/material/unlit.apple.S | 2 +- .../native/include/material/unlit.bin | Bin 63643 -> 101394 bytes thermion_dart/native/include/material/unlit.c | 8063 ++++++++++------- 4 files changed, 4977 insertions(+), 3090 deletions(-) diff --git a/thermion_dart/native/include/material/unlit.S b/thermion_dart/native/include/material/unlit.S index 4989d923..25b0436d 100644 --- a/thermion_dart/native/include/material/unlit.S +++ b/thermion_dart/native/include/material/unlit.S @@ -8,5 +8,5 @@ UNLIT_PACKAGE: UNLIT_UNLIT_OFFSET: .int 0 UNLIT_UNLIT_SIZE: - .int 63643 + .int 101394 diff --git a/thermion_dart/native/include/material/unlit.apple.S b/thermion_dart/native/include/material/unlit.apple.S index 68ed9bfa..d6ad1d11 100644 --- a/thermion_dart/native/include/material/unlit.apple.S +++ b/thermion_dart/native/include/material/unlit.apple.S @@ -8,5 +8,5 @@ _UNLIT_PACKAGE: _UNLIT_UNLIT_OFFSET: .int 0 _UNLIT_UNLIT_SIZE: - .int 63643 + .int 101394 diff --git a/thermion_dart/native/include/material/unlit.bin b/thermion_dart/native/include/material/unlit.bin index a07f00e04dcc216cdaa9e98ddfb428fb0bb344d7..75365a9a72eedf94ed667983ae60bb2d9c6c3b62 100644 GIT binary patch literal 101394 zcmeHQ2Yg(`(cjlZOCgX#8aVP;nz9q>x?+ zX{7hwd+&|(LVEAL_nz-Rv%Bx@?khT-l?1}4-_L&c=Ixu=ot@d8nVsFYW%KF_T3c7F z4}}m_{M))>^%}bO@Y`Fxe#Hj5>BG(3#Q4~(Shs5Z7G0d68`f`JrHhNL>(<1$@Jy^( zyWxC#cny9Zv1Yoxr*rCqV4C!xt}hn+n+(MfLo^^?<6yT>MW#cu@b+q0eNvG(|;HtI7Y4&StX z1vlu&sADMn!w&QOBM$S9^t_|QI8~`N!xdTIo)Vq}jO`d-wdNe*$9G$%IwN!A?P(FH zH)h(CBGkX9MWlYtPS1_Z&P{hjp9Jij+$9d%Lp9vmp5E1&J$r8F&dzjeYI0_5c5HG2 zl}kUIZBOj#Ow7)RBlcJgY3*pwbXHD|Pfk-!kK93QQ253sM#n}vGb<)WFYGXrMd|Fd z+%NY)n;m}m0MTEJZcTe+c5+$*@&92#{ABIKXlH-?;P3!gnUnp1Iao=U=r4YkDk=Ox zY}v4JB}vHP@;U!sI{SRaa~s?_cyy^PTMVgNYu;>Fz3%K-9#^g3yfwaAw`TR`_-5_q z3z;rU`IZY;$1?2UNpiDg_15HO>y`~`V+31PR#wC}8?Br5=f|kUrj467Q88+tX2Pnq z=QH;ScB^&A-y%BcyydG_oXc(IGV9hGH|x!6Z#8c=Z(JJ_@>ZNDTSsbq1pcj9u_-~g zdBp{MLl2++wA(Ji=^UnVYJreELGncm!iXic|wjCWSGXWL>=dsdZ)y6;&(IocTqjp?!d%ji*6qKY4F z!1&UR3ye+7mJBUgIXO2myG#&t=XiV9%*x&EiHXkmj08>cn6!3unbiIxtzFeBixcs9 zY@(B2qExSm6VcSMoni#)K3k${0mquP=d{+ZxTv+3v8`OarF2$4lKE>gG;d9YN;})* zGaXfn9g~yex*D4{UI@9mU~_BBxhq!T*M%E5-*d(0jpuJzRaB{=Wn#R2U~+D@e`a>H zTpL_cnv>&x$r<%ieO+pA%VGfdeR)atjvmQ#N!arY%MLn_uRGLrL|xI*4DW2Kfdc>B zsjjd5>;YcUH7Px6Y4q%Or6oOxjj=5HIk+&7jS6;VC9(Bs3DH> z6^N>mMEzrL@{WA6&jpZHSac7#fP)EuRk3XV<^ZXdb{G&6$`Rw9t2$}`WIZ}5$W8;o zSa%)VHVi)V@7=~jiD1ltph&HBu?x5a0H!`}JYfYl?j^DbS+rJ~G#*jWDdS!iy;K&h zl%`XUW>S#Z6lBhT%n^mX0B{rc;fEx#-zXy?2LR#H2jfER?1i)~;GoI<16iT`n-|bD zkZek9C`0aa32kpxORe&7Q$j1mHp0eIYRTikeky{J1CZy;0ta*f%qp1$4(bA0|67&v zAYhhq4s>L1Qe$E~x>pGS-dQH-{{h0+uYR54U>Q@L&yV*(I&30i0|&r0NVH~AjCpFh zGcv}es~%-}OkF0@4=`NCrm2>AWz+IN61z0i4$NAeJ!3O7V|zP#>>nBLw5L~M{!alm zPtNVy4L2>G?b{P$Gn2E^lT*xFOv4Fa)fj3_qnM)7sy3m-aw5QQW+Gm|&+0O<8(!WN zh7JtruzZX=*gwV{tRUkKwvcfrEg}N|yU4hMbtLb&$*_^)JGPYMova<~CG!?mQ(U%I zg6(A7!GenKDkU`4xPvt%@xh9cKVUu4U{iwCB+E%KxM|*k?dI*AeG6+!z6C2v{(#)e zALs-5L(4H)Nr`ntvlv-LTm`a*WMQ&`NW+B-+{DW+q zxM-zBmJX5HgR6XnEStE1v~Q>Y*)_5N*)wqgY1POFWX;H5WW~r|WWB^zOZ*mGsu+nZ zM;46yMMH-y7~3!MRz7Ac#ssh}!;D}XMwVjR#Vo}ZjC{tHi}{T07Zbo%j08Z)l`RwB zD~rasXS+rsXM0BeWIIOwWcx+_WV=Pa%l)CP7veEnEwUI}EAl5>De@;revmy_}uQ7ZJ2@}Kl@HPhZRHQt%7ta3_PVIaa+ireDYC8}b!brf48 z7)W<3one0pgMJQL2(fM$i0V#|!+F1RODKpyv&{cjQvX+% z48((f*9GIbgaVa1x>4Ox=2x1YTvC)~O z5OMrcFG@3A-3;t2Er-J~Ft|iOwrl$_H`j;i5IXK>m^z()t7FIr9-SH3zkMJU1c-6` zYLoP-_|*g1uQu5FDt`4~&Z|{2^NU~IXTLgy7y9XsS}Se5DQ%%Mhz;&37-np=Gl=cw zsR6c+8NlW)MgYx9W#I#7vzo#Qkc$%_8z%rR&I3zi4fO**ue)spErh9cCd!kSfj0H6BwJHtr6Sy!OI?{%H@EogiC;&Bs0u2u#ut@)-7|R&g zkm52xE|&qaxeS2I0Q`tkKx(M5%zeMwN%V7gK@1$Kt>$ zG+d)8W{^Yyzs{UL+>lxtA@r<poT;J4S_Z4=o$m46kaBlQE13n>rLt;1%YYFdZ0aA zDe5oOg##lX9N%Q~y{1gyg-Z%-F+)-?lno8Z+SCwfA&<(kHt6Znv>{`Hw8^2RxY8rS!2tq_;4pwAHUxm8GJqpA1OQz$p3HB8CpTb7UgWRYAPv`+vJzch;rq8o{-~;p z6!42t9eSKEMzvVsy{4Q6!RUFydsM;*@73z8ws?KM@E%GQhxe!eghjb;c7TwDhYCP= z~02gOsDuY2OqyV`{0kV+-;375Lu}aFM1UFrz1hSA4z(q>#SllCQMih5u zo*UMndAIo0JU47`{y2goLJ)uQpQ=2`SBbLppN1+fuNwe4ye5#%764qf#6r<%45x4c zt*HiRM{ous2V|;Riw*IaY0T`9YN`Qr-$prPLHI84zXzQjr4%1^FW?%a`+Ah zQw|?PHPtA!fb94zHB^aFn88;Ql=4~XKn*^?RUsY#z4TesIspUNX8}O^EGWS~3#$pe z$#s{WR3eZyj^`s;Oyu#NVkoMm$03>GmaKeY1W`B2;f$lWUtLlOtnWYIk!E&v$DTjcd7*n%;~hh zi#2y}QZ1#fn;h+rrG2Ske8QfsIw*I+h@(Nv<56Qyk#Q_s_s8AUL|73$$ys9PPC}gD5ZyObp6?+fHIQrVhbh0*@AX4666jLQ&M28zkq#Hll$WC06Mn@U=tU!bqCF2(CwB{MMzW@aGpE%T2@2rJ`ap!*C2pmDjz83?EnY5>(T5;+EtgS26i zn#|B3$(cLO?SM-`oi5c8-a@U(NHKphiKUtn3dA)5RVt?|MBcWu#{+!h?H{toQJ{De zh%81cB*t2T+6t09vzB)>ae7H6ZPK<7Sy<{~vN=RT*$T0?i13n3x!%mmK!EX1DFyMX z6}sItHiE1JB-dpcB05~gImN0ds|)CyJvKYDb#e{uGf1yav`~lb1G*L9bV7>tLG`A_ zk7@sOtvNAlpWQ#y*nT-OorpZ0&IBh@p0lpC`l79^k?}E1vUB6(tRD9eKRc`v+XX zrh%8YC$-8IilbDJuMguLZyFC|m*6?<2p(goLU>DPDa2VP0WCoNgHL^AsE5%u{I=&KP$tpF9P+XC^m}wF!X_d_T8sz<~65I;+ML?V; zp%O@CH0q$+Ko*BYkhZ1bEOf%(rQeF8)U)OW5^7olV-wFKs4F}+n)xVmOyA)7JXn6@1Y9AmIU{y~wWvn%I#wzu_>g6kS8Ce_ET6+pDN~CbcUdW%AD9`nQN#V;lZ3rDLpd&B3W6ksW3m_(Wo^QlqEAnrf>mDH$&1sL~}7Jbe%|sml15C zxj!qBOxB6b0Y!`Y#h^tuJWv8g%RKVN;kM#1ZPHqZRHV|!%4KQn)*I5;wU=V>)LeH_ zdGIF4U5Y7_;nBkX+L&VtnE}!wF0)0<01m!@1TV#uIWe8!^uD?wq0jP&N@@>c*0Wx{ zB^JJXcZur6&W#$a)6Pvk0v+`uqC|R5qMgnQjqKlkp6< zsKRrZGb+#T7FAe%x^#;w?B6N32ye!2QHA{_)S;fZMW_&s5vZZmB>5w8i|~HNbJr~* zl!jXbLhOi8NV{$ACK+y#tb=ZYbc+a9;1=;K#3FNh{y@&= zT<%%dErO0{Jtz;7MQNj2n76%{qtA^rR+BRXnL3JoQaW1Z4M+>t(J~wDUFv9=2b(x_ zK?aP9X|VFbo311}iVE>OKB#9q{*mY?C}%u(b(ByVItqtgh7Eu$Uq`_ej0=X2&i9(u zQTIiPMc7R;bd(D3qs37KmYQnGUH(cdp_~`FV7H+Q>RIjRSBB>I4RhSe3U3U^H~q<- z%W*3!y(dvtyV%2&ADI|Rd3s=g>t_(i@-qma{fu;EqLIc4kmI|6Sq@GBT%3vb2nM+h z5rJH!ZW1MxagiF4iS#BWaMMLfAglERaFJS(3C>3>mV+D-st!?jv-s5<5vn%Ho+^Gd zGcr+S*_%Hy!9EBThPG!#CI%^asW!-o7aW!;y)y5t)$6+f!r$=-kKzKn0Nr zcKGuJL`5db7|`9lY}BhdGEqsTUDp6|m_;CqSp?9`LX4)VA`^qyf2DFUK|`BF*r0bk zGKup289u)!c86}L4p|qr4?0BqCoItmwtXstG^=)L`&8H>*8a&Ld~ap@!0rZ?7Cn!b zZ7PFxw%uu!Og^L^iR}Z*8P8qYhfo@}4+u&B1X%NJA8^ICedc=&N+SIe=SBD@PLmAV zhp0%~hkhylgn#AQKKx3T{t5MLeC%bdJc#of&DHM}o6qL+VzG$d8plbkbM0N77A0;0 zfHm;W1f6NA&qg#3Fla78Z@2T07E2%20UMSR2oO=4_h1h!s;T1(@{$_U_#5eWw0WNw z+^JT`HCsgY%GR63SrzXJClAk7=#FDZc_E;#aPs(`#+e-z>Ix%I5PA}*RyYkBeULLi z>1A^&VZ?{xQ^7b)rm+LWR@6?+#P3IdF1^!Nhec|F)9b;8jxWW5d zieJt3chFkb)FY5%y%5NeJOqyV@`O@F7s8KA{IlH>0*IH|Gt)f|7P$(bO3E(1i92I#4 z38iJwNejqaU(8KoK<79rL?Pc%Y4Vv5`8_Kgm7GI2uyD@ZibFS2X$J&ynFWx|EC4jK zj7?)hL$Ra6@}oCy4bl4CFt5)od;wD~p5a^y7}r`hVU8tBmGaCCdHO{oYpK$mRx=hY zW#v%E8rCWG$q@P|jG{$L5YJe&Y;uwzH5m=Z4O^tZOKXSf=oUcvhUagh2y46RMN7O~ zuxKgkLzZ3zwGbuhe{+@Mx@Hfgg#SoO_t7%12)81=o|}-+%yzQn`|hx<+}lp!)pTBYyrS!OB_5# z!`%KOkc-oe^HLcXXCf5M!IVcqAO|UdtcnuAMe5pQyo{i2GTbbtO$KzXO$JbbO~%{F z^Lw_)CPS}ko2;60m6`y#%mT<}766)AhD}x-PHZxgA8kWbX%E?Ol@f}2w#llnXJUM? zDh!*9_tMMF`Q=`1GOirzNQq=}uR1Pjr+%SLR;A5~ZX#KecZ5=t(Qw=-o2<&VDZ9%A zWu|Zf8&O=4O;)E}jd_V=I9vdAVw+6TlJ!7)Xp#giCQJrewoOJ``Q<1uRO9%r+FhQq z$!e&@!fdiSP^0N8Gz|1=KR!$`sv7~=CPN8nlL5dsnLIoJZ*tu^y%e?5lQs5e#l{>!Y;IF?=<{YzF} zWG;G><_g<=gfWt{!z|A=mbnLuI09p77a@>LFLr^SZYjXT#*Z~K7B0;cU}BpojVXKh zEx^O3mY(Zmb_nHlxWlmH4O0oj8?MORi+Ejo!+EGDAD2y7Q=y6h+O95Dax#R`9uNH2p|u)R*tGSbYV=gBfS zPC$XJf*Q*Bll);UgIDA-x&1t~3=Wj$GI$lsxODmi-YQrIXPkse?Ov?R^BN>xrRh>- zlNae67rRO3GC0>kw^66*(&4-AToCVGB!dx}@1Ni$cz6Gl`W_gYuDStbL#_|@E1vj(;m@qjl4JD)qOMIgs*Bar2`5kR|b zsR#|&kiwbHC!E1E=Tz&aNxfgGd+vXBzMMQTQ9njGvX z?vb1bO|$p?i%m9Oi>W#yM6Nx?01hm&n_sYhQKrChVdyo0^ssD4)uUTDVzYgI03S80^s5_LOsLj=mkJ7Qh;ov0JunWegdHfE(4# zI3*vi7sRAg&6L zi`VD#qENEfi=qM$h5XHqR3P@EYJBRM8{%{Z*<6Q*&w$}CVkmN^7X{Q%BeE%KoIuts z(%Ap0akQXIFRI1|HYhI&ZzfoHxf69Tl8I3v8ZuBrsZa7p;zi;8jOXORm}kHcO2dn) z4G*&yMac5KC`l@DhFbHz1_@^`%6+jv)g;4k!c$B&QI@&>}oaktW%mb$9 zNwh;J^&{1S<~`b{Z6*E74UZBWKX>(%P#St#so)FQ6zu@Ad_9#o4LzOjHLa)ai?k`( zZjzy=vJRxD^h-rM_*Z_kgR0$~o&u*Q@F#eR zUv+%aIIJPR1x8<*gy?2}fiOR;k@il&0M|Pqkma2aKzk?YutqJNVhfPt@iYLkaRT7t zOdL-z$aSL#p2sOL- zoTMW{yifxBt|Hww4z|j8L?soOY69dk1|XX;0Jw}v;t}a@M>YX+aROxH1i;0ahy@z$ ziUomOqyX7S0dSF~;t?FErZ^7ABXGB<@d)5c#UlVKh)2xx&CkMk1iDtoBk+k!Cy+S| zki#(oSsWvP=9n3es3f}=r5x$FfI6%l>3`)xI(9Jj+$%EpC07qf0vCAT5wPXEr*x)7 zLJ5wX86)70rZPr=p9_l-aCJ#l;GS}eXwJngWfY@<_?|}oH}vRvR*XQdVE~Ct4^er< zRGPh0=_n&XM&5A-2Jw=j&)vreD8D8*Z$;INCRu8lYLn`qn4o;BA_&x%RG4maVgz(J zzZ_cXe3T0p&vf?7-KQ8+W}Ncy%QCN+0Mf$;-~ehx0O{caAU%AZ%;|xwv^+x!mDh8B zjkhFSUySj5Pg*9+g6*7GtCt|s2Os5QU_&30c0;ElC+h_k6FR!=-b~bxdA_bL=$9FuG+ObQ_d&3P<6f!ZJL_2yG^0or=dIdBHt-q!aHRRfal%E>7$e-O4ieW-tRwv-W_m#%zirSe zB}a(U%d(0%D0`+ey|**Et%=XK^EuaTyiO>TfUaM0QETmnEn8P?Sh;!&Ixg>=YYeS3 zv(s}Uv!#tYF7AxXoj7(QwioiAJkYb zw%Vm@Bo~w8bF*WU_zrlCq*5B6+%-1R9w(jw+w2znHj$+YY}~nXrZa1x0EW@C$J#R{ zXu5-WZiHyzn<1$;DkaFx*xvRm%%>TbU}`yz&FvYRXitn-Ed_k@O6WOB`z__*nm0m`gE_Yo(bv zTl{8rw?`-Up}SVhqWBzSVsgS|#i*v<9^b;nO@5SSW=K~cZSq-0hu{NC?U|AGXlDyL za8|ucJXT;E9aGqZy6o98-QG+Uazzw6F}7>>Y<{Jgb)~&Cdsaj4CLjw23kbZbGc~*0 z#Yzv>5#F=MA&8qhqZoN(WhEggNnU9=+Wp_}By8O()K(~~qw#yu8K z7kGO9UP6#LEz!$ccjLPqq?~5$0e44LfNbtcIRkhLjEhmT@eujBnc2xb@$5zN108PQ zpyos!OP!g@W@RpzYHY$`1;pxW!ePC}aGqSG(NP;rru#kZv5CPJl2y%;Su0|tZQE$d z?8k{F6SXDVtqHf}u4x%%8*y1`o@2Zl<(hFh=9qP2gh?BRN;t&v1%XYI&?R&$3hH=0 z6;dXRY~$F3*+k1%#cL4Y>9HMivz>kie?_{rSb?-kRk;?j-KCg`@>jnmi00xYEdJnx zn6ZiN+wpBI`lboldX|}Wvb}Qx@9db{xf9GT6Zed_Y$NYvWpHYv&v=ixxwOP11=s@( z1ksVsS{Q@-Q7Y+$(e2xpFk6x)&@nP+l`gwn$`0-ZlH&Y6xnQ#trLoY$Nhsk@suY$C zc#+XP5}WPMG|Hlk;<1SVtFLmL-GyOh?>B`x+X-G6W{#4jFlRZ(3&TsnwxmatzCkD{ zgdr6MA1joc0+c?(CR0yMAmt2EA5jNnskmA>Y9c>*o`M`_K^Ie;r4S>>U#KABFH|rV z4_>9P11;J$Fb#Vd=m3Hg9j)hRKURd)NJlL*hXeE3bZ2&MdV(4s4-D`xjPq>F3hrpn zba)zE1EWPxhBSc14_KFCOfyq^S9NAarpKmGdP`?krsq^kmkEUCK(|vFJ(JtM97BXj z)H+0mRC81fK`u#f%I=^D)~YX%ZQI5lR8wdPz6aJ$FJo3tBTp{5530#X zR2jBMu-?W!yQ5Bam|{>H0yR0H?Z#&mX|s8ma^Lv|!?MZwfw(JWA1me1@99aHvYYZ= zl;i30625k`L{hzsg@`1b@L)emjkApTh7{CLTt$z{QYnsIQaP0~ZWrc!KPpOp^eG1t zdurP$s%@z*7_cjC$=QGuuKoqR#L|Y1I}}H&AZk>u;=_eI;8Z$aBUG*?@5!OsUM}eW z&iG7+f6$H5fJCnoiB%(74MYYhz(%hy*(wYpeULt6=|2BauleTqd==Y zJ>5PKj|D`1YkPW^9x+;aSewZl3-XJn#)5d2VVYRIkyLI-HJ>UHR}QPGbWeZgsw(edkgKZrnOarN<(4rt$zXfjWNNxxX5|Xg ztz2fU@fT)f6-pRm^e?*dwC#w?fF96+qGo-5#(dMp!??IVhWRXW?uVr1`o$KW4zRH+ z)9^K1U%3r5XQN!k+teg_ikES$a49u0SIlqk$XO+sDF&uH?a_W3>@Y1;J@y~K%uM(4 zmOn5|OG>W#r1)Wo2UT3o+`0+Y46cE3yKHGSAIA+#+MOV#7H1UD;B4VE1XD#m4oNSK zoOE4procK#=Vxi?=w$qpKtxnm(3~)^{IwjL5AeZ5t2n(PYmRsoc8gK7^D?{$-3;7x z>CiE9HF>$G91&LY&!E8HQtE+%lTc)0r{4wz_VIh5;N%_UQ)u!>Tza73WVpE$NWSPG zTgqXBwsbmNU2Onzhyk2M3}6l^ zSi}G2Gy|rMJD9|vP7_cvfb(bdz z^{v*^VpG5#%p88J*ZGuE#)9d}5(_<0#oHWHjFST^b`F_ONMxw7GU2eMGBF)N0yslS z(8C#m1Yn^cC7FnImEGtN12~Hqz-g%ku#i}yka27Ry)6@Vgq(-@mCU4n3 zlN|>xb6ywvU+$~qgH7wh$ZE`+t}t0~uA%F9)CO1pl{uoi9ZRkk^7_+^X_l~U!UhS` zPh~oyPI0CqY!}l`)$K@>Vwlt4i&c&Vo9dm~jj8eJtCTyP4Ovn7qju+jVpiu6IMq1> z)Sbf>&{0=SkgkNDk54s$^cybIELPOjGLe2t#c8_Yy4qdq41JfE_U#@U@AU6%Bi>?2 zf#e<`pdE+?-l{qsfhg#(FFodxGM|ngsX%Y?NE^FxXjeT_A7*svXt4IAbcKe8cpjFS zGukH{$n_H91e5iXqn&Yt1(C25&)wK4rj+`S&}lUUxPbcoV{2)FMNXauQq@7NZZD32DJ3;*TnHHNe zpZm}y>C~55dk`-@#pxO^o}{HPFPhM$FfWe$sbM9j8__el-N?@<&dVzhdnd<6CYE6snpHH zb=@R=l}#H~-|z*$lUC~@Ej-n65<0&}!}XOa$7>rXm;F@DgS3O;km4k$hZ!fKYO&=p zPn?7~U`(v3ij$npQ}g68bwb>rG&ozf5}~K9>AC_8m11v%4Xvj&4m|MIg<|VT)9o?v zz^702K%u}TqISr3a~t@??;a==xJ5RFCV#Z82MY5C9{8Lj6?mv5ZVo=#qKubT17K~0 z033Vg0Bds-U=?@(P@9`px1|FQwZzRai2@fU~FpoTdg~ zAvGiLFqqiw1~v3z7BvE=s1dM`nj3gX#IaeW-7h@|OLq~5!q3qZ!~hD^$*4PTYv`fw z1*)V%1gxa&i1id<;4`;dbztc+!cbM|a(WD;xrI7PMi{DU-y09XvFf2KGbIM#w8Q{d zC^1Qd0UyhWx9lW(-UK*983>#v24EqvMD?2Zj7}CcfU~FpoTdg~A+^E?1MhdGo|8Kz z`Izo{6E=-)Y$PKt!cqLi%|(hZfPN~%0N4T|429ofk}4-745&9`XZrvv5M?Fgmdqm?S-ByGuvhpna1EdHjZi<$Mq=JvB|raIe{@ZWicz)v8jWyr12_mvB_t$&X>1{ zQVYpj1Rkuz04l~Xf6L*R$k*!;EU zuJkSy@PSs(REClh$UShdbeg?0KyH_|H>$uEpw0A(Joi58t#gNroCU5KOf6nY81GE% zn%zyCf9VutYAgLw{D%uHcj%(#_SPZWlp}iJh7>)EM+S0Dzs@WLVI6oT%JD<85K>&T zwlslft$N)^NmB1NYeqPPTGHMzgVxlCmXwxLI>unRGUQg97sGb$Y4@L&qNz4$!IWNF zq7&(}OIbBTR1FnN9c~|Q_JWDG1j3g~sIU(j}?18^~HFk92)2DxZuvWGp$+d<2#dq%hQs&3RvpG7b-G_2f-p`yS^M{lL3F^| zfdkMHx?+RM$T)WE_7hiGw@9+wYJn*m)7t}=meSgqwMQ_PLy}6SJ4C{{gsPY*nA1_o z1F9LsvQgu&_E1-1u$I-e#1gh=yrq{L4ux`*jHH`B4@tD>FH=IXohsQ!iG7k;Qc7q@ zqNq{`i*R*nj!3dRv7)Ti+k3gmsD4K6GfLyw32I0G)Z{+Z-dO!dCugy?OoPD$ADMt^ z$~go*M;ilNF=XuV&SdHk9wG9^2bTr19)~b2SqQBmDnnUg)+QZA41;IfCcuZ56CFM+EJy^4l3${#D0qxhYw;J z&j9bkX)=2C)AehTno<$Rz9gk_IG%HoO>1@!`PDn;CU~E7OZQU0bPe?_Eko+FMz(BS zy?OP<*6Mq$ZmryS{)Vm8q?uL+#|u`^2MmgEv53v@n* z-Y`uUnB1lIcBX<8G=jd3$l;WS0nwFH0}=?U;R5 zYr&!EG>%J+Kvp-$m9qjyNReBt-L3hkIM}3De_|mlh&$z@;%H+ERc_2F9}z_;W!Di~ zvmG2r8d#?Xw%l?&(4m|f=W@&OxQB91nhH)eqruCXv$N7vGP*zaL|1v7vx=b_71GS7 zmVvHhfE*xsMR6fCOu+{-@|sxQ@)S_9TWShkAk&jJ0mGxf+YUCeawRrAtU9l9_#1E> zpK8Cxn;FRw;)k%|aIItN2Sgp21xgHsDW_I_FyEmN8%AY5gw|A?vOW<`v8n}tiaD3n zju_n@P6h8j4RqK^ikn0%bp{ez{y_6kD_PgF+&+Rjk^e*WE0_6y-S8|NP%0dlWg|&A zhH1PEOvU&%>0=2<8p^5*GDHB6>qc^v(;AF&XX!w!Ib5QZvUf6S-y)IEfWred<`HfV z2mVR8^yIC?l_Vsiu3e6ZWgUPZQ#WUN9mLSs#U?4#2XrAFwp1iBpd(ebK%Hg3p7&$y#CGs$6 ztSQ**#BEn2o~{#JiL;O&5~HM#bpb%-+LbMF9QLBlNZx2c^jQq;b1P&4Egx0-1}x!T zpn4SSRjO7Dk<-xbZaq z2%13(&=e`a3Q6Us`rt!;=*Au-ut19p`Tn=2`cxV;W%N+@0_~BhKJu`io>P4)!yMBh zEIpInbI=)Sm zWu&0B^vO5w74=_BPA(+%$pbm6;G@oTn!hehchbGWE86d-hx~y3YE0czU(1-KR*DH z|2FldWIef2`4Nz6E$)ikg0gE+u&WpdVRV8ZRsNF1zaa<$TB$~wQ4kQ8&)Kc4@^-Hb zw=y@7=-)w*7CkF|qsb5udG3iwpqAGGW$H#pK5M?vBy5lfx8 z0S!h*6r|dq?-^F>sFR9Xpdt*>4bQ>>6*8kBj70LEIA%vda`2f^5Hw7-Cqo3t^%_*o zWntm&$tc)m2!b=47hmFYq8W9hVPpAj$FmfwqOmO(6%TDGRQbbP zE+U?>l0H?#oNg!05KZMAbD#1;T1KCCr~h4j=8onwrNhl(R6uEeQ_X|w5!;+flAD%7 zA|}nTm1fORd^UVo@9~J#z6mX-dlma^HUJyONRa4!bC^|r*vbw<#BEruDNDxTR?f=9 zY5>r6BxfTDdFmEq>8Y*j!w7Y9O_Zh&Q&4tTw=(N}N6!gC%p6(aVqq zI`cnXg<=vMfTUr~2|!XOWZ>vh`^)q-ToQ$%2up1t0Z21BI<7cE#} z5|-8WMU(N8(;TeR0m$rqgz5`D+0jY$Z5uS<&;pQEI{=B>ZZ;9-?;%u`&TepA=|lh! zhLs^pTMQYPEjC(kt6FFls2)WD$Z~N2l5Mvh!Vd+Z6OsnmA`WpjdJN8V9e^wkQxva< zHWY+V>^8_RMD{>o-TVx-0;&R#fN4)vi&;(p zvJppLOiF-C-wg7bPy#eX39v#+NlXNNqup=7^Kj38Kem6 zk|J0kse%9`?-%YtJ_@ub(Vz&r#oG)`u>>@O5}+wcfE7|ol&w;a1CS;u zKr=`Inj!^QA*rGOB>NEf5+es7aYF&fW?=xb!uIy!1Rz1s4L}04fB>S3LrZl@4TcM5`uc>%~~MgWp07n1tKHi<2b zvK4?V>i}dqj(V}iRPjJYx$wXWK;nT6K;nTFfRxq}UQCE094QSVZT-i!sF8>9ABzUC z37sDfpla$4%86;h1kZe5>KDCV@2e?sWFbK8i)S~!>BkKvu~J3#(;<=&zy}?- zzsl?RGTuiYorLoPGM49$dNLFNfW-GlAsO!*(t9pqVH~1n5h+;%gwp84fdsMw=X6gV zU=jiVp@jSM#QXS^T(mif_YH9bkh6EG;nXcI4v3c(?;|7$$LvTzH5;E93qZq?`Z~Fl zXf6cJ=mP`-Djc!NTqj5iQI3WzIN;VbX4XAz@ahm(ksfx9nYA*7Iafow#!LE|bU^+Z z1o*C(g9vwKK^~o{U{`ApRM1(2z-KxjT=S2?at;FmTQ=}9011ed7W;J&&jwC#PF0yc ziIS9}$2_ahh;SO0*0m=j>N^DXmlE9XLLg7WH5{t{u8%9o@O;rn6^ypYuRs)6UKXb= z1>57Sa%y*G6pmMCbQn&LR!~yIu{WSb=u1VS2DQ2~cX8&O?3_i4hb5$kj0(l1jg1pV zz>7}Q#%av*u*+&r&Rv#1Wd*=wgD`9j(aH%J!+~Pl$^_F|b)g4p)oAl(>4co)qGi*D z*|{O2hIK^@ray#^aTE|*NVUm&PIaZnD3{2Ne3znVsJeRj5MyCf4R-}3DV+{9ouTuV|U9U2C#C1En)zti2+zhEb+J-%{XRfQ3E)O8o+64 z02We9B3$S$?Mj-|2%JHUz$t13ETonn9H=*moq0XQu&02WG2 z9O*(AW{M}kS>g$BniznE#1hqO4##mdOBn#pq6To98i0k=3gTVhGSA@XIcddk#0%Y7 zlycYLJv^@A+EdCM(|1B%4C_ATHOz~J#Y!P#UZ^*Q?c$VkDR=Ra-Ekz+>>NKp>6 zI){L|b8uug9s8V~@QG+T@C6{vK3t>Z9o$x74XFpQXQgxokJy!>cP(#(-_o{R>^-Ts z)J_8+w&-ZEHqo^$Gt8@Pi{MD3ElG-LR;((^b}ooqF}i}#RoCcrH|qS^L#i8fzvL^? z&vbveJHgiO{A4P4U>=Oz)l|^&lNWlfcD66ak+-xjS22uPEiB2&Yb0#ip-P<;4|%3% zi;~-rkTy4@Ytl9Ibh^oDIwNP6l#CBBR)-@u4%L^dat;o(kfLJ50;#X@S;-6ax{69`<6Ot#q_P=uWyS;eYzksvHN!`i@31e| z#iu1SU3Loe$4&|iPil%mfuqdDGhrr$0^`%6z{lwHK%u|@wJ9`tFLDnQ=J(~Q6s%Fc zobfG=3PxT1`6c699013@obfFVfR!(2e2c?kYHFiYV<<5wO=19R6VD_Du%3PrVgPC@ zB9mBRP&OKgL1|J0IExyF#ZUK9z8ouQ@4lQ&Sf~R_PYDYc2aPB>X*UgxlmsDtxoW(@4r6Vs zdQE^c*c;wqesOY><$WHOv-G6l95fv={n)?DPFN>2i zZ7n>;tkk@%@#2DaBB61JWx^D$09J!=Oke_}D%0_9bgm>DDtxnO=SoVN&gp;gA(;>#Re(>JOMO$= zI92k0{NPDu107pON9D)qEOfh{ZuvMvc^D-p`7Hi9lzi%;OvBOVPdc-bIw`ccM-#!4 z<=nF=ZAmqcrKGba>{BT<2J2W#l2@>alVSAVJ7?gu13;ao;CCgMTO z8WHJ9JPyiGSc8gFAt$M-%iU2`jzeXJhg;>w@M2|F72slPTl>j6hErq?6yRb5AcZS8 zd#V5vnU1nkiMRQ2VDPWII4~9LDh^Bqoj7o1kUH5`tVKDv4zyB@)LlTb2Ey_=%UXrc zXv>hb?s7OQWeTjaoOicpyTU;@(i)sxhqq-_7y<4%_9wC7p|!6PPir!fe{k5z;jD00 z2oLXQ9OrO?491OQ_a-PI4h;Ne4krq64kr*hMq!oDd`wu?0zf(hpk-CL%KJu>9L~5& z#8Nl^(%#33S9P7h4@_3nLjHfq5K|WiRLjcYBqRyP>>SP(H=7TAbmA+@%JD zCB37w%uB<1{ecCkmX{3N<)BrLPv*+sv<4bo?dfEG(9YAc`6V1wlQMqF=9&cGf}!+m zQIM;Lu2<3K3GA75VVe|)|8+p;vT?RTSgz}O6pKHtSXXnPD zF+3hnCsUxz4WU%bU9Rdo)_NSYzF#eCVl0Wsnsu=zBH7?rd$MtQ@1`Yfx_Q*Jxb8{I zNp=dr?i^^0LsHh&V7fs4DcJOh`WU&Gy7p3lX+@>U$B_0Ape+dh5*332M{RnbP!Ixk zDAY+8dZ5t#iV7cW&;x~eS5)M&g>pp&eW9~vAVoToLtUg}p9I$7H3F;13W4Q{3ITO^ zO$%Fgc3iU>=L1>909Jukix|LZVgMErGs3#{c>Ttr25=TNfYa0fETm?vs5ImC8;csi zS=0bdQvLCvX-qfYZbPEF_kw z-f%r$zpow50 zLhAdlS?dS*79|{u%)BfOY{%MW_c zs+sPW-0+C(CMwxg*n@F8agSP~yM1B{2}#J~c2TWVL$$$A;swg`x%5|gk$xdm40{{M z_zT7?T-^meYMgGM0v~wW#%3N^RckcNa0FJPcxxTi-wAvSvHi_~4|+(OS3$-Ke1H-` z?SrdOhyx!$Y*Jz`LZ18+^9l-9QHS<}npJ5yG4}q|xK;DVKImOtFBSYiWdH#YLtN(x zen>2`6TlwImoU!l&p~KLKd5oCO&NkfB2!Z$6OSSs0bcy5UCyX*V~^GvqM$}DQ=!ZH zNK{tnGOyWY^kbKiO#Xz&0u;J3NTE+1$sAOvhl~J`JT~K%WTIxKno%55W&_|WPWvpC zs&HV26&j6`k<39lt<8vJ4$^LP;I|@~gH0L9tZ41g0$Xj!9dnvhEdW#`QxBJ_%2iG~ zG9sC}N%LznUe$Hdk<1FmHmiDbd=?JOj8-I*kR%+lbr~EZ3NAiVm(j4yP$eH)t3#EV zEwC(%rCbAQ#5;6IP7e{vTHyhbo-J0qkdN2U{{1p z;ZITkwWWEU3T8i+T1Txp#CRcDgS6T#4R=|yZsLW^1~nGwdefC=Sy}g-wuAHBG}Jw5 z8g)zoI9sF)aWb-{8OqV|ijkeKt0>>$9O^E-8BMph9O@>Y@zO&Op&&#-?MT|tD|F18`at0Mw$;YM=r+5x;UHBjU%i4{JhVg~-u>%&uX> z?BZJ;@vFp{@9~@ROZx?6detYEqYy{+P~?m2syrbegsd) z5G(NLdI|yRz6F9qiy;C5t7s1~#9~(*yp|Hdu6T_T(0X>o)fQR)bVFAM!`1lE2OV3h zD-)UJ05Kdk#`p$bv#whaFN&A(aD)0gt~f$w7*k|yO??OgWGq)4^@Mi>{H808LhOnI zvFY@4Y>iXCS~0JnNR+MwG8CYb{8N>NKR_89i8l^fvOtz6ZRZuyySiS=9YZo;wf|~c^eMHWzc)=;kc~weoL1t#F0nf@(9s95|^vQ9d3flHR8;h z3IRmN+?+1nNk`*yxVYIZa5-9h@ff;zUp*F=Ki(RbRbKrzxLhID z(d7~1;BmNICGLwl``3sE++K(;fY?L10Uq!NA{3G6!>_}{;o=B!q&Q04MBEgxn~9r? zqs1-6G2&QUZz*ntGPf4D5y#=t9F%7l{{(mxz~&mx-5)SBO`NSBY1P*NE4O z*NNAQH;6ZiH;Ffkw}`ijw~4olcZhe2cR{$`Bi<|CC*ChUAU-HQBt9%YBCZu56(18H z7oQNH6rVz?KaKi+MtoL$PFyEGFTTJn|DyO3pkEeW5nom9{~E4e$G_)6Qogl-zW)aB zd=qa(u@rp!dM^jxL7l%Vz9+tq>kq^a#gD{~AsastKQ-jzXL$B={QHIYrTCTjwfK$r zEx7YL@q6(H@kj9|@n`WD@mDVNZlUgv!Sz`0mMC{C@7CUJyyLvvdbjg#ub$ok*E@R0 zdw23m-U;5Fy%W8Yyt{ZOdv^u=XlU@|3+TlgmIm*J2Jg(|bicR6JH_DHrXUe&94B-=w?-D^PV zn%=N?hPTWk**+6I%^EY$V%c8q-OanZx57KyTZyU57pw7ajdzZBuD2HNk!;_?yC;5) zi*@RLJ+2#Awl{j4yz{)x-WG4GcfNXh0j?K%7kT&c?u}nB$8`59?zimmcbj(~Z#(8u zUtGV(-}`zr0=K*`i2H#*ZEpwuA3^&@y^gmNzjvwD@5Xh^yV$$L8~64AKH*JzQ{JWO z=`^l0-mEu=Cwskp-hS_ZcThdM4A=X6mwONJ9_U@+5pL?U2YEEwKiGSS_fS>tN?af2 zJ=}YQ_ek$i`2BNO6EIuwM;xZP{?XoJyvKTv^B(VAS^P-D%y^yr;uLdWLsH8Iw9}SL9n2&-9+odyV&6aO()zV!!N(Tj{atb#YH!U+uB1 zv5L4UXJW}wJyyNmdxQ5z?@ivDd8~Si_g3$1-rK!*c<=Py<-Hr4@E-5I-ut}w^H}u( za58JG`k?nA@53nj5${^>qu$57k9(i+K8gEJ;oqmd&v>8pK8H7Hw7SmwJbsOfFR1%3 z;`$};%P991@2lR|ysvxT@V@DNOFjKIuHW&#>wVArzV`#~hu)98AA3LXe(L?q`?>cE z@0Z@MykC32@qX+5&ig$|UIiQeF+KJ14ND{PXX$5pfAIe3{mJ{Y_ZRQ4-ru~xd;jqM z>HQ1C1L?pjxFtX8i9i2)I$+P&p6~mCANr9`^L3wpn18r`gny)elz$WdroJz3=HJ{u z+P{TQ^Yt69l%D=UL8~-@}w*Kw>+xvI$@8}=zlhmIIi}XtL>YeHkif6QA-F|5V@fDVO?bpYnUK zyT84lzE5lNX@2*X_kV{c=4>|L|4^Ln5Bhp8)AFHbv$9|DtA5QNVok354ZrD=F)SD{aujH-Ts(=v406m_c-J&Yt-Dp(tVb<$Di=mdz1c@e<|La#=jYV z)}QnDDtX=K@5irkK^`MX_W|4;Wa+-lzrTOE{{a7i{uTa%ROtuf`Ve3Hm0vtcAnGRj zGCcw(UghB|2h4=9dWj>Y~kv|__?f=aG zx&I6Qm;SH(U;DrDf9wCw|GobQ|BtK#S7MoqJjjLfC#?g2x`FF}Jv0B=|BL@u|8M@^ zSqJ{%|I_~$>i`xf0=SkU2*Mx=`U3JG4-4{i;P8NS;E3SJ;Hcmx!A*mk1vkgLN8{fu zf@6YXgInTFnu~80+#0{e#ckC6ak$<#ARV|}aQk4XcZcAP!STVJ)YB5KCj@s6P7F>8 z?h>3F+%@PAmIS8+rv^&{lKOR9SFfk_)x(d^T3`K)TwkRr2+_mW%JtPZ!%{f@pV*R#aDc*U;q(@qW3!`cJvOdJ{w|X?^u(SPK|3#*J8 z>#Kws>#GAW{;VGwJ%ZoSBS^R_0?l?p24tX_;qG*R@WkLr z!IOih1WygF37&>tKRvh-bNoSzBiG+{J{>K2M(|8-)w6y^4PF+!9KTnl~;-&~S2_WzbN&`A2K;ML5B*MJYN@WbFo!H@C$C&5pHp9Mb;eu1aI41N{-I`~cS+u(P> z?}I-mtbfGyPmu3F2Y(6v8vHHzd+-m{$46j5d7vfV|H~RrW0%(Ve+K_T0*Tb}QE&jm ztugL-A$icJ2k*L*z#6>yaO?0k;c?+@!`p?V0k;qD5Z*C7 zKD<*{3Qq{{42&m+Cxv$jPYy`~?i!K?^oL8rQ^Hfjr3&k5xDJG;hl8rekGicuZi?Bj zH;i$;99F_=SPO^3de{h?;c$3HxGX#~JS$ut-Yq2g&Kvn3hS`sv-yM?u_+UkNc1UCY z%5YVdAd@-5%aIYyo;d1#9EFBOD1w!%ny}+!gK)$HI%lOH^OHGZ4tNGW()? z9UF(F(x|+L+fMWP!?~3c+{(#tO40Z^@WWa%G@Ra&^Wvpkc3PGE9jvLRTP3@%%}h9p z`doh{$)3OF!oA_Xm~XB?|_#7TRpR08EdAL45d;#8lVLW=iD134FlJKSB z%XsvBdH9O(mEo(xSBI|&UmLy-7+)X0A$()_CLTTC%%kU9!ncNR3*R2TLt%X;Sa+fg+C5|68;pr^D{{L&%6()}6nH{|NsX{woxb7x_^TeJlv0DC&z2i^%dgJR-~Ei0H`ZsOToq zO(SW~+zi*7M@L7uh>nSljcys;D!O%ao9MXcw$bgP+edeZ?ieNG=Z)F_K0dlSxKmV$ zPKfRtCI0vM@V^gOI&uA-T^H(qpBRw^c2abg=wu};cg3|ol0M0e)B9c$bvujF7^~wr z?ig@NM83zV(bDL&=nKI>bb2%xT^p34ua&48)uN$D`X2SDfnV1JO~wCVT+fKe_gEHb z-{Z{atY~?3x9IK>`5r5xv!j*Ks%UkzCORiN7Z}$@_lWKpt>Y13J&yo~hZ~}e(WdA; zg>^HoTOi$Aqw}K+q6?$M`@V5{mlyTW$8Hbbi+lLq(YEM5(Xrw7=)O@4J$yg(M?2aP zjYOlWhda?u?%`dkFLvWP#yxy-+{2ed)^ z7+uCae1GoY%cBQG4~(ve9;C277}tkHiFZjmSKf029JLn9yL>2*Y*$7Piyp2x^axxZ z8J!zGDtdI3c$bd>H}ky9$3~Bf$g_NWbX6pM&L`k{b@arDJj*937ke&tiu z2>Q?e_vGN|Ulm*vJq@GJ)1zlZ&y1cGJv(|%^xWuq(etAhL@$h96umflN%Yd_Wzox{ zR~VMaH8)~U?v-7SPxE_nuZmtBy(W55@Y?8g(d(l(L~o4V6ulWE)mt#Gyfu1T^!Df- zYNUE+^e!H$-mNs|J-EI%dLQ0>e>_rsAo^hRq3FZWM|h;VHu`AvvFPK`C!$YApNc*W zjGu`<8+|Uijz_A`^GNlD=!?;pqAy2ZQCPo<>(?L+Uyr^KeKY!2^zG<7(RZWoMc&C;Hy--tcAzxS*??i~NB=pU>*|BU_>i9WB-?+g0EzH5W1?_)t<-(h`+_Z`tE z?YJZRj>50&f}8Y7pX;W$-mH&w=jMIdjyt;V7JbL`9ou)yKCjRciX<( z_1(Vj4#0TFzT^Au)K}^wPws?1^5pK^cVgd3eRt_QSz)~^uKj&W`cCOPwQp(PX?+8I Vr}qu^mHR4v)xKKaP@kzW{|CDQ0-XQ= literal 63643 zcmeHw2bd(a(YDmxL?;{p$FZ^TF5E3UVZ(5MeG$&S#O;xMK9A>i=k5kJv9o&#W8;jo zjT6Q>=bSUnIp>^n&e{Ins*<|Zn(p4&h424<`|&;;(_NBErBbORRaHx4+t;7p*s*$Z zq?D@S-;UMmH_*GrvtGY>^%iLv#TAOHpIA)rZ#Nc zavmjKjpt)F%r&Q4=S{cw%*;)7l-j!c;@0?l{H`~(_wJkT#P8AAzUIWtf%yH14RbRG zTa(*c<1=#;G4x1*CdH0gGc(;vUW3gubF=%}(|h9*;pXOiYp&g#+|~p=9d-1!&8xXV z9|Mh%3XVET2ge+xj?wy9HAy5jI!wss=B&~JXz!j}x8ZCR#BXD>t?`A)=9~&miB5Ay zMfQ149bq2l=N8827v@^(NCE7b*{hD4A_{jj=k~Vd*DUPW)0%6{&UD)I?U`v1*PS@u zoZj1-p6{q*c2i4Dk@oaNd%V?IJw0(ji}|QZYc?|LN6;*<$pJw0H$F2tGbfMu|B+#5 zygAv5-=h#Hm@~%%=Ap2;#m=|=DbCVjX6TI(S6yne$$#*oYrmLz9W9w zv|;`B_+{hv3%Fhu(yCZ9I=TOR&C|Jonlsf96{cTDSTfZZqfEwAp#t?2^61ec8TsV_cD5eXg{Q zMj;_ty?R@MaQo`>`Gpd%dD@9*Z9iv6{QilLZ#rx1IvK)T`}Q49GqIX&H)>;1(2rmw>QSlS-lQV7i`^r&(+(vp0{OP5m7^{)MWF}%))$MXMUnw z8|*JFh_Wtus=BMMOU<2G3;@3`FG=rM^_yEodU9adK?m~hZu2{Ce$mkkZ|$t127cUQ ze)pO_-^ag|QrpVJ#rEM6lVj5SPMMt3=642|S`+Pssac2`Nz<$kxHJJ^NK{I57B$3C zia=D2B-)4lNf}8w-~(t>r0PB70}dwu9*Ru|umDK4wA+D@P>wtAOzMOK5IS02kUb8B zvF<&*vkpG<^FAk05VRc#veZf!`+!RT;Mymh6dvHtyC9pEthLgNlSEl(op;H4sbmHF zyOKIxkohjif&*Eg8ukOgO+0`Hsp6oMM<9m);oOJgOwHtRH$B=;WL)DeL{Lm5`CHwo zdy>?>$>ToGNIJ7^o`}s<8L8My_$ehjlii@HZqRf$Xof)CjkAXj%kVOYiAR@q7nth? zb-F?GE{M@D5c)w@5PRHZVXl7IoL;r1*i4Ed)qZG<%S&L6v(AeVPtJ@tX>kSZ3=P+w zE-^h*t8u?O{gXq3;>D1ER$;L*LuyI{~X=SO57Awq%t?mM;yry>>)k+1p zyjG)8)l#E6IEp07F>vtE;nFD{BL~1-ZhfO#tC@_e6uk@_XoN;K1Sn^ioazl9;Siq-~YKDpOD$qP9^( zx_eNXft=Kg%naNt%7A8NX5eO0hPauPGBqI1EvgS(jADrR1T#|jHki85dt{y#wY z`pnZQ9+vjN!G1`DBp(32bS3S9L;b51WWcf_#ymUM8gKLRFEw~psqO>}{&=BhyUMH! zSrm3RJFT^}nV@!H4rooaJDv9amer)=ldb05TFj2_yker{%# zc?)?=0PEVIn1-&Y1+p`25#o7-!6d-dQS%7JAX*nPYnC?Y;UAAxFm11CLHr0#r5oGl zy;58Irc!EVpt+({9vJLjL1YZ`|3|w1KiWSKbFAl#aR<-_*DkQD2WzGIx#o0-_SBf0 znET^1SPtc^&|v~`vFfh={(fY$tQ2)fxkqYUI05o;0+hxH zfRFPKY9I>w8eou*lt3O*0;P}=z(;yGL0TE@LJE+N6reOx0DPneAO~|T7@43Ytvrkl z(d1LyGdZF(I!fz=;-WdCR3EG_TGSIIURyUR!$dAU_w}u`y?TIGIT#>j1>UHP3?dh2 zM$gb_IDmCfbpaVL%rJn;gTt5y_y-wT%D{*&J_F?Q8K5+u0r2@8OBp!Sg%cnjCqQYO z0Qfi)DFg3(qy+Mi5-5d~06x;gUu1rygG z_jwD})(x%s@qMCt@^tfx5+?fb3Y6Y_A2EBRbeB?Pur|7YIWU2pW?%pg_G9gp2xq-I z40`ee2xK><`@8$V_XTXmbe+Gp1O)GEA#E?1*~I8 zQ*nK(6dPI^Lqnuv7hj{M>{X?cOGD*Kf9a0U^(>|}LON7~9Shq5!pVIg&?=y@Bx8L~ z)su2&U>{a==Zk%AoniP2+7-kwVK{M{OAgVxw|lwIH4Ud~q9qlH3;K?UBUylO5S z%A$+%F0&mKWy0x~mPEkBt8lzl<+XC^sWKh<>jlhnT=6a}%86+-K^msihe^FKZnO|@ zyh`TW!YdLhg3Ft!5j8_wVAp14+acFqJAgJ6Cl+FMDWJ?q4A)0Z^(y37mKJV#^6GVm zk*i^1_|oMH>o+S`B1^*+mL({{p&D=KNYG^0lUl4$@(K|RcOB${?25$^Sy^n0ph99| zK^+oy4^iJNPf&@C9%nELL{Mp<#6tp`qm-c1q+tYgXxW0wgp*JWiDcSNt;y@qB7!=U zC8#5;aKV1!O?_k}7F62aQB@$E;PS?MYGfW>nxKwgn^7dFM41s(uFsHz>f;JUGA*&_ zRgzbF&FPLIyUl70b2iSNC1FT*#mTI+U63zf^$|0;hlne9lTA4gv2B3>hlpzgz+A#P zc+*V)Y`TdQ7JB4#-l#oxc`z*23(80|(-2SZA>` zVgQIO0QF&7uWUAT7(LCtmBj~po}mM@~on^9UWmtZn*-XH_c8ypbM8{81in>ZsJ0QTU{8ypkz#>Buq5x=pMLf*ty0au0l z3Wr6Uw^o`=y7gLmTHOI4w8x74a`DvGw=hs z7vijy5;+;Dsww&WfE@?|fRGzE zLi}!=3C=sa6a+cD66BFx2=d6T19@bZft2O`u#N-bF*^(-8#@Z*ksSo`$c_On7CQv2 zfyi2vjEQLN!tPcnj+&r8E;*HEDJLTzh_OfvGPM%NJgi8{R!jTatpok3E@_lUNqbJV zruWY8>*I7(NGo(oILp&+=&ydW3T5Q(OcM>P=wH?nTftw+E+N+V;a96 z%Dve5(k$=uXfJlZ+3*U(*=j~Ih?Q6y{Rip?4q=^3zXw;8#wTH%?Th-8 zD=OP4!}4g|Q;t^#n^*Fh#6>Igx~)A9#|jqDnbW=9L$FKUWM!d5J!{(YogFh9D1@hb ze?>Ix8nCSZr<1C9Uuk;N;>YBATFHme0@#sfTEz6p_&*6Myfw|9)w4G>)?c`zF+SPG zthX>Z*_dccEJ5jXaOTnlcr+IcNgG`>5Nxzm!D#bB(Z+VH-@blpWBoXzm#v{AnjU8g8N#e0)}mjMBEY+d=@l(byh54qsdVyOFMQBkCLrL6zpk z3)B}07eG4NkXfD^h4i>l<-zV1W6O(vfYCRnV>qUuUWqHSQVd4HEJ7wU9)&z{d!3z& zGhU*V2gxABGn@@y@dbkv7e~&aHkxuOSj%CFiIPb|nYxYBG28JN#mg{C;>X01$OBX> z&1X_RBb}XceJjc3PBSW_gz1}BoOo}P$=Z%p1|cKQ7%b##F&5XEQAi#G;R@6Sp^~|C z(PHo_oLR!+S7=NMO8st=fR*Ooga+FN>U2TSJ>$nA9ZWXLdQ(nTNC&b~&$^LH)HE`5 z&~!m=;mRm=N4}?}z@scNLB&OL+!o%_Za*7zy=>Dfjpc9O5r4ck2CT0fk9nJ0rHUoltv1Gk2LWpgLPd<0rHUoltv1G zkCetu+#~FCEtZ2EPja5{8&PHq5xb2pK#dN)phe4GHKaRT7uOk@k3^9d!8hm=4m zqy+GhdVb_ul^q3O8hnHF0xvQcnRt@A^{F80S!>p z?L($sH7;ae>0(xQbO7Z_Gs}q%;5yia41&pn%zk5*ADMM4BtxE>E?8oTPq192MM%bq zrd+A*8c40uGd;}Yk`(h*wHo_R%e3E>MO3*)@(lpdMn;t-dY9Rg;w=HKpRUFW5%%BJ zuhw&yV`J}gRVA=y_fGuF0=3u zR${`CS!9-L>;S9DLS+b~BZv5bP$Tq2&pu?Jgk^x10GU2yrioVtrY@l)u8S%*?sMrT ze(|_%3>U}VkqgAP1+NvV*(2Z`RRM&UcgFCNW$1=o9gz>$QN0%4< zW!ZKtL+-M+9&s($)EMa=MaMdF#}Q2|cX(Qo+!;si2>j(lJH!`1Wqv7+U>GHXTbJC` zX}mSieCpzQSvEK2Q4AOW*;oT8y|7i0Yh04t)j?Xm+%Zioccw0(Bd&{y5@)bX90&5JcPdNVw1Vi& zU2COEE)m+bR(RFn&7X_!S}Ro=PCf2gD^=Qcm|ZJM#=F)^jcoyx9&hnL5RD;FD3U1; z$*vXUGtz0th}gz>*GedzT`MZ$9U~#j-?d6rgv#t%7b}KUAMaZIg0TF1O>%avLW6CC z>{Fb5fNxfj5bZN~&_$ zEIz;C0Zglg9J^UnmI%lQ0mO?4Ad0g}A^?wK0+31~0IMVd#G@7;DL^QCQ%UJzmv2i$ zO?k@6etrY}Nwb4Y(8b@zKyh<6`%!`Q4=?%Cfw({q9}U?3?g)p@74JNA_PZk^v|21K znzP>>l>l7&t^cP+uAJy=_EO(tlqzX2kUw_7AoY6C<7f43NKYr%#toB;Va z0ZQWpz{iMFNq=w_o?0S$}1}|^i0GBsYBWhmC1`@@KHjqLY?;y=LC59aQ#1(S= z#=ycKIuHX$8oafS4SvryVEAnI1;saI3?-(FAvQyDtyw!#B=@`{O~k~ol~nA~rA-z+ zU=l<*C2X-hjDo*23==*VvV~2|67iQ7vV%|J*%uMEECX5H7zhR_d>6tdVY}k%)(X^xVPJ%f>jMK#H^dc+u#uwnq|36LBJgFJ8}po#Pi7C0Aw46~nYiFaRNjHVFnG#Lyhr@8&^Y@?mgJm}usX&K~-Zy`kfZv!g~?b|hZZy0|kUMNN{}meQoB<33GBj`*~N zyb#FVqT7-vOFt;g1{(cm1}DOS4*vW8@w_Nb=$DN6MPAokhk(2#h6nl`l#bf#t-GCI zMvm=cvHV{MQ0pE%P|(I4k`B-6&Iu!kH_Q?nh`7S)q{h>88jN5$K`mA%RqGjx2X23( zDyD1XSVTM4Dr^%*MyNi#7{dugy&3>3N8n@SNIArC0zj-BYaGJTn{tHt8naiPEf@H6 zRAPlUaSc>u%_Vu!N61OUXDKvmn8y5*lYtvY7~;lN_;i@G>RO^L7evR^*`BBA4XCXx zw?b}C@rsM)+SAZl z-yT6AZ+A_g)b5%9c6Z$sf&?~n;RMLX2~Zj*06xyda56g5Wd59#6_$+4%^dC^~7G)IKw8_?pSo(M?@Qe}i}5{rc(Rm8PS znV|$SLXhBdr`d{rXxQQpwwtcl9s>FN1t`s50DS(&W;t-EtIq)PaRQXa34o6?kuLDA z3n@T8Qh?G(0q~LfX1TH$Q@}Smp@81lEH{#bA&EQ13D)R642ki1aYziyH_Mgrl@|IZ zUrwxDE+Z0&`_|ay2#?P*hIve5Sc+>5v225F4$dFmHG?;aZH|SBS79~zQa>FxTCfTe zJI!!~)@~UANkG?2KoZB=uo(}S;v+9`r8MZz|_KJnW zumrEh+K2q26WA|J`Q%khKvelsEHG5Q$OI$Q8DWwdZ71>6%q*8alfV}4PlD2`*AYgJ zB&4#-Ff0sS%*r=hmE%$nb~0SCZ8p|}bi@*pmuSub)o?*W7AZ`rT!Vxpg2`4d#D^_g zFo}5{KWt4yFlod!4PmM53MQ{vMKJNWM8OoJS$T+q=FlS0fR+t$_!2_tiUqTl8Nej= zapI2{0*CMogP^6TKf*52bH*x-%1r9g4q<@}45KOEHVEpiZP3I-}YgmQg)lh^uCfXEJ2H8jgsi6oEp@?Fg;;}Nggn$AW z=6U;KsxxO}TpKYOuNnsuoLC>d{!hxiNg2BpVaV-Q4&9~6pQ$V0LZ^EPrb(RXJPZ#fo8x#9L#(U|(00oUO6YVA~*DV}ccgIdPHRw#LXxJ?n3cv5cT| z;HSqY7baSzGp1Ve&B+GNUY~65KFfi3+EWv!(f|h1g-_hJF4E`+29^Wtq4ubRP-D5+k zv$u`ANr-2_Ha|x9lsL6?W!SoBPp38SG;vqYAzTNueqwLSe(spgy9T$&$hdde zQY#(a#uwvAW(uloO*ClRS}pByQ)saA2^Gm@95I;{cMXmeC@!e(KgUBwR^6)oe1(p6k~!~nNKvcuC%{1 zwH|Ue4OwuSOyG5`+4+4wR!Z1Jc-Krq5VyA`aGwz$$W7d0gO~8i%HfVfv!<8R9R~O6 zI{HLD#rP7SWAn|q6eWOdZXVo<;&EoKhv4mLByDcbx|9Qc4xh}tp*cA@vj?Ye#T`lb z*DlOssHgegMH-8SUy#IwROQCqu3Qq%jnn8jNX8rlEsOqCIt~!=FhkmlbOkCP^-_?9 zrgP*f(BoJVbUL`7XLfFe?%axdES}krdft9QkU1?;;T`*M6oVYpo-h<}U#kL?=B~&Y zz+;#%C)~zEgGgI;GMdFSl-bV(pEJ`YAbt>D<6+Z4T#)U;O9Gm9M{Md!YaOWrr zzIejB>`2BlXHUxmA7kR+DWS7z_A%w@I)}jqoT6?`S$??E&Yd*n_Tk8j>019T9JcO| zW(vfPGAHjyoR`?+Eh3$Kqj5gzRXPoJo4Ke7bz9U_af$&#sh51(B zAmbN85tD9OEl)TEpWfl{#eX|@Vx5b4{Py&&T{uOE&ZVHmU20u*ayp~~Wp?w`XMJUA zu2U+#syo>`e%2{R&3DRS<>VYTak3XgpOnLyT2ziz3K)i=%2$1Cq?u^gxRBP9E&!E2A97g{;{d zc_Wf3wCrgk?1D-@C_qhwjCRD7nSpF*AfTB98OS?(0%GS&IgLy;D(toQ40gP#?rwj+ z%bUMhAhc8{Yp@sxYn`nRg&BonbE{p(tt@wxWw{LI{#y;iYOx=fkV)hZK> zCfyuy24gwP-RSyWPm@H*8pyo2bHoedtmeu&e0uDjaeCjIce^zf)*xs}OBFYz9?M?&4ep)tafP;!QExIBMNEY6*@i&7#gU_5XHKq(K%ByOU+8*{fa>8q4)G zjhnsUhso4~BxNgJ`-4Yb0@Eqjmte(K@{j^jFGT9^%&((Pz-eX9(ss;BlJ#x{K~UE^r~4KIBo4WAA!il z379=nY2tMzM@R~x`64!J`9M`B#F0alAoLd#XI9z-b39E$Y{X|z6Fqi$nsRy8WigDK zOihQQggQe)()rkVdgUV^CStMDUOT~?UyUt0{Z29;#>eda|h89CXY4t8Ub`*(((i`bw}KG$smcT+H9_Z z^)7i_hsga#R9&YL8-EreBbM;-aFB6nHirbAm{Ig&|EN++AkSEayUs05Hmm)WVMeEH zmCO98SY8MSPoL0MGG5*J(7(;eqPD+o6&wY-j4Hh7CX3qsI#nR>55lmFD!eEti`xFW zRTLiYRlq1O;Lf79za&0HJVi-i;GjPwl!j#wACXX0gn@H7jlk_4Q=FeeY6LD9O)=Dl z)uejQ%0?VRRW8>}ypvxc;F%Qyo>3v7g%u_NR%LWnW)lgXRU^T>Yb0o4jY(`DKF~KG z%X)1jcxH|Eq_GrJDR*IwoQa!!qR7iy6#8U*#{@mw~=u z)Uj;?!+-}gPbTK%iIuU{fz^-|WS{48c@se*XBVf&fH?vvxq+*T zd!llU{m!OB7C1;t#%X25d}i#66yTX61$c%K16n9j$v8z{W{w(yXH`h>?g|N7SfMjc z(Y@I<0-jkT;2AXnT391RNm?G$FR$!OHx6-h8;b*lOwubtCLtZe6f^0T;*w+nkPs+} z7VwudwE-4Mvyd@T0H@OhayO#8pur->-VsK1`eBs>i^D4UlCX3W5@L9cl|!|QharnP zT1MBjcsGan%@jejv6n!e-AjOH_7dP3y#%Q3C82@>F*9nWpup|~*mlg-V{Q>5RAQuY;NNuV{c26*ucg~ z#=>TjOkfh~O9-ZRc-1puP!saiA!q2>*a zP|rRnpITp6izihf&36ok94%mN^ul%el-n3*b2AG4$k>y~lQ4Qss`0_^u>MW8?DoIF zp@(AZH#-qN)cUB#zt_09FV@Hj-8r(_RkFBD`siq z?_1}*EL|q4*dk|5U{V17<#ij*7KCa0o15-n6N{U{Hje8_y6}z7ws7co)7S&W>0^z0 zF;bh!!7RqGn9j7V(loEroDo{Z6qZKYL8^mKTu6)HGgOKj$wxQmU?cO;s>G6-Zng9( zq8Nm@vUrU=bZn$V9tUYTWi9RICj6TQV^-fF)x{+}6N_EqvEip)oK-ne*=^e^gDPtu z^jufVv+XU(VkQ$d8RBu;dYNJ(W21aBB#95~(MGap|D{;@2`^pVLdx8#=o$y*1Fxe$ zx*gE;e)AehSEvbM2@p-XUY%;&Y_Fu-X5IA zN@uT8PWq!wJ!kOm?*ZlMsDSh`i0U(pt@Wk6CJu62zkFGWimh&@n&U*8xx2WQidF#6 z5X)}#sZ(}@&OfAg`lFWc<{0nYmJw z!E^`0y1rhH<2bM~BBxMpRh3 zQU-wejG9=05Y}dA{`AxNh9Z&=U+hSCP|yi~9S&cX^=x&uBnd;Y@?;PgL4K0&+5h; z$I!%HJc|>3!R9<_*(uD{T9-MqJRq|XcsL+Bz9Bjhy?70VM3l#MntkDF{naPi!TB&T-p zWl7TBc=*#TPNEEwyPQl%iy&rUkE05yL#Quu^@Gm>q2oHJr4+)His~M$32T#%V*WyM z*x@3~&YQm|mBfWV3Pq!xWPK=us!Kx z7ibKk2uB1`IoT&sCuL`*eMX!)39Vr99j1jI^=;w<=kT+F&v@gCVB6!P=K=BV*4788*VBfS_rNm;V|vES3NXv)!Q9hO_>Lz!*WRPY zb{{p&Dod6T{@80NH8=tQRAj4T!OR;#X3ZeNi?iU6pH8L5y-jq=PRtFw)?-wSI;mnO zt<2}%g75(-n-rYnkJni=r(iWyr`r#)?lPaR)v@>jW~?pkncB#~%Nd|_>mXCMeBNfc zL+{4mY4??;5%~TPwf3z<9lUk14IwUigP+XBLLd`~l7=1%kHaIV;Q!n9W}$#(8K13D z`2>fs9DL$0)#U2Ue01Avv@bdF=@waHVMd=LdDu+U8H7MDi8kqOV}j93<9iV^aA8v@ zWn`LV&SwzRqoU%^cBxIY0?nEA263<7B7r-ML4tGK%_#Gl#v-6OiHr>+ms39IJz;>`)yNhwK9jxOr$ZA6H;J0u_?pas~I-q%9%D_JU}f z3RH1&$ptmW{Ua6vs|o&b8E4X=DLW{vlV zNTP-RB0)FYcB5!AiOy~?AEV(*ocT0AErtxt78@%caZvRVhett_OttKYoNbrX$8Nac zWqPX%eCN7m2}u-Hox&qQDJQAj$4U2`jpm)F= z6Xh}-dzNeX;N8Z!0BSszfW{FnfEs@#peDWrFzcY>N&;HYN!I7=MXSpg|jp%;%rpx(n#5CXL5EG6p+P`!9C3Q3xYMWNs#`S6IO z$M!!#yE}!Tey0%3b_%}Tf?LXycO%+-SE20~hRNiT9tSe+@zq#a0)6RNBwL7pvX4T^ zl(~-*cn3`huDOpAc*{%)uDK5@84?GiyZFuW&sJ(jYL(Z&`S;~yej7)t3MwM_@q~kS z1mu1jhqHGq(Ap>{r_fyK`Zli0r&(p1DR})IJ2*GbOtdE9=*9UFFtJkYLI-V)G7S(y zTQ#nPTKqk6gDQ&fo7&YF^QzDryP)*8i zftnZ!>p)_;KqfX_RAWy}JnrPs`j}O~XUE)-*%Vm@@Uec0?ILax352(K_ly_SA^J?C zO6Pjem5h;4Wl4yYs7dcjB%j-|~PIrv=j1saw}i)YrPJ)pI2#GGNvk)7eJTsghS zQ#xxcz7qxE2VECyWhx3be4>b;!cfH+B%Oe3qOFo+AP+nOCW-=M%jWb3S%vLmS&D*K zn{IBtc@wlGJjz!asLWEDs||#DWb8?85Jta6OZeY`!u&KF22j#12WxmYHGxuakQTCTv)F3oWj;D;j--$oeTA~FA#PwhTG8a7%JCi2brqXv$#tncj z$;<$1nQCOrDsMl~qSjnDQxH*-{sIe>^7e83H23k1n^Z-yyql%Y~dle*$WUn{)Va7eJ8$QicK%+3KQc? zy28Z#;#Rnr0Vdgg;`5YvtCOmc;AXRvs*&K`O(dw@@Ys=&vSTGCAL={1xk}dvcxH`& zXVeI2VU78gAK1A`0WU*93x=69imQc(*I!rL4{oKWp!;P|UogDH_=C?;Ncfj+{Xuz| z*$59Nfs`cl`mvG|g-LpalqR*;eyrqtBjOB5^k}y1*t7FlZQB7!xeH|{HUyQ?mzly! z@GM~^c(FK%#rIYqW>VOH*QahWdBjr_3^UgcvY zKH!~t#r=yHRB{&X^|V0R_WQkL z&+bnNB4M#|K_4sOTCnW(OKs5qSP6KH#|q;kS+&HSF=U)vP_aoW3RO%@2o<**6zWY$ z;vESmnJr0@#Jeg^a&1NchzAgeQ}tM|t)2LV& z286a90_8Rk)HFe$Og=%qEmWO9%DJwaLLx_+pS#)P{VQs-#O7uc`jOGlpPNydgp6L3 zminEM5g#i$HC|g$t??dFnr1V^UjkSyU;_nFGLZq!jgSY96gR=(h!-bg&q|JdU)hJq z!evB?X9WB@G2$KpkhoNwH<3)ylN7ei*F5pd^%k}*Qtkz`(w7c&j3JqqOa>0%EDGBG z50C3+Hc*f&B2lrmb6yY9E5{CxPvTV7|E(}@4k{Kq1)_R6*4fj%BsZ8pihDFe+ESt4 zX^XBK^-UJ&bkMid1i5shzFGe!QO2~Y@}w&xblWJ_bmdw34vVSR>U$SEG0XB?x1a)PV5AFziv(bch1OKC(%25CL1jcw=U zQ4$x*l(r}8)ba6h=B_Pi` zsKL%VoRjAm0(x^ymBUxFrcK-pIht=hMMXkK?ySc1B+&OZPg2I7=1I!vwIS=K(CZ~a z6m@kq(sn2b4l0&(7Mx1Co-H`NIbCpk2#T{5^%f;s;Y}J1JcNm&w2;CG@Lr`IpkM=? zb=QiER9V%5e$VM5_84}$P$D^9Pz{to5-f_E2wFwRTjF#HpIr2quu86D zWbWBjh9SAeZqdZ)5;uuNtk~&-qLwDISkrTjqVUihLrxYB&*{QQ5{{*vE;;yIrwd=% zNP0d)caWKQ)L6(_SZeGP%gEWImMIV00Jr>bHPq2lG$*&2jGe>QB|@z*mh|DO>!mK^ z6@5o(*V6%PsFM*cdH~yS)o8vHan5GNG4l_z{e#W?^q3RX$^6MO>`NoTk1B_93W@Ye zjy!OQubd|`?B61xohZ?RVPEVcRE@)NTLW#h%!M&TfQ)sUNWV-i4J*o+oh&CtP;0K6 zVV@{*4f{-44~BhVgSR|O)1K3IaGsl%5>V=i0&u|$%(8AbdP^KX1>v5cr{2wZ8C~oa zsIWa|85X|+dnNJDt%AR1Sw4cz2BiEv&J?Eg<15%aEReVde}mS>P`N zeZdfO(APK?V;SfRhL?2<@W{OmZUOnE9o{XTLQ=xsn_FPm|1^P=IQbgHEr6cOmYpPG zGc_P7e}?QV7PXlSNc3fPg@9)YE8rOw0$M1n&VWSsX4XjXtQra4T_ZsYYbAM98wgk68t%ta8;}!tri-(P}Alfs`fIPdG zk|5=jAX5H}UUCAJ@tF$6Z)UH4DmcV9y>g&#p_z)uN0KCZf}mm!KrUxh%wRDJP;tBS zHcKpP8sH?e*G`heEkLEr?%E_7i#_T~s6agyY^!I&C^TY_Hwc`gXWIr^BmPF9m0GAJ zh`VA20HbY*fZ4!76fR#^$v*OGj;#Tum%7y;(YH zb@Ch=O9x5|DU1LH295?4Y`9^OE>a}XHK{{`#IgqH_beSl{8rOh2V2wigrHBQ=;Aqd2Bx_)=l*ru}^J63Q0^i7qzwUR%r)VuJc zmHsLo_0j4U0e+4X;Bk6Igtrp}SkiZ=w?Td75%^iBKT1DWsPEFxmFl)f;pg%4b~V2N z(e`7M3Y4Bb7C%R;m(b5~0z6K?_l9^oL4YOwd3qbv$KDt}>-0V7=L&US`nghFa})eL zUf!kxsb|ZCTbrW@*x~aMues8XBfjqZV zw^GOB_XKq!cyJqaTXj2idvym@Qg>8$QYWc9tGlR^)m>Ge>Q|?zQ`HK!QVpon)SxP> zimIxb8dAe*M2)JtI$f<&XQ(sPS?X@;?rODKqt>c*YQ5T^&Q|BBjp`oio@$fYthT7F zYMVM&ZC7JzhdNK4uP#s*s*BXU)J}D8wM*ScHPn4oQ|$&_<7z^+)E>20?Ne=aF(8-V z-=vyS)A*gi@2t91&8d!>R|{&tI-m}!L+Y@)Ox;giuI`WYn}Y8rGH)KBu22s|sRyYC ztB0tEs)wnEgDY36M}T)!*Q3;iPXio`Z(lyym|sK{=4w^ zDp34H^(6IV{60lJ)#3Nm>S^HlHR|bx@6SMvXX4+p)U(xd)N|GI)bqig7pNDi7pWJk zm#CMjm#LQ{{T1q!>Q(C1>NQAxE&gTo*Xz{l)fn#pZ>#T^)bHZ=d+Ph@2kM9FN9xDw zC+er_XX@wb7wVVlSL)YDJr@#jWGqqC#wqm_jMwMHux=^)jry(n9gno%t3Rkesz0ee ztG}qfs=ukftAD6}s((Sqv<`HrBYlKEQXi#{*2m~$^$qk5^^Nq6^-c6~`lkA3`sVr; z`j+}u`gnbUK2hIV-$vh7-%j6N-$9r39rc~`N&3$EF8XABSKX)k^(p#Py+W_l1Nt=R zsj{xkIUS`XZBdFZ}M*_tv}geRM+; zZsOj3byM%w<9Y(`KgVdjUCc+)VlBN#@74QsTVJd%(TNtD)K-5@>1j=PX7nsDJOQPT zjxoq+z7+76qKBTw@HySfc<$(VeG|2y|6N9NqAmAg?B;39{rZ4Ds1NDG`Z9e#eYw8B zet^D0KTtnNKUhCRKU6%PfufT>U)# zeEkCCexZJmezAUueyM($emUM>fq$>muhOs9uR&QFd#}~6!_$;{y?K8Fe&49ygnVz- zZ^83h8PD7F+x0v2JN3KtyY;n5dk_A-SHDlcUw^=q`=I_1o~G1?&HG32`%%X8G5vA< z3H?d^Dg9~v8I$^1{C-Yu>09>Tl_9>+k6A>hJ0A>mTSJ z>L2MJ>z^S1J+an#6vo?6_0M`5Z%ZF%qATsHBwJV3mFUVd73s>mE7Fx~mDQEBDmhup zs)TgqHnmbGs}id#cdBe%xkvq6|3d$gb&tO)`IY{){*C^v{+<54{)7IbmQ~50v|W|l z40`Sa!=3KgB7aTt^;;=*48~%wT)i%1@c)Lt?yBU^T2>`8H~mHbRm%tzzS}YQH~n}0 z5B*R5FCK#`&_NK;sw51e;D`Y0;NYm>=-`-u#^A9*_87cDaKqq6$oqPA~oh zF1RV)Z-#$24{j0MGPo5=(g-|0H~~*n>O}K?Yy93OxGnPCF1S6Ozp4n&N7NmHQt%aZ z$KY-1PIx~F|Lz>zB{(^_t0~tP^y6tt(RzdMo`Sbi8PAGfWiSw&77PaEpki`Y@mmXq zg5h8!7!B&d>4B_DRt0udvK`Wdtp`hntVyoLuHdP;GM21Jir4=CH&T$S$Il4P3?8G- z0{`w7*cHj$gVlk*B3Tp2YGiG&&hX4#iL5uU{1wQCKvp0h$H=^`;abryDp`M=9h?&+ z>yN8Y7JEPLhh+6}?G0r0(d)Qf{_5lZy1#yoF`B0pHwO0z?ip+fHV0dRt--e7++ce! z7VHSl3(gNN2rdjR3hou`4DKE53hom$g8K$d^x9gp`dBLG{?jxc@s(B|#9OQRb_e6Z zM9>QM1ho3t8|(|(!NtKP!DKKMOk>2%1hc`V!5nM84tSZh`j`(Eg8jh(E`_z_61+5cS@81U6~QZmR|T&QUK6}FcwO-N;0?hWgEs|l4&D;HHF#U__TU}J zziG$%&1BnoN~Ue+yO=>?+c^P4J+bW^Ew&v7mh_#(w)04`=B(4dq@OF)3E1|*wzEfU zJN$MvzX8z|V%vEE8Fh|UU!|Yp1bCb#)UfR^u%tgKwjDwZ+YX_IZD&AiJNFaY4!>Qk z=EJWLXM@iLpAWted@=Y^@a5nu!B>N?1z!)o5qvZFR`BiMJHdB@?*-ov zeh~aH_)+lV;3vUPgP#RI4}KB+GWb>S>)1#H)#KVhtKc;w?BWPD}DS23k7E-CfQ5ZXJ;Pa}95TnIGt~I@~E?ggO2+t1B2{(rK2=5tg3O9#a!mZ)9 z@Z4~FI2P^*&kN7T+Xdl;c)BROSGY60H%jcn?|s4sp6(kqQDQgpjE56pE8G+A4fi2$ zJG?l&B%BPV!s&1(oJIPj;au1W=fef0?hg-y2g5_*;qbEXe&OW?>;3Wjfbfd&f#HL~ z2Zs*{9~wR^e0X?e_=xb4roSi9*BGRZlspP8A^DlZs`@pllz)$r^XTv~;bX(cg^v%P z5MC8NF?>?^!P`sm`!f8#JbXp?%J5Zqdv*941Ai@kUl+bUd;_3wG_W_}_s!v3 z!ncNR3*R2TBYbE0uJGOAwWbH&5h_@Z-5%(D#JwkccR+IaUTy=m=GOf5K5otX!w;A` zeh&Ol`c5xXDdE8fIq!!|&Z};wV8?WG_D;=*!;gTTe-9~fNApL+kA)wPIhfY6p9nu0 zek%NQ_?hst;pf87hhGT47=9`Ia`=_-tKrweuZQ0VzZrfj{C4=A@Vnvn!taMa2!9y< zDEzVE<~L4~o#}GsssG=(d420tzZZPX`jhad;mrJDZMK_Ob5#2HpjeRTp9v__$ofzFZx=nQ3=yuWV zqdP>U=#J5yqLZRKM|X)%j_w-uMg7q!(W%jjXk|1IC6e*q70eyO)1tws995!fREvh9 z;b#|NcJ$hC+6U|1+I^|MuFK?YP7j+_9rOZbQk*r?!jS&@x;(mn^nmD!=z-CLq6bG0i5?m~EP8l!W%P*Xk#LU-&GJ(GzASn<%Dy7jSFem-6}>uo zP4rsUSFej+AH5-ZWAvuz&Cy$;w*uqaqPIuyh~CNi>Rqg_-W^>Vy(fBa^ge_2{rLSr z^ug#u(TAgtL?4Yl7JWSWMD)q%Q_-iR&qSY%J{NsH`a<-@=u6R;qpw6?jlLFr-I0v{ E0X*vGvj6}9 diff --git a/thermion_dart/native/include/material/unlit.c b/thermion_dart/native/include/material/unlit.c index bd8a25bc..899af44c 100644 --- a/thermion_dart/native/include/material/unlit.c +++ b/thermion_dart/native/include/material/unlit.c @@ -16,8 +16,8 @@ const uint8_t UNLIT_PACKAGE[] = { 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x07, 0x42, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x02, 0x4d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x03, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x08, 0x50, 0x4d, 0x41, 0x53, -0x5f, 0x54, 0x41, 0x4d, 0xcb, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x07, 0x07, 0x01, 0x02, 0x09, 0x07, 0x00, 0x09, 0x01, -0x01, 0x0a, 0x00, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x00, 0x01, +0x5f, 0x54, 0x41, 0x4d, 0xe8, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x07, 0x07, 0x01, 0x02, 0x09, 0x07, 0x01, 0x0a, 0x01, +0x01, 0x0b, 0x00, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x00, 0x01, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x00, 0x02, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x00, 0x03, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x00, 0x04, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x00, 0x05, 0x6c, 0x69, 0x67, 0x68, @@ -25,3169 +25,5056 @@ const uint8_t UNLIT_PACKAGE[] = { 0x6f, 0x67, 0x00, 0x07, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x00, 0x08, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x00, -0x09, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, -0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, 0x20, 0x42, 0x49, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x37, -0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x02, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x06, 0x03, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x20, 0x42, -0x49, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, -0x72, 0x61, 0x6d, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x4e, 0x4f, 0x43, 0x5f, 0x54, 0x41, -0x4d, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, 0x55, 0x53, 0x5f, 0x54, 0x41, -0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, -0x00, 0x49, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x45, 0x4c, 0x42, 0x5f, 0x54, -0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x44, 0x4d, 0x52, 0x54, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, -0x4c, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x52, 0x57, 0x43, 0x5f, 0x54, 0x41, -0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x49, -0x52, 0x57, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x45, 0x54, 0x44, 0x5f, 0x54, 0x41, 0x4d, -0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x53, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x53, 0x43, -0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, -0x00, 0x00, 0x00, 0x00, 0x4f, 0x4d, 0x55, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4f, 0x52, -0x50, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x49, 0x55, -0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x28, 0xa8, 0xa1, 0xc0, 0x95, 0xd1, 0xdf, 0x82, 0x44, 0x41, 0x48, -0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, -0x00, 0x00, 0x00, 0x4d, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x46, 0x45, 0x52, -0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x49, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, -0x00, 0x01, 0x41, 0x51, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x41, 0x41, -0x50, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x41, 0x56, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, -0x00, 0x00, 0x00, 0x9a, 0x99, 0x19, 0x3e, 0x52, 0x48, 0x54, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0xcd, -0xcc, 0x4c, 0x3e, 0x4f, 0x44, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x54, 0x4e, 0x49, -0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x44, 0x53, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, -0x00, 0x01, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x27, 0xd1, 0x00, 0x00, 0xdd, 0x04, 0x00, 0x00, 0x23, 0x76, -0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x30, 0x30, 0x20, 0x65, 0x73, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, -0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, -0x73, 0x00, 0x7b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x3b, 0x00, 0x7d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, -0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, -0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x6d, -0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, -0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, -0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, -0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, -0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, -0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, -0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, -0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, -0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, -0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x20, 0x36, 0x34, 0x00, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x00, 0x63, -0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, -0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, -0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x23, -0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, -0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, -0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, -0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, -0x6f, 0x6f, 0x6c, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x56, 0x52, 0x5f, -0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x41, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x20, 0x3d, -0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, -0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, -0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, -0x61, 0x74, 0x61, 0x20, 0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, -0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, -0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x62, 0x3b, 0x00, -0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, -0x20, 0x65, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, -0x67, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x3b, 0x00, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x34, 0x20, 0x6c, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, -0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x70, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x71, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x75, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, -0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x79, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x7a, 0x3b, 0x00, -0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x6d, 0x65, -0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, -0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x66, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, -0x67, 0x7a, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, -0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, -0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, -0x65, 0x63, 0x34, 0x20, 0x6b, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, -0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, -0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, -0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, -0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, -0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x3b, 0x00, 0x6d, -0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, -0x69, 0x75, 0x6d, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, -0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, -0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, 0x7a, 0x7a, 0x3b, 0x00, -0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, -0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6b, 0x7a, 0x7a, 0x3b, -0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, -0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, -0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, -0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x34, 0x20, 0x70, 0x7a, 0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, -0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x72, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x73, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, -0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, -0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, -0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x3b, 0x00, 0x6d, 0x65, 0x64, -0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x3b, 0x00, 0x7d, 0x20, 0x6d, 0x61, 0x74, 0x65, -0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, -0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, -0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x66, 0x6c, 0x61, 0x74, -0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, -0x64, 0x65, 0x78, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, -0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x20, -0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x3b, 0x00, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x43, 0x4f, -0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x56, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, -0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x41, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x29, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x20, 0x2b, 0x20, 0x67, 0x6c, 0x5f, 0x49, -0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x00, 0x7d, 0x00, 0x65, 0x6c, -0x73, 0x65, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, -0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, -0x5f, 0x33, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x2e, 0x78, -0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, -0x62, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x3b, -0x00, 0x5f, 0x33, 0x34, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x33, -0x34, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x33, 0x34, 0x34, 0x2e, -0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x33, -0x35, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, -0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, -0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, -0x20, 0x5f, 0x33, 0x34, 0x34, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x35, 0x2e, 0x78, -0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, -0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, -0x3d, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, -0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x2e, -0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x33, 0x35, -0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, -0x5f, 0x32, 0x31, 0x35, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x35, -0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, -0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x35, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, -0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x35, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, -0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, -0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, -0x6e, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, -0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, -0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x65, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x3b, 0x00, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x61, 0x74, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x33, 0x20, 0x61, 0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, -0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x36, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x5f, 0x33, 0x33, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x33, 0x20, 0x61, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, -0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, -0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, -0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, -0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, -0x63, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x2c, -0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, -0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x29, 0x2e, 0x62, 0x61, 0x73, -0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, -0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x29, 0x2e, 0x62, 0x61, +0x09, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, +0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x00, 0x0a, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, +0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, +0x20, 0x42, 0x49, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x4a, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, +0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x61, 0x73, 0x65, 0x43, +0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, +0x03, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x20, 0x42, 0x49, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x28, 0x00, 0x00, 0x00, 0x4d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x00, 0x00, 0x02, 0x03, 0x00, 0x53, 0x4e, +0x4f, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, +0x55, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x17, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, +0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x4f, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4e, +0x45, 0x4c, 0x42, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x44, 0x4d, 0x52, 0x54, 0x5f, 0x54, 0x41, 0x4d, +0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x52, +0x57, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, +0x00, 0x00, 0x00, 0x01, 0x49, 0x52, 0x57, 0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x45, 0x54, +0x44, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x54, 0x53, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, +0x00, 0x00, 0x00, 0x53, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x43, 0x32, 0x41, +0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4d, 0x55, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, +0x00, 0x00, 0x50, 0x4f, 0x52, 0x50, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x44, 0x49, 0x55, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x15, 0x4c, 0x1e, 0x11, 0x05, 0x24, +0x51, 0x3e, 0x44, 0x41, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, 0x5f, +0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, +0x00, 0x54, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x49, 0x43, 0x5f, 0x54, +0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x41, 0x51, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x09, +0x00, 0x00, 0x00, 0x41, 0x41, 0x50, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x41, 0x56, 0x53, +0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x19, 0x3e, 0x52, 0x48, 0x54, 0x53, 0x5f, 0x54, 0x41, 0x4d, +0x04, 0x00, 0x00, 0x00, 0xcd, 0xcc, 0x4c, 0x3e, 0x4f, 0x44, 0x45, 0x56, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, +0x00, 0x52, 0x54, 0x4e, 0x49, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x44, 0x53, 0x43, 0x5f, 0x54, +0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x67, 0x4c, 0x01, 0x00, 0x36, +0x06, 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x30, 0x30, 0x20, 0x65, 0x73, 0x00, 0x73, +0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, +0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x7b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x30, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x7d, +0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, +0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, +0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, +0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x23, 0x69, 0x66, 0x6e, +0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, +0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, +0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, +0x44, 0x5f, 0x31, 0x20, 0x36, 0x34, 0x00, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, +0x4e, 0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, +0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, +0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, +0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x35, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, +0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, +0x35, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x43, +0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x56, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, +0x52, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x41, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, +0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, +0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x00, 0x50, 0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, +0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, +0x53, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x6d, +0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, +0x63, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x65, 0x5b, 0x34, 0x5d, +0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x6a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, +0x20, 0x6f, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x3b, +0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x3b, 0x00, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x78, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x3b, +0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, +0x6d, 0x70, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, +0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x65, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, +0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, 0x5d, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, +0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6b, +0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, +0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x7a, 0x3b, 0x00, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, +0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, +0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, +0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, +0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, +0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6b, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, +0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, +0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x7a, 0x7a, +0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, +0x3b, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x7a, 0x7a, 0x3b, +0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, 0x00, +0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, 0x5b, 0x34, 0x30, 0x5d, 0x3b, +0x00, 0x7d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, +0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, +0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, +0x33, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x3b, +0x00, 0x66, 0x6c, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, +0x00, 0x69, 0x66, 0x20, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x56, 0x52, +0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x41, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x29, +0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x31, +0x20, 0x2b, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x29, 0x20, 0x2d, 0x20, +0x31, 0x3b, 0x00, 0x7d, 0x00, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, +0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, +0x74, 0x73, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, +0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x75, 0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, +0x76, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, +0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2e, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, +0x30, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2e, 0x75, 0x76, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x31, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x2e, +0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x32, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x30, 0x3b, 0x00, 0x5f, +0x32, 0x31, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x30, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x5f, 0x32, 0x31, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x30, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, +0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, +0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, +0x75, 0x63, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x65, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, +0x72, 0x43, 0x6f, 0x61, 0x74, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, +0x61, 0x74, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, +0x6e, 0x69, 0x73, 0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x6e, 0x69, 0x73, +0x6f, 0x74, 0x72, 0x6f, 0x70, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, +0x34, 0x20, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, +0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x65, 0x5b, +0x34, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, +0x20, 0x6c, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x71, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, +0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x3b, 0x00, 0x68, 0x69, 0x67, +0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x7a, 0x3b, 0x00, 0x75, 0x76, 0x65, +0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, +0x64, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x66, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, 0x39, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, +0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6b, 0x7a, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x71, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x68, +0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, +0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6a, +0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6b, 0x7a, 0x7a, 0x3b, 0x00, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x7a, 0x7a, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, +0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x7a, 0x7a, 0x5b, 0x34, +0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x7a, +0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, 0x7a, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x6c, +0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x61, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x3b, 0x00, 0x7d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, +0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x6d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x4d, 0x61, 0x70, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, +0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, +0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, +0x30, 0x39, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, +0x6d, 0x73, 0x2e, 0x62, 0x20, 0x3e, 0x20, 0x28, 0x2d, 0x31, 0x29, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, +0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, +0x30, 0x31, 0x3b, 0x00, 0x5f, 0x33, 0x36, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, +0x33, 0x36, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x34, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, +0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, +0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, +0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x70, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x30, 0x39, 0x20, 0x3d, +0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x3b, 0x00, 0x66, +0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, +0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, +0x28, 0x5f, 0x34, 0x30, 0x39, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x2c, 0x20, 0x5f, +0x33, 0x38, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x29, 0x2e, 0x62, 0x61, 0x73, +0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x2c, 0x20, +0x5f, 0x33, 0x38, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x42, 0x6f, 0x6e, 0x65, 0x44, 0x61, 0x74, 0x61, 0x00, 0x6d, 0x61, 0x74, 0x33, 0x78, 0x34, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, -0x6d, 0x3b, 0x00, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x66, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, -0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x42, 0x6f, 0x6e, -0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x42, 0x6f, 0x6e, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, -0x61, 0x5b, 0x32, 0x35, 0x36, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, -0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x00, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5b, -0x32, 0x35, 0x36, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, -0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, -0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x3b, -0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, -0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, -0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x00, 0x6c, -0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x35, 0x29, 0x20, -0x69, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, -0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, -0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x36, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x65, 0x73, -0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x3b, 0x00, 0x76, 0x6f, 0x69, 0x64, -0x20, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, -0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x69, 0x64, 0x73, 0x2c, 0x20, 0x76, -0x65, 0x63, 0x34, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x77, 0x65, 0x69, -0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, -0x33, 0x20, 0x5f, 0x37, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, -0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, -0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, -0x20, 0x5f, 0x37, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, -0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, -0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, -0x5f, 0x38, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, -0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, +0x6d, 0x3b, 0x00, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x66, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, +0x39, 0x35, 0x36, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, +0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x42, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x00, 0x42, 0x6f, 0x6e, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x5b, 0x32, 0x35, 0x36, 0x5d, 0x3b, 0x00, 0x7d, +0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, +0x75, 0x74, 0x28, 0x73, 0x74, 0x64, 0x31, 0x34, 0x30, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x4d, +0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x6d, 0x65, 0x64, 0x69, +0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5b, 0x32, 0x35, 0x36, 0x5d, 0x3b, 0x00, 0x7d, 0x20, 0x6d, +0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x00, 0x75, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, +0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, +0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, +0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, +0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x35, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x3b, 0x00, 0x6c, +0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x36, 0x29, 0x20, +0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, +0x69, 0x67, 0x68, 0x74, 0x73, 0x3b, 0x00, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x2c, 0x20, 0x75, +0x76, 0x65, 0x63, 0x34, 0x20, 0x69, 0x64, 0x73, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, +0x74, 0x73, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x20, 0x3e, 0x3d, +0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x36, 0x35, 0x36, 0x20, 0x3d, 0x20, +0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, +0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x36, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, +0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, +0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, +0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x36, 0x35, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x35, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x35, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, 0x35, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, +0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x36, 0x38, 0x33, 0x5b, +0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x38, 0x33, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x38, 0x33, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, 0x38, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, +0x5f, 0x37, 0x31, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x37, 0x31, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, +0x31, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x31, 0x30, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, +0x5f, 0x37, 0x33, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x2e, 0x77, 0x29, 0x3b, 0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, +0x5f, 0x37, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, -0x38, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, -0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, -0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, -0x5f, 0x37, 0x34, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, -0x37, 0x34, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, -0x34, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x34, 0x37, 0x5b, -0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x34, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x5f, 0x37, 0x37, 0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, -0x37, 0x37, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, -0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, -0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, -0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, -0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x32, 0x38, 0x5b, 0x30, -0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x32, 0x38, 0x5b, 0x31, 0x5d, -0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x32, 0x38, 0x5b, 0x32, 0x5d, 0x20, -0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x32, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, -0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, -0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, -0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, -0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, -0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, -0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, -0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, -0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, -0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x75, -0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x77, 0x65, -0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x75, 0x69, 0x6e, -0x74, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x64, 0x73, -0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x38, -0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x35, 0x5b, 0x30, -0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x35, 0x5b, 0x31, 0x5d, -0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x35, 0x5b, 0x32, 0x5d, 0x20, -0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x35, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, -0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, -0x38, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x38, -0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x38, 0x32, -0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x38, 0x32, 0x5b, 0x33, 0x5d, -0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x28, 0x5f, 0x39, 0x30, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x5f, 0x39, 0x30, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, -0x28, 0x5f, 0x39, 0x30, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, -0x30, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, -0x29, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x37, 0x20, 0x3d, -0x20, 0x5f, 0x32, 0x36, 0x35, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x37, 0x20, 0x3c, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x3b, -0x20, 0x29, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, -0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, -0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x76, 0x65, -0x63, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x36, 0x37, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, -0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x36, 0x37, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, -0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, -0x33, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x33, 0x30, 0x32, -0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, -0x36, 0x38, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, -0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, -0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x33, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, -0x32, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x37, 0x2b, 0x2b, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x74, 0x69, -0x6e, 0x75, 0x65, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x38, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, -0x20, 0x5f, 0x35, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, -0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x35, 0x31, -0x32, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x34, 0x3b, -0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x35, 0x35, 0x34, 0x29, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, -0x33, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x31, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, -0x31, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, +0x37, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, +0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, +0x31, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x20, +0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x20, +0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x20, 0x3d, 0x20, +0x5f, 0x32, 0x36, 0x35, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x35, 0x35, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x28, +0x28, 0x28, 0x28, 0x5f, 0x37, 0x36, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x37, 0x36, 0x34, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x5f, 0x37, 0x36, 0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, +0x36, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x39, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x39, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x39, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, +0x2b, 0x20, 0x5f, 0x37, 0x39, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, +0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x31, 0x38, 0x5b, 0x30, 0x5d, 0x20, +0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x31, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x31, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x31, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, +0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, +0x74, 0x20, 0x5f, 0x39, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x3b, 0x20, 0x5f, 0x39, 0x35, 0x34, 0x20, +0x3c, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x3b, 0x20, 0x29, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x20, +0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, +0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, +0x74, 0x73, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x39, 0x35, 0x34, 0x20, 0x25, +0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x39, 0x35, 0x34, 0x20, 0x2f, 0x20, +0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, +0x78, 0x33, 0x20, 0x5f, 0x38, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, +0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x75, 0x69, 0x6e, 0x74, +0x28, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, +0x3b, 0x00, 0x5f, 0x39, 0x35, 0x35, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x35, 0x5b, 0x30, 0x5d, +0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x35, 0x5b, 0x31, 0x5d, 0x20, +0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x34, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, +0x20, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x34, 0x2b, 0x2b, 0x3b, 0x00, 0x63, 0x6f, +0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x35, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x39, 0x34, 0x38, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, +0x20, 0x26, 0x20, 0x35, 0x31, 0x32, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, +0x39, 0x34, 0x37, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x35, 0x30, 0x3b, 0x00, 0x5f, 0x39, 0x35, +0x30, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, -0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x20, -0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x34, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x33, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x36, -0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x30, -0x3b, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, -0x78, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, -0x20, 0x5f, 0x31, 0x30, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x36, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x35, -0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x33, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x2b, 0x2b, 0x29, 0x00, -0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, -0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x31, 0x3b, 0x00, -0x5f, 0x39, 0x36, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, -0x36, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x39, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x30, 0x35, 0x33, 0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x6d, 0x6f, -0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x39, 0x36, 0x39, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, -0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x30, -0x35, 0x32, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, -0x31, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x3b, 0x00, 0x5f, 0x31, -0x30, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x34, 0x20, 0x3d, -0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, -0x20, 0x5f, 0x35, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, -0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x32, 0x35, -0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x35, 0x36, 0x32, 0x29, 0x00, 0x76, -0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x34, 0x2e, 0x78, 0x79, 0x7a, -0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x35, 0x34, 0x38, 0x2c, +0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x34, 0x37, 0x20, 0x3d, +0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x39, 0x35, 0x32, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x35, 0x33, 0x3b, 0x00, 0x66, +0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x39, +0x34, 0x36, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x6f, +0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x39, 0x35, 0x30, +0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x33, 0x2c, 0x20, 0x5f, 0x39, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x32, +0x2c, 0x20, 0x5f, 0x39, 0x34, 0x36, 0x2b, 0x2b, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, +0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x39, 0x34, 0x36, 0x5d, 0x2e, 0x78, +0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x37, 0x37, 0x20, +0x3d, 0x20, 0x5f, 0x39, 0x35, 0x30, 0x3b, 0x00, 0x5f, 0x38, 0x37, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, +0x36, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x37, 0x37, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x32, +0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x37, 0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, +0x68, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x38, 0x37, 0x37, 0x2c, 0x20, 0x30, 0x29, 0x20, +0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x5b, 0x5f, 0x39, 0x34, 0x36, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x39, +0x35, 0x30, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x37, 0x3b, 0x00, 0x5f, 0x39, 0x34, +0x38, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x37, 0x3b, 0x00, 0x5f, 0x39, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x34, +0x39, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, +0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x32, 0x35, 0x36, +0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x35, 0x33, 0x20, 0x3d, 0x20, +0x5f, 0x39, 0x34, 0x38, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x28, 0x5f, 0x35, 0x35, 0x33, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, +0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, 0x37, 0x39, 0x3b, 0x00, 0x5f, +0x38, 0x37, 0x39, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x38, 0x37, 0x39, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x38, 0x37, 0x39, 0x2e, 0x7a, 0x20, +0x3d, 0x20, 0x5f, 0x35, 0x35, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x5f, 0x39, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x37, +0x39, 0x3b, 0x00, 0x5f, 0x39, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x38, 0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x38, 0x37, +0x35, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, +0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x78, +0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, 0x2c, +0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x39, 0x34, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x34, 0x39, +0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x34, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x2e, +0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, +0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x38, +0x37, 0x35, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x37, 0x35, 0x2e, 0x75, 0x76, 0x30, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x36, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x37, 0x30, 0x2e, 0x78, +0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x36, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x30, 0x2e, +0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x37, 0x30, +0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, +0x5f, 0x34, 0x37, 0x32, 0x3b, 0x00, 0x5f, 0x34, 0x37, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x37, 0x32, +0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, +0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x37, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x31, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, +0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, +0x75, 0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, +0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x78, 0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, +0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x2e, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x34, 0x3b, 0x00, 0x5f, 0x31, 0x39, 0x34, +0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x39, 0x34, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x39, +0x34, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x39, 0x34, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x34, 0x30, 0x3b, 0x00, 0x6d, 0x61, 0x74, +0x34, 0x78, 0x33, 0x20, 0x5f, 0x36, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, +0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, +0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, +0x78, 0x33, 0x20, 0x5f, 0x36, 0x37, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, +0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, +0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, +0x33, 0x20, 0x5f, 0x36, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, +0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, +0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, +0x20, 0x5f, 0x37, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, +0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x5d, +0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, +0x28, 0x28, 0x5f, 0x36, 0x34, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x5f, 0x36, 0x34, 0x34, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x36, 0x34, 0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, 0x34, +0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x36, 0x37, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x37, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x37, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x36, 0x37, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, +0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x36, 0x39, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x39, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x39, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, 0x39, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, +0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x35, +0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x35, 0x5b, +0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x35, 0x5b, 0x32, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x32, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, +0x78, 0x33, 0x20, 0x5f, 0x37, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, +0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, +0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, +0x33, 0x20, 0x5f, 0x37, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, +0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, +0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, +0x20, 0x5f, 0x38, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, +0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, +0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, +0x33, 0x39, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x35, 0x32, 0x5b, +0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x35, 0x32, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x35, 0x32, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x35, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, +0x37, 0x37, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, +0x37, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x37, +0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x37, 0x39, 0x5b, 0x33, +0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x38, 0x30, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, +0x38, 0x30, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, +0x7a, 0x29, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x33, 0x38, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x36, 0x35, 0x3b, 0x20, 0x5f, 0x39, 0x33, 0x38, 0x20, 0x3c, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x3b, 0x20, +0x29, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, +0x65, 0x74, 0x63, 0x68, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, +0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, +0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x39, 0x33, 0x38, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, +0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x39, 0x33, 0x38, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x2c, +0x20, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x33, 0x33, 0x20, +0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x78, 0x29, +0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x39, 0x20, 0x2b, +0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x33, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x33, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x38, 0x33, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, +0x5f, 0x38, 0x33, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x79, 0x29, +0x3b, 0x00, 0x5f, 0x39, 0x33, 0x38, 0x2b, 0x2b, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x39, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x33, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x33, 0x31, +0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x33, 0x34, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x34, 0x20, 0x3d, +0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x25, +0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x2f, +0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x65, +0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, +0x33, 0x36, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x33, 0x37, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, +0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x39, 0x33, 0x30, 0x20, +0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, +0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x39, 0x33, 0x34, 0x20, 0x3d, 0x20, +0x5f, 0x39, 0x33, 0x37, 0x2c, 0x20, 0x5f, 0x39, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x36, 0x2c, 0x20, 0x5f, +0x39, 0x33, 0x30, 0x2b, 0x2b, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x39, 0x33, 0x30, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, +0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x5f, +0x39, 0x33, 0x34, 0x3b, 0x00, 0x5f, 0x38, 0x36, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x30, 0x3b, 0x00, +0x5f, 0x39, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x31, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x36, 0x20, 0x3d, 0x20, +0x5f, 0x39, 0x33, 0x31, 0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x6d, +0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x38, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, +0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x39, +0x33, 0x30, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x34, 0x3b, +0x00, 0x5f, 0x39, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x31, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x32, 0x20, 0x3d, +0x20, 0x5f, 0x39, 0x33, 0x31, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x33, 0x33, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x32, 0x2e, 0x78, 0x79, 0x7a, +0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x35, 0x34, 0x31, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x00, -0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, -0x35, 0x36, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x39, 0x3b, 0x00, 0x5f, 0x31, 0x30, -0x35, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, -0x49, 0x44, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, -0x49, 0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x36, -0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x34, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x36, -0x35, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x20, 0x3d, 0x20, -0x30, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, -0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, -0x3b, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x30, -0x35, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x34, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x2b, 0x2b, 0x29, -0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, -0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x39, 0x3b, -0x00, 0x5f, 0x39, 0x37, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x3b, 0x00, 0x5f, 0x31, 0x30, -0x36, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x37, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x30, 0x35, 0x36, 0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x6d, -0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x39, 0x37, 0x37, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, -0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, -0x30, 0x35, 0x35, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, -0x35, 0x39, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x36, 0x3b, 0x00, 0x5f, -0x31, 0x30, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x36, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x37, 0x20, -0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x38, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x35, 0x37, 0x20, 0x3d, -0x20, 0x5f, 0x31, 0x30, 0x35, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x36, 0x35, 0x37, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, -0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, -0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x37, 0x39, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x37, 0x3b, 0x00, 0x5f, 0x39, 0x37, 0x39, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, -0x35, 0x37, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x39, 0x37, 0x39, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x37, 0x2e, -0x79, 0x3b, 0x00, 0x5f, 0x39, 0x37, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x37, 0x2e, 0x7a, 0x3b, 0x00, -0x5f, 0x31, 0x30, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x39, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x38, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x34, 0x34, 0x20, 0x3d, -0x20, 0x5f, 0x31, 0x30, 0x35, 0x38, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, -0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x38, 0x35, -0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x38, 0x3b, 0x00, 0x5f, 0x39, 0x38, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, -0x36, 0x34, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x39, 0x38, 0x35, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, 0x34, -0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x39, 0x38, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, 0x34, 0x2e, 0x7a, 0x3b, -0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x36, 0x30, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, -0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, 0x36, 0x33, 0x3b, 0x00, 0x5f, 0x38, 0x36, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x35, 0x34, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x38, 0x36, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, +0x31, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x38, 0x36, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x2e, 0x7a, +0x3b, 0x00, 0x5f, 0x39, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x33, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x33, 0x20, +0x3d, 0x20, 0x5f, 0x39, 0x33, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x36, 0x20, 0x3d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, +0x73, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, +0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, +0x33, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, -0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x38, 0x35, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, -0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x36, 0x36, -0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, -0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, -0x36, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x76, -0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, -0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x36, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x37, -0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, -0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x36, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x3b, 0x00, 0x5f, 0x34, 0x37, 0x38, 0x2e, -0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x37, 0x38, -0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, -0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, -0x34, 0x37, 0x38, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x37, 0x36, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x37, 0x38, 0x3b, 0x00, 0x68, -0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, -0x61, 0x74, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, -0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x65, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, -0x74, 0x34, 0x20, 0x66, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x67, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x68, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, -0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x6a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6b, 0x3b, 0x00, 0x68, 0x69, -0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, -0x63, 0x34, 0x20, 0x6d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6e, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x70, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x75, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x3b, 0x00, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, -0x20, 0x61, 0x7a, 0x3b, 0x00, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x62, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x63, -0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, -0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x67, 0x7a, 0x5b, -0x39, 0x5d, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x68, 0x7a, 0x3b, 0x00, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6a, 0x7a, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x34, 0x20, 0x6b, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x7a, -0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x7a, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x70, -0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x71, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, -0x65, 0x63, 0x32, 0x20, 0x72, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x3b, 0x00, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x7a, 0x3b, 0x00, 0x75, 0x69, -0x6e, 0x74, 0x20, 0x76, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x77, 0x7a, -0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x7a, 0x3b, 0x00, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x79, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x7a, -0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x7a, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x33, 0x20, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, -0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x66, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x7a, -0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x68, 0x7a, 0x7a, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x69, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, -0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6a, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, -0x74, 0x34, 0x20, 0x6b, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x7a, 0x7a, 0x3b, 0x00, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x7a, 0x7a, 0x3b, -0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x7a, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, -0x63, 0x34, 0x20, 0x70, 0x7a, 0x7a, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x71, 0x7a, 0x7a, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x7a, 0x7a, -0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x7a, -0x7a, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, -0x6d, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, -0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, -0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, -0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, -0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, -0x38, 0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x69, -0x66, 0x20, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x62, 0x7a, 0x7a, 0x29, 0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6f, -0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, -0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, -0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x5f, 0x36, 0x30, 0x35, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x31, 0x34, -0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3d, 0x20, -0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x20, -0x2d, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, -0x78, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x5f, -0x32, 0x31, 0x34, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, -0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, -0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, 0x37, 0x20, 0x3d, -0x20, 0x5f, 0x32, 0x34, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, -0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x34, -0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, -0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x30, 0x36, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, -0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, -0x20, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, -0x70, 0x79, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x33, 0x33, 0x2e, 0x78, 0x79, +0x7a, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x33, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, +0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, +0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x36, 0x3b, +0x00, 0x5f, 0x34, 0x35, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x35, 0x36, 0x2e, 0x7a, 0x20, 0x2a, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x5f, 0x34, 0x35, 0x36, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x36, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x36, 0x31, 0x39, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x32, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, +0x36, 0x32, 0x31, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, +0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, +0x6f, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, +0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x69, +0x65, 0x77, 0x29, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x34, +0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x69, 0x66, 0x20, +0x28, 0x5f, 0x31, 0x39, 0x34, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x62, 0x7a, 0x7a, 0x29, 0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, +0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x20, 0x3d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, +0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x36, 0x35, 0x33, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x32, 0x32, 0x29, 0x20, +0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x5f, 0x36, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x20, 0x2d, 0x20, +0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x78, 0x20, +0x2a, 0x20, 0x65, 0x78, 0x70, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x77, 0x7a, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x29, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, +0x32, 0x3b, 0x00, 0x5f, 0x36, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x77, 0x7a, 0x2e, 0x7a, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x32, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x35, 0x33, 0x20, +0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x39, 0x34, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, +0x32, 0x35, 0x35, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x6d, 0x69, +0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x35, 0x35, 0x2c, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x35, 0x34, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x28, +0x5f, 0x31, 0x39, 0x34, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x68, 0x7a, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, +0x5f, 0x32, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x32, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, +0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x39, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, +0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, +0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, +0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x39, 0x2e, 0x79, +0x2c, 0x20, 0x5f, 0x32, 0x38, 0x39, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x6d, 0x70, 0x5f, 0x63, +0x6f, 0x70, 0x79, 0x5f, 0x32, 0x38, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, +0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x36, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x33, +0x30, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x34, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x29, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x33, 0x20, 0x5f, 0x36, 0x35, 0x36, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x68, 0x69, +0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, +0x28, 0x2d, 0x28, 0x5f, 0x36, 0x35, 0x33, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x39, 0x34, 0x20, 0x2d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, +0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, +0x79, 0x5f, 0x33, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x39, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, +0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, +0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x36, 0x35, +0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x35, 0x3b, 0x00, 0x5f, 0x36, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x30, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, +0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x70, 0x5f, 0x63, 0x6f, +0x70, 0x79, 0x5f, 0x33, 0x36, 0x35, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, 0x5f, 0x63, +0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, 0x39, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x33, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, +0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, +0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x29, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, 0x35, 0x36, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x38, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, +0x38, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x35, +0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x36, 0x35, 0x32, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x35, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x75, 0x76, 0x30, 0x31, 0x3b, 0x00, 0x5f, 0x35, 0x39, 0x32, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, +0x20, 0x5f, 0x35, 0x39, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x36, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, +0x72, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, +0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x5f, 0x35, 0x39, 0x32, 0x2c, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x70, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x35, 0x32, +0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x3b, +0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, +0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, +0x74, 0x73, 0x28, 0x5f, 0x36, 0x35, 0x32, 0x2c, 0x20, 0x5f, 0x36, 0x31, 0x39, 0x2c, 0x20, 0x5f, 0x36, 0x32, 0x30, 0x2c, +0x20, 0x5f, 0x36, 0x32, 0x30, 0x2c, 0x20, 0x5f, 0x36, 0x32, 0x30, 0x2c, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x29, 0x2e, 0x62, +0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x36, 0x31, 0x39, 0x2c, 0x20, 0x5f, 0x36, 0x32, 0x30, +0x2c, 0x20, 0x5f, 0x36, 0x32, 0x30, 0x2c, 0x20, 0x5f, 0x36, 0x32, 0x30, 0x2c, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x29, 0x2e, +0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x61, 0x72, 0x61, +0x6d, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, +0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, +0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, +0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x38, 0x31, 0x20, 0x3d, +0x20, 0x66, 0x6f, 0x67, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x29, +0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x31, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, +0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, +0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, +0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, +0x65, 0x6c, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x49, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, +0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, +0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x38, 0x3b, +0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, +0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, +0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, +0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x42, 0x69, +0x74, 0x73, 0x54, 0x6f, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x38, 0x5d, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, +0x64, 0x29, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, +0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, +0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x63, +0x6c, 0x69, 0x70, 0x5f, 0x63, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3a, 0x20, +0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x00, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, +0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, +0x38, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, +0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x20, 0x32, 0x00, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, +0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, +0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x3b, +0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, +0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, +0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x20, 0x3d, +0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, +0x73, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, +0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x38, 0x5d, +0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x61, 0x5b, 0x5f, 0x37, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x38, 0x5d, 0x2e, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, +0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x30, 0x32, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x2e, 0x75, 0x76, 0x30, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x2e, 0x78, +0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x2e, +0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, +0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x3b, +0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, +0x31, 0x31, 0x36, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, +0x2f, 0x20, 0x5f, 0x31, 0x31, 0x39, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x20, 0x3d, +0x20, 0x5f, 0x31, 0x32, 0x30, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x38, 0x29, 0x3b, +0x00, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x31, 0x39, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x32, 0x30, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, +0x31, 0x32, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, +0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, +0x36, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x29, 0x20, +0x2a, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x78, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x31, 0x32, 0x30, 0x20, 0x2a, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x38, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, +0x31, 0x31, 0x36, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, +0x31, 0x31, 0x36, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, +0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x3b, 0x00, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, +0x32, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, +0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, +0x38, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x33, 0x30, +0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x36, +0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, +0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x36, +0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x36, 0x35, +0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x36, 0x35, 0x5b, +0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x5b, 0x33, 0x5d, 0x29, +0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x28, 0x5f, 0x32, 0x38, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x32, 0x38, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x32, 0x38, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x38, 0x35, +0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x30, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x30, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x30, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x33, 0x30, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, +0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x32, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x32, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x32, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x32, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, +0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x33, +0x34, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x33, 0x36, +0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x33, 0x38, 0x38, +0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, +0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x36, 0x20, 0x3d, 0x20, +0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x20, 0x2d, 0x20, +0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x34, +0x30, 0x36, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, +0x28, 0x5f, 0x33, 0x34, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x33, 0x34, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x33, 0x34, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x34, 0x37, +0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x36, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x36, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x33, 0x36, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, +0x5f, 0x33, 0x36, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x38, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x38, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x38, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, +0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x38, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, +0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, +0x5f, 0x34, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x36, 0x3b, 0x20, 0x5f, 0x34, 0x31, 0x34, 0x20, 0x3c, 0x20, +0x5f, 0x34, 0x30, 0x39, 0x3b, 0x20, 0x29, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x34, 0x32, 0x36, 0x20, 0x3d, 0x20, +0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, +0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x34, 0x31, 0x34, 0x20, 0x25, 0x20, 0x32, +0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x34, 0x31, 0x34, 0x20, 0x2f, 0x20, 0x32, 0x30, +0x34, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, +0x20, 0x5f, 0x34, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, +0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, +0x34, 0x32, 0x36, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, +0x5f, 0x34, 0x31, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x34, 0x33, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x34, 0x33, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x34, 0x33, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, +0x34, 0x32, 0x36, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x31, 0x34, 0x2b, 0x2b, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, +0x5f, 0x34, 0x31, 0x31, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, +0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x36, 0x37, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, 0x66, 0x6c, +0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x35, 0x31, 0x32, 0x29, 0x20, 0x21, +0x3d, 0x20, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x34, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x5f, 0x31, 0x35, 0x30, 0x3b, 0x00, 0x5f, 0x31, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, +0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, +0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, +0x20, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x34, 0x38, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x35, 0x31, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, +0x31, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, 0x6d, +0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x34, +0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x38, 0x2c, 0x20, 0x5f, 0x31, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, +0x31, 0x2c, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2b, 0x2b, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, +0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x35, 0x32, 0x5d, 0x2e, +0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x36, 0x31, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x37, 0x3b, 0x00, 0x5f, 0x31, 0x36, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x35, 0x32, 0x3b, 0x00, 0x5f, 0x31, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x31, 0x3b, 0x00, 0x5f, 0x31, 0x35, +0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x30, 0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, +0x63, 0x68, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x31, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x29, +0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x61, 0x5b, 0x5f, 0x31, 0x35, 0x32, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, +0x31, 0x34, 0x37, 0x3b, 0x00, 0x5f, 0x31, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x30, 0x3b, 0x00, 0x5f, 0x31, +0x36, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x30, 0x3b, 0x00, 0x5f, 0x31, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x65, +0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, +0x38, 0x33, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, +0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x32, 0x35, 0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x76, +0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x3b, +0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x31, 0x31, 0x35, 0x2c, 0x20, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x37, 0x38, 0x3b, 0x00, 0x5f, 0x31, 0x37, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, +0x31, 0x31, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x31, 0x37, 0x38, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x35, +0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x31, 0x37, 0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x2e, 0x7a, 0x3b, +0x00, 0x5f, 0x31, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x37, 0x38, 0x3b, 0x00, 0x5f, 0x31, 0x38, 0x33, 0x20, 0x3d, +0x20, 0x5f, 0x31, 0x36, 0x37, 0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, +0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x32, +0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, +0x2a, 0x20, 0x5f, 0x31, 0x38, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, +0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x38, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, +0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, +0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x38, 0x33, 0x2e, 0x78, 0x79, 0x7a, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x5f, 0x32, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x2e, 0x75, 0x76, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, +0x30, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x32, 0x30, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x31, 0x2e, 0x79, 0x3b, +0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, +0x32, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, +0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, +0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x30, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, +0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, +0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x35, 0x20, +0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, +0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x32, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x35, 0x3b, 0x00, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x36, 0x20, 0x2a, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, +0x35, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x78, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x36, 0x20, +0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x32, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, +0x31, 0x32, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, +0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x32, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x77, 0x29, +0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, +0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, +0x2d, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x31, 0x34, +0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, +0x5f, 0x32, 0x31, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x5f, 0x32, 0x31, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, +0x30, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, +0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, +0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, +0x54, 0x5d, 0x20, 0x2a, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, +0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, +0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, +0x2c, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, +0x5f, 0x37, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x38, 0x5d, 0x2e, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, +0x7a, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, +0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x38, +0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, +0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x32, +0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, +0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x31, +0x30, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x2e, 0x78, 0x20, +0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x38, +0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, +0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x32, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, +0x2b, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, +0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x30, 0x38, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x31, +0x36, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, +0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x31, 0x30, +0x38, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x32, 0x20, +0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, +0x2a, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x38, 0x2e, 0x7a, 0x20, 0x3d, +0x20, 0x28, 0x5f, 0x31, 0x30, 0x38, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x38, 0x2e, 0x77, 0x20, +0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, +0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x38, +0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, +0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, +0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, +0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, +0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, +0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, +0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x33, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, +0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, +0x64, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x70, 0x20, +0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x35, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x35, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x35, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, +0x2b, 0x20, 0x5f, 0x32, 0x35, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, +0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x37, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x37, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x37, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, +0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x39, 0x38, +0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x39, 0x38, 0x5b, +0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x39, 0x38, 0x5b, 0x32, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x39, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x28, 0x5f, 0x33, 0x31, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x33, 0x31, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x33, 0x31, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x31, 0x38, +0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, +0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x33, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, +0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x33, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, +0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, +0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, +0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x33, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, +0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, +0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x75, 0x69, +0x6e, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x77, 0x65, 0x69, +0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x5f, 0x34, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x38, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x64, 0x73, 0x2e, +0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x3b, 0x00, +0x5f, 0x34, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x33, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x33, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x33, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x33, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, +0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x35, 0x39, 0x5b, +0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x35, 0x39, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x35, 0x39, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x35, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, +0x5f, 0x33, 0x38, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x33, 0x38, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, +0x38, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x38, 0x30, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, +0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, +0x38, 0x3b, 0x20, 0x5f, 0x34, 0x30, 0x36, 0x20, 0x3c, 0x20, 0x5f, 0x34, 0x30, 0x31, 0x3b, 0x20, 0x29, 0x00, 0x76, 0x65, +0x63, 0x32, 0x20, 0x5f, 0x34, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, +0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, +0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x69, 0x6e, +0x74, 0x28, 0x5f, 0x34, 0x30, 0x36, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, +0x28, 0x5f, 0x34, 0x30, 0x36, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x2e, +0x78, 0x79, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x61, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x34, 0x31, 0x38, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x30, 0x33, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, +0x28, 0x5f, 0x34, 0x32, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x34, 0x32, 0x34, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x34, 0x32, 0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x34, 0x32, 0x34, +0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, 0x38, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x5f, 0x34, +0x30, 0x36, 0x2b, 0x2b, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x32, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, +0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, +0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, +0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, +0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, +0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x38, 0x33, 0x2e, +0x78, 0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x38, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x38, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, +0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, +0x3d, 0x20, 0x5f, 0x32, 0x30, 0x34, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, +0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x32, +0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x30, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, +0x32, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x38, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x30, +0x36, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x30, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x34, 0x2e, 0x78, 0x20, +0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x30, 0x37, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x30, 0x34, +0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x34, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, +0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x30, 0x38, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, +0x2b, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x30, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, +0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, +0x5f, 0x32, 0x30, 0x34, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x31, +0x32, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x30, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, +0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x32, 0x30, +0x34, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x30, 0x38, 0x20, +0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x30, 0x36, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, +0x2a, 0x20, 0x5f, 0x32, 0x30, 0x34, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x30, 0x34, 0x2e, 0x7a, 0x20, 0x3d, +0x20, 0x28, 0x5f, 0x32, 0x30, 0x34, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x30, 0x34, 0x2e, 0x77, 0x20, +0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, +0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x34, +0x3b, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x31, 0x30, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, +0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x69, 0x6e, 0x67, +0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x3a, 0x20, +0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x38, 0x29, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x74, +0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x00, 0x6c, 0x61, 0x79, +0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x29, 0x20, 0x6f, +0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x3b, +0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, +0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, +0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, +0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, +0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, +0x20, 0x5f, 0x33, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, +0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, +0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, +0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x30, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, +0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, +0x34, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, +0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x2e, 0x75, 0x76, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, +0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x32, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, +0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x3b, +0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, +0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, +0x30, 0x31, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x35, 0x37, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5b, 0x32, 0x35, 0x36, 0x5d, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, +0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, +0x72, 0x72, 0x61, 0x79, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, +0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, +0x20, 0x5f, 0x36, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, +0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, +0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, +0x5f, 0x36, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, +0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, +0x37, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, +0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, +0x33, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, +0x36, 0x35, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, +0x35, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x35, +0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, 0x35, 0x37, 0x5b, 0x33, +0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x28, 0x5f, 0x36, 0x38, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x36, 0x38, 0x34, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x5f, 0x36, 0x38, 0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, +0x38, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, +0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x31, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, +0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x31, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x31, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, +0x20, 0x2b, 0x20, 0x5f, 0x37, 0x31, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, +0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x38, 0x5b, 0x30, 0x5d, +0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x38, 0x5b, 0x31, 0x5d, 0x20, +0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x33, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, +0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, +0x5f, 0x37, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, +0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, +0x37, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, +0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, +0x31, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x35, 0x36, 0x3b, +0x00, 0x5f, 0x39, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x36, 0x35, 0x5b, 0x30, 0x5d, 0x20, +0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x36, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x36, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x36, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, +0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x39, 0x32, +0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x39, 0x32, 0x5b, +0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x39, 0x32, 0x5b, 0x32, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x28, 0x5f, 0x38, 0x31, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x38, 0x31, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x38, 0x31, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x31, 0x39, +0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, +0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x32, +0x36, 0x35, 0x3b, 0x20, 0x5f, 0x39, 0x35, 0x35, 0x20, 0x3c, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x3b, 0x20, 0x29, 0x00, 0x76, +0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, +0x68, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, +0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x69, +0x6e, 0x74, 0x28, 0x5f, 0x39, 0x35, 0x35, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, +0x74, 0x28, 0x5f, 0x39, 0x35, 0x35, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, +0x2e, 0x78, 0x79, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x36, 0x20, 0x2b, 0x3d, 0x20, 0x28, +0x28, 0x28, 0x5f, 0x38, 0x34, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x5f, 0x38, 0x34, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x38, 0x34, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x34, +0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x5f, +0x39, 0x35, 0x35, 0x2b, 0x2b, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x36, 0x3b, 0x00, 0x69, 0x76, 0x65, +0x63, 0x33, 0x20, 0x5f, 0x39, 0x35, 0x31, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, +0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, +0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, +0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x35, 0x33, 0x3b, 0x00, 0x69, 0x76, 0x65, +0x63, 0x33, 0x20, 0x5f, 0x39, 0x35, 0x34, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, +0x34, 0x37, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x39, 0x34, 0x37, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, +0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x39, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x34, 0x2c, 0x20, 0x5f, +0x39, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x33, 0x2c, 0x20, 0x5f, 0x39, 0x34, 0x37, 0x2b, 0x2b, 0x29, 0x00, +0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x61, 0x5b, 0x5f, 0x39, 0x34, 0x37, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, +0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x31, 0x3b, 0x00, 0x5f, 0x38, +0x37, 0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x37, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x34, 0x20, 0x3d, 0x20, +0x5f, 0x38, 0x37, 0x38, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x38, 0x20, 0x2b, 0x20, +0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, +0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, +0x20, 0x5f, 0x38, 0x37, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x39, 0x34, 0x37, 0x5d, 0x2e, 0x78, 0x29, 0x3b, +0x00, 0x5f, 0x39, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x31, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x33, 0x20, 0x3d, +0x20, 0x5f, 0x39, 0x34, 0x38, 0x3b, 0x00, 0x5f, 0x39, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x35, 0x30, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x39, 0x2e, 0x78, 0x79, 0x7a, +0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x35, 0x35, 0x34, 0x2c, +0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, 0x38, 0x30, 0x3b, 0x00, 0x5f, 0x38, 0x38, 0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x35, 0x35, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x38, 0x38, 0x30, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, +0x34, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x38, 0x38, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x2e, 0x7a, +0x3b, 0x00, 0x5f, 0x39, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x38, 0x30, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x30, 0x20, +0x3d, 0x20, 0x5f, 0x39, 0x34, 0x39, 0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, +0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x38, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, +0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x35, 0x30, 0x2e, 0x78, 0x79, +0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x35, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x39, 0x35, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x38, 0x37, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x37, 0x36, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, +0x31, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x37, 0x36, 0x2e, 0x75, 0x76, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, +0x34, 0x36, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x37, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x34, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x37, 0x31, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x39, 0x34, 0x31, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x36, 0x34, 0x35, 0x20, 0x3d, 0x20, +0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, +0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x36, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, +0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x36, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, +0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, +0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x36, 0x34, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x34, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x34, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, 0x34, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, +0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x36, 0x37, 0x32, 0x5b, +0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x37, 0x32, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x37, 0x32, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, 0x37, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, +0x5f, 0x36, 0x39, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x36, 0x39, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x36, +0x39, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, 0x39, 0x39, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, +0x5f, 0x37, 0x32, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x2e, 0x77, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, +0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, +0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x34, 0x30, 0x3b, 0x00, 0x5f, 0x39, 0x34, 0x30, 0x20, 0x3d, 0x20, +0x28, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x35, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x37, 0x35, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x37, 0x35, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, +0x37, 0x35, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, +0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, +0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, +0x20, 0x2b, 0x20, 0x5f, 0x37, 0x38, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, +0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x37, 0x5b, 0x30, 0x5d, +0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x37, 0x5b, 0x31, 0x5d, 0x20, +0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, +0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, +0x6e, 0x74, 0x20, 0x5f, 0x39, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x3b, 0x20, 0x5f, 0x39, 0x33, 0x39, +0x20, 0x3c, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x3b, 0x20, 0x29, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x30, 0x32, +0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, +0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, +0x68, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x39, 0x33, 0x39, 0x20, +0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x39, 0x33, 0x39, 0x20, 0x2f, +0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x6d, 0x61, 0x74, +0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, +0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x75, 0x69, 0x6e, +0x74, 0x28, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, +0x29, 0x3b, 0x00, 0x5f, 0x39, 0x34, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x33, 0x34, 0x5b, 0x30, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x33, 0x34, 0x5b, 0x31, 0x5d, +0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x33, 0x34, 0x5b, 0x32, 0x5d, 0x20, +0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x33, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, +0x2a, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x39, 0x2b, 0x2b, 0x3b, 0x00, 0x70, +0x20, 0x3d, 0x20, 0x5f, 0x39, 0x34, 0x30, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x33, 0x35, 0x3b, +0x00, 0x5f, 0x39, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, +0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, +0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x39, 0x33, 0x37, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x33, 0x38, 0x3b, +0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, +0x5f, 0x39, 0x33, 0x31, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, +0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x39, +0x33, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x38, 0x2c, 0x20, 0x5f, 0x39, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x39, +0x33, 0x37, 0x2c, 0x20, 0x5f, 0x39, 0x33, 0x31, 0x2b, 0x2b, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, +0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x39, 0x33, 0x31, 0x5d, +0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x36, +0x32, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x35, 0x3b, 0x00, 0x5f, 0x38, 0x36, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, +0x39, 0x33, 0x31, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x32, 0x3b, 0x00, 0x5f, 0x39, +0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, +0x74, 0x63, 0x68, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, +0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x38, 0x36, 0x32, 0x2c, 0x20, 0x30, +0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x61, 0x5b, 0x5f, 0x39, 0x33, 0x31, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x38, 0x20, 0x3d, 0x20, +0x5f, 0x39, 0x33, 0x35, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x32, 0x3b, 0x00, 0x5f, +0x39, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x33, 0x34, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, +0x32, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x35, 0x34, 0x32, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, +0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, +0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, 0x36, +0x34, 0x3b, 0x00, 0x5f, 0x38, 0x36, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x2e, 0x78, 0x3b, 0x00, +0x5f, 0x38, 0x36, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x38, 0x36, +0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x34, 0x20, 0x3d, +0x20, 0x5f, 0x38, 0x36, 0x34, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x33, 0x3b, 0x00, +0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, +0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x33, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x78, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x33, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x39, 0x33, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, +0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, +0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, +0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, +0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x65, +0x63, 0x33, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x34, 0x20, +0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x33, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x20, +0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, +0x35, 0x33, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x39, 0x34, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, +0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x39, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, 0x66, 0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, -0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x31, -0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x6d, 0x70, -0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x32, 0x37, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, -0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, -0x33, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x30, 0x36, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x29, 0x3b, 0x00, -0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x30, 0x38, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x65, -0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, -0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, -0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, -0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x31, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, -0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, -0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, -0x2e, 0x30, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, -0x35, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x37, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, -0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x70, 0x5f, -0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x35, 0x37, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x70, -0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x33, 0x34, 0x31, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, -0x20, 0x5f, 0x33, 0x32, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x31, 0x20, 0x3d, 0x20, 0x63, -0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x5f, -0x33, 0x37, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x35, -0x34, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x36, 0x30, 0x38, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, -0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x2e, 0x78, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, -0x5f, 0x33, 0x37, 0x37, 0x2e, 0x79, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, -0x37, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x61, -0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, -0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, -0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x35, 0x37, -0x36, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, -0x20, 0x5f, 0x35, 0x37, 0x38, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x35, -0x37, 0x36, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x37, -0x2c, 0x20, 0x5f, 0x35, 0x37, 0x38, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, -0x65, 0x63, 0x34, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, -0x72, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, -0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, -0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, -0x34, 0x20, 0x5f, 0x34, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2c, 0x20, -0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x29, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, -0x3d, 0x20, 0x5f, 0x34, 0x35, 0x33, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, -0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, -0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, -0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, -0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, -0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x68, 0x69, 0x67, 0x68, 0x70, -0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x69, -0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x35, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, -0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, -0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x69, 0x6e, 0x20, -0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, -0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x42, 0x69, 0x74, 0x73, 0x54, 0x6f, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6f, 0x62, -0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, -0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, -0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, -0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, -0x47, 0x4c, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x63, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, -0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x00, 0x23, 0x69, 0x66, 0x6e, -0x64, 0x65, 0x66, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, -0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x00, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x50, -0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, -0x44, 0x5f, 0x38, 0x20, 0x32, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, -0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, -0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, -0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x38, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x69, -0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, -0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, -0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x38, -0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, -0x6d, 0x73, 0x2e, 0x62, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, -0x3b, 0x00, 0x5f, 0x38, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x38, 0x35, -0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x38, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, -0x5f, 0x38, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x4d, 0x61, -0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, -0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x37, 0x37, 0x5d, -0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, -0x78, 0x20, 0x2a, 0x20, 0x5f, 0x38, 0x35, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x32, 0x2e, 0x78, -0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, -0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, -0x20, 0x5f, 0x39, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, -0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x2e, 0x7a, 0x3b, 0x00, -0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, -0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, -0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x32, 0x3b, 0x00, 0x76, 0x65, 0x72, -0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x3b, -0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, -0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x5f, 0x31, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, -0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, -0x30, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, -0x38, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x36, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, -0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, -0x2f, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x30, 0x34, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, -0x5f, 0x31, 0x30, 0x38, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x29, -0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, -0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x2e, 0x78, 0x20, -0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, -0x30, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, -0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x38, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x28, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x2e, -0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x2e, -0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, -0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, -0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x37, 0x3b, 0x00, 0x6d, 0x61, 0x74, -0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, -0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, -0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, -0x78, 0x33, 0x20, 0x5f, 0x33, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, -0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, -0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, -0x33, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, -0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, -0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, -0x20, 0x5f, 0x33, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, -0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x5d, -0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, -0x28, 0x28, 0x5f, 0x32, 0x38, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, -0x28, 0x5f, 0x32, 0x38, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, -0x5f, 0x32, 0x38, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x38, -0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, -0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x30, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, -0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x30, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, -0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x30, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, -0x20, 0x5f, 0x33, 0x30, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, -0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x32, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, -0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x32, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, -0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x32, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, -0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, -0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x34, 0x39, -0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x34, 0x39, 0x5b, -0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x34, 0x39, 0x5b, 0x32, -0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x34, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, -0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, -0x78, 0x33, 0x20, 0x5f, 0x33, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, -0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, -0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, -0x33, 0x20, 0x5f, 0x33, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, -0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, -0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, -0x20, 0x5f, 0x34, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, -0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, -0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, -0x32, 0x39, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, -0x77, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x32, -0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, -0x75, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x33, 0x34, 0x3b, 0x00, 0x5f, 0x34, 0x33, 0x34, 0x20, -0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x37, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, -0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x37, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, -0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x37, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, -0x20, 0x5f, 0x33, 0x37, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, -0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x39, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, -0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x39, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, -0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x39, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, -0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x39, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, -0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x34, 0x31, 0x31, 0x5b, -0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x34, 0x31, 0x31, 0x5b, 0x31, -0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x34, 0x31, 0x31, 0x5b, 0x32, 0x5d, -0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, -0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, -0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x3b, 0x20, 0x5f, 0x34, -0x33, 0x37, 0x20, 0x3c, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x3b, 0x20, 0x29, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x34, -0x34, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x62, 0x6f, 0x6e, 0x65, -0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, -0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x34, 0x33, -0x37, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x34, 0x33, 0x37, -0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x6d, -0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x34, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, -0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x75, -0x69, 0x6e, 0x74, 0x28, 0x5f, 0x34, 0x34, 0x39, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, -0x72, 0x6d, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x33, 0x34, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x34, 0x35, 0x35, -0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x34, 0x35, 0x35, 0x5b, -0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x34, 0x35, 0x35, 0x5b, 0x32, -0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x34, 0x35, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, -0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x33, 0x37, 0x2b, 0x2b, 0x3b, -0x00, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x34, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x20, -0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, +0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x39, +0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x39, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x5f, +0x31, 0x39, 0x34, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x67, 0x7a, 0x7a, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x68, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, +0x7a, 0x3b, 0x00, 0x5f, 0x36, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x30, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, +0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, +0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, +0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, +0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x35, 0x33, 0x20, 0x2a, 0x20, +0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x39, 0x34, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x35, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x75, 0x76, 0x30, 0x31, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, +0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, +0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, +0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, +0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x69, 0x6e, 0x20, +0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, +0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x4d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x34, 0x30, 0x33, +0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, +0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x78, 0x2c, +0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, +0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, +0x38, 0x37, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x38, 0x37, 0x5d, 0x2e, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, +0x7a, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x38, 0x37, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, +0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, +0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, +0x38, 0x37, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x39, +0x38, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, +0x30, 0x33, 0x2e, 0x75, 0x76, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x39, 0x38, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, +0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, +0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x30, 0x35, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, +0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x33, 0x39, 0x38, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x20, +0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, -0x4e, 0x54, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x31, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, -0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, -0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x35, 0x31, 0x32, 0x29, -0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x36, 0x31, 0x3b, 0x00, 0x69, 0x66, -0x20, 0x28, 0x5f, 0x31, 0x33, 0x33, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x34, 0x31, 0x3b, 0x00, -0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x34, 0x34, 0x3b, 0x00, 0x5f, 0x31, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x69, 0x76, -0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x25, 0x20, 0x32, 0x30, -0x34, 0x38, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, -0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, -0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x34, 0x32, -0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x34, 0x35, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, -0x74, 0x20, 0x5f, 0x31, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x34, 0x36, 0x20, 0x3c, 0x20, 0x6f, -0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, -0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, -0x5f, 0x31, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2c, 0x20, 0x5f, 0x31, 0x34, 0x34, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x34, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x34, 0x36, 0x2b, 0x2b, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, -0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x34, -0x36, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, -0x31, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x31, 0x3b, 0x00, 0x5f, 0x31, 0x35, 0x35, 0x2e, 0x7a, 0x20, 0x3d, -0x20, 0x5f, 0x31, 0x34, 0x36, 0x3b, 0x00, 0x5f, 0x31, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x35, 0x3b, 0x00, -0x5f, 0x31, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, -0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, -0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x31, 0x35, 0x35, 0x2c, -0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x34, 0x36, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x34, 0x32, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x34, 0x31, 0x3b, 0x00, 0x5f, 0x31, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x34, 0x3b, -0x00, 0x5f, 0x31, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x34, 0x3b, 0x00, 0x5f, 0x31, 0x36, 0x31, 0x20, 0x3d, -0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, -0x20, 0x5f, 0x31, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, -0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x32, 0x35, 0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x00, 0x69, -0x66, 0x20, 0x28, 0x5f, 0x31, 0x36, 0x33, 0x29, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x20, 0x3d, -0x20, 0x5f, 0x31, 0x36, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x31, 0x31, 0x35, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, -0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, -0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x37, 0x3b, 0x00, -0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x37, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x38, -0x30, 0x3b, 0x00, 0x5f, 0x31, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, -0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, -0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, -0x5f, 0x31, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x37, 0x38, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, -0x31, 0x38, 0x31, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x32, 0x20, 0x3d, -0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x38, 0x32, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, -0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x37, 0x38, 0x2c, 0x20, 0x5f, 0x31, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x31, 0x2c, 0x20, 0x5f, 0x31, -0x38, 0x32, 0x2b, 0x2b, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x38, 0x32, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, -0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x37, 0x37, 0x3b, 0x00, 0x5f, 0x31, 0x39, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x32, 0x3b, 0x00, 0x5f, -0x31, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x31, 0x3b, 0x00, 0x5f, 0x31, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x38, 0x30, 0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x6d, 0x6f, -0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x31, 0x39, 0x31, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, -0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x38, -0x32, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x37, 0x37, 0x3b, 0x00, -0x5f, 0x31, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x30, 0x3b, 0x00, 0x5f, 0x31, 0x39, 0x37, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x38, 0x30, 0x3b, 0x00, 0x5f, 0x31, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x3b, 0x00, 0x76, -0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x3b, -0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x31, 0x31, 0x34, 0x2c, 0x20, -0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x6d, -0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x00, 0x76, -0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x37, 0x3b, 0x00, 0x5f, 0x32, 0x30, -0x36, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x32, 0x30, 0x36, 0x2e, 0x79, -0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x32, 0x30, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x31, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x36, 0x3b, -0x00, 0x5f, 0x32, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, -0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, -0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, -0x5f, 0x32, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x36, 0x2e, 0x78, 0x20, -0x3d, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, -0x32, 0x31, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x34, -0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, -0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, -0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x32, 0x34, 0x5d, 0x2e, -0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, -0x20, 0x2a, 0x20, 0x5f, 0x32, 0x31, 0x36, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x33, -0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x76, -0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, -0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, -0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, -0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, -0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x32, -0x33, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, -0x20, 0x5f, 0x32, 0x33, 0x35, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, -0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, -0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, -0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x32, 0x2e, -0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x33, 0x38, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x33, -0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x39, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x33, 0x37, -0x29, 0x3b, 0x00, 0x5f, 0x32, 0x33, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x2e, 0x78, 0x20, 0x2a, -0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x33, 0x38, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x33, 0x35, 0x2e, -0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, -0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x39, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, -0x20, 0x5f, 0x32, 0x34, 0x33, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, -0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, -0x32, 0x33, 0x35, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x34, 0x33, -0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, -0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x32, 0x33, 0x35, -0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x39, 0x20, 0x2a, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x33, 0x37, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, -0x20, 0x5f, 0x32, 0x33, 0x35, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x33, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, -0x28, 0x5f, 0x32, 0x33, 0x35, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x35, 0x2e, 0x77, 0x20, 0x2a, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, -0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x3b, -0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x32, 0x34, 0x3b, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x31, 0x30, 0x00, 0x23, 0x65, 0x78, -0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x69, -0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, -0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, -0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x38, 0x29, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x69, -0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x00, 0x6c, -0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, -0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, -0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, -0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, -0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, -0x33, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, -0x6d, 0x73, 0x2e, 0x62, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, -0x32, 0x33, 0x3b, 0x00, 0x5f, 0x33, 0x34, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x2e, 0x78, 0x3b, -0x00, 0x5f, 0x33, 0x34, 0x35, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x33, -0x34, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, -0x5f, 0x33, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, -0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, -0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, -0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x34, 0x35, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, -0x36, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, -0x5f, 0x33, 0x33, 0x36, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5b, 0x32, 0x35, 0x36, 0x5d, 0x3b, 0x00, 0x75, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x62, 0x6f, 0x6e, -0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, -0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, -0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, -0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x00, -0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, +0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, +0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x37, 0x20, +0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, 0x36, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x32, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, +0x5f, 0x32, 0x32, 0x32, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x37, +0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, 0x36, 0x29, 0x3b, 0x00, 0x5f, +0x32, 0x31, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, +0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x32, 0x37, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, +0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x33, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x2e, 0x77, 0x29, +0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, +0x5f, 0x32, 0x33, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, +0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, +0x5f, 0x32, 0x31, 0x37, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, +0x32, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x31, 0x29, +0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x31, 0x37, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x31, 0x37, 0x2e, +0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x37, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x37, +0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, +0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, +0x32, 0x31, 0x37, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x38, 0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x33, 0x3b, 0x00, +0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, -0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x37, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, +0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, -0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, +0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, -0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, +0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, -0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x34, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, -0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x34, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x28, 0x5f, 0x37, 0x34, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, -0x5f, 0x37, 0x34, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, -0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, -0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, -0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x37, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, -0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x32, 0x5b, 0x30, -0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x32, 0x5b, 0x31, 0x5d, -0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x32, 0x5b, 0x32, 0x5d, 0x20, -0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, +0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, +0x5f, 0x37, 0x33, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x35, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x35, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, +0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x35, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x35, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, +0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x36, 0x5b, 0x30, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x36, 0x5b, 0x31, 0x5d, +0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x36, 0x5b, 0x32, 0x5d, 0x20, +0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x38, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, -0x38, 0x32, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, -0x32, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x32, -0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x32, 0x39, 0x5b, 0x33, +0x38, 0x31, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, +0x31, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x31, +0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x31, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x6d, -0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, +0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, -0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, +0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, -0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, +0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, -0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, -0x20, 0x5f, 0x31, 0x30, 0x36, 0x39, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, -0x5f, 0x38, 0x35, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, -0x38, 0x35, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, -0x35, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x35, 0x36, 0x5b, -0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x38, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x28, 0x5f, 0x38, 0x38, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x5f, 0x38, 0x38, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, -0x38, 0x38, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, -0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, -0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, -0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x31, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, -0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, -0x31, 0x30, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x38, 0x20, 0x3c, -0x20, 0x5f, 0x32, 0x37, 0x30, 0x3b, 0x20, 0x29, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x20, 0x3d, -0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, -0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, -0x73, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x36, 0x38, 0x20, 0x25, -0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x36, 0x38, 0x20, 0x2f, -0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x6d, 0x61, 0x74, -0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, -0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x75, 0x69, 0x6e, -0x74, 0x28, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, -0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x39, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x37, 0x5b, -0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x37, 0x5b, 0x31, -0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x37, 0x5b, 0x32, 0x5d, -0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x33, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, -0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x38, 0x2b, 0x2b, 0x3b, -0x00, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x39, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x35, 0x35, -0x35, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x66, 0x6c, -0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x35, 0x31, 0x32, 0x29, 0x20, 0x21, -0x3d, 0x20, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x3b, 0x00, 0x69, 0x66, 0x20, -0x28, 0x5f, 0x35, 0x35, 0x35, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x32, 0x3b, 0x00, -0x5f, 0x31, 0x30, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, -0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, -0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x69, 0x76, -0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x37, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, -0x5f, 0x31, 0x30, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x20, 0x3c, 0x20, 0x6f, -0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, -0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, -0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x30, 0x36, 0x37, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x34, 0x2c, 0x20, -0x5f, 0x31, 0x30, 0x35, 0x33, 0x2b, 0x2b, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, -0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x5d, 0x2e, 0x78, -0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x37, 0x30, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x32, 0x3b, 0x00, 0x5f, 0x39, 0x37, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x30, 0x35, 0x33, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x30, 0x3b, 0x00, 0x5f, -0x31, 0x30, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, 0x65, -0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, -0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x39, 0x37, 0x30, -0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, -0x36, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x32, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x34, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x30, 0x35, 0x34, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x34, -0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x35, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, -0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, -0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, -0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x32, 0x35, 0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x00, 0x69, 0x66, -0x20, 0x28, 0x5f, 0x35, 0x36, 0x33, 0x29, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, 0x39, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x30, 0x35, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x35, 0x34, 0x39, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, -0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, -0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x30, -0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, -0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, -0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, -0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x35, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, -0x20, 0x5f, 0x31, 0x30, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x36, 0x20, 0x3c, 0x20, -0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, -0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, -0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x30, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x30, 0x36, 0x36, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x35, 0x2c, -0x20, 0x5f, 0x31, 0x30, 0x35, 0x36, 0x2b, 0x2b, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, -0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x35, 0x36, 0x5d, 0x2e, -0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x37, 0x38, -0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x30, 0x3b, 0x00, 0x5f, 0x39, 0x37, 0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x30, 0x35, 0x36, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x38, 0x3b, 0x00, -0x5f, 0x31, 0x30, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x37, 0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, -0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, -0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x39, 0x37, -0x38, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x35, 0x36, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x31, -0x30, 0x36, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x30, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x35, 0x20, 0x3d, -0x20, 0x5f, 0x31, 0x30, 0x35, 0x37, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, -0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, -0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x38, -0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, -0x36, 0x35, 0x38, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, -0x65, 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, -0x73, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, -0x38, 0x3b, 0x00, 0x5f, 0x39, 0x38, 0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x38, 0x2e, 0x78, 0x3b, 0x00, -0x5f, 0x39, 0x38, 0x30, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x39, 0x38, -0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x39, 0x20, -0x3d, 0x20, 0x5f, 0x39, 0x38, 0x30, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, -0x38, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x39, -0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, -0x73, 0x2e, 0x62, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, -0x35, 0x39, 0x3b, 0x00, 0x5f, 0x39, 0x38, 0x36, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, 0x35, 0x2e, 0x78, 0x3b, -0x00, 0x5f, 0x39, 0x38, 0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x39, -0x38, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x34, 0x35, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, -0x5f, 0x39, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, -0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, -0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, -0x78, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x38, 0x36, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x36, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, -0x31, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, -0x5f, 0x39, 0x36, 0x31, 0x3b, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, -0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x3b, 0x00, 0x6c, 0x61, 0x79, -0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x69, 0x6e, -0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x6f, 0x67, 0x28, 0x69, 0x6e, 0x6f, -0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, -0x76, 0x69, 0x65, 0x77, 0x29, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x6c, -0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, -0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x61, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x79, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x5f, 0x36, 0x30, 0x35, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x6d, -0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, -0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x32, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x48, 0x61, 0x6c, 0x66, -0x32, 0x78, 0x31, 0x36, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x7a, -0x7a, 0x29, 0x3b, 0x00, 0x5f, 0x36, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, -0x64, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, -0x73, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x67, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, -0x20, 0x2a, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x79, 0x2c, -0x20, 0x5f, 0x32, 0x38, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x5f, 0x31, 0x38, 0x36, -0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x67, 0x7a, 0x7a, -0x29, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, -0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, -0x5f, 0x36, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6a, 0x7a, 0x2e, 0x77, 0x29, 0x20, 0x2a, -0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, -0x69, 0x7a, 0x65, 0x28, 0x76, 0x69, 0x65, 0x77, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x68, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x7a, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, -0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, -0x28, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x65, 0x7a, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x33, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x7a, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, -0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x5b, 0x33, 0x5d, 0x2e, -0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, -0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, -0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3b, 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, -0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x37, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, -0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, -0x39, 0x36, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, -0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, -0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x6d, -0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, -0x33, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, -0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, -0x5f, 0x34, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x35, 0x3b, 0x00, 0x5f, 0x34, 0x32, 0x31, 0x2e, 0x78, 0x20, -0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x34, 0x32, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, -0x33, 0x38, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x34, 0x32, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, -0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, -0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x6f, 0x62, 0x6a, -0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x39, 0x36, 0x5d, 0x2e, -0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, -0x20, 0x2a, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x32, -0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x76, -0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, -0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, -0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, -0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, -0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, -0x32, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, -0x20, 0x5f, 0x32, 0x32, 0x32, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, -0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, -0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, -0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x32, 0x2e, -0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x33, 0x30, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x32, -0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x31, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x32, 0x37, -0x29, 0x3b, 0x00, 0x5f, 0x32, 0x32, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x2e, 0x78, 0x20, 0x2a, -0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x33, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x32, 0x32, 0x2e, -0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, -0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x31, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, -0x20, 0x5f, 0x32, 0x34, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, -0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, -0x32, 0x32, 0x32, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x34, 0x32, -0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, -0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x32, 0x32, 0x32, -0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x31, 0x20, 0x2a, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x32, 0x37, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, -0x20, 0x5f, 0x32, 0x32, 0x32, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x32, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, -0x28, 0x5f, 0x32, 0x32, 0x32, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x32, 0x32, 0x2e, 0x77, 0x20, 0x2a, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, -0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x3b, -0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x39, 0x36, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x72, -0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, -0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, -0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, -0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, -0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, -0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, -0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, -0x5b, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, -0x70, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x32, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, -0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x32, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, -0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x32, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x32, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, -0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x30, 0x5b, 0x30, 0x5d, -0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x30, 0x5b, 0x31, 0x5d, 0x20, -0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, -0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x35, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, -0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, -0x37, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x37, -0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x37, 0x37, -0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x37, 0x37, 0x5b, 0x33, 0x5d, -0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x28, 0x5f, 0x39, 0x30, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x5f, 0x39, 0x30, 0x34, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, -0x28, 0x5f, 0x39, 0x30, 0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, -0x30, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, -0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, -0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, -0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, -0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, -0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, -0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, -0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, -0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x77, -0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x75, 0x69, -0x6e, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x64, -0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x35, -0x35, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x31, 0x5b, -0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x31, 0x5b, 0x31, -0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x31, 0x5b, 0x32, 0x5d, -0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x33, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, -0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, -0x39, 0x35, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, -0x35, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x35, -0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x35, 0x38, 0x5b, 0x33, -0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x38, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x28, 0x5f, 0x39, 0x38, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x5f, 0x39, 0x38, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, -0x39, 0x38, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, -0x7a, 0x29, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x34, 0x20, -0x3d, 0x20, 0x5f, 0x32, 0x37, 0x32, 0x3b, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x34, 0x20, 0x3c, 0x20, 0x5f, 0x32, 0x37, 0x37, -0x3b, 0x20, 0x29, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, -0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, -0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x76, -0x65, 0x63, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x35, 0x34, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, -0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x35, 0x34, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, -0x75, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, -0x31, 0x30, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, -0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x33, -0x30, 0x39, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x5f, -0x31, 0x31, 0x35, 0x35, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x30, 0x31, 0x32, 0x5b, 0x30, 0x5d, 0x20, -0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x30, 0x31, 0x32, 0x5b, 0x31, 0x5d, 0x20, -0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x30, 0x31, 0x32, 0x5b, 0x32, 0x5d, 0x20, -0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, -0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x35, 0x34, 0x2b, 0x2b, 0x3b, -0x00, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x35, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x39, -0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, -0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, -0x55, 0x4e, 0x54, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x36, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, -0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x35, 0x39, 0x5d, -0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x35, 0x31, 0x32, -0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x31, 0x3b, 0x00, -0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x32, 0x36, 0x29, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x30, -0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x38, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x34, 0x38, -0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, -0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, -0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x34, 0x30, 0x20, 0x3d, -0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, -0x20, 0x5f, 0x31, 0x31, 0x35, 0x30, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x33, 0x3b, -0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x30, 0x3b, -0x20, 0x5f, 0x31, 0x31, 0x33, 0x39, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x35, 0x39, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, -0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x31, 0x35, 0x33, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x30, 0x2c, 0x20, -0x5f, 0x31, 0x31, 0x33, 0x39, 0x2b, 0x2b, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, -0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x31, 0x33, 0x39, 0x5d, 0x2e, 0x78, -0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, -0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x38, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x31, 0x33, 0x39, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, -0x3b, 0x00, 0x5f, 0x31, 0x31, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x30, 0x20, 0x2b, 0x20, 0x28, 0x74, -0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, -0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, -0x31, 0x30, 0x34, 0x35, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x31, 0x33, 0x39, 0x5d, 0x2e, 0x78, 0x29, 0x3b, -0x00, 0x5f, 0x31, 0x31, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x38, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x35, -0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x30, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x31, 0x34, 0x30, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, -0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x36, 0x33, 0x34, 0x20, 0x3d, -0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, -0x34, 0x35, 0x39, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, -0x20, 0x32, 0x35, 0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x33, 0x34, -0x29, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x31, 0x2e, -0x78, 0x79, 0x7a, 0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x36, -0x32, 0x30, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, -0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, -0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x34, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, -0x5f, 0x31, 0x31, 0x34, 0x33, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x36, 0x3b, 0x00, -0x5f, 0x31, 0x31, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, +0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x5f, 0x32, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, +0x74, 0x73, 0x2e, 0x77, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, +0x32, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x20, +0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x3b, 0x00, 0x5f, +0x31, 0x30, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x34, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, +0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x36, 0x37, 0x5b, +0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x36, 0x37, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x36, 0x37, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x36, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, +0x5f, 0x38, 0x39, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x38, 0x39, 0x34, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, +0x39, 0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x39, 0x34, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, +0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x32, +0x37, 0x32, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x31, 0x20, 0x3c, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x3b, 0x20, 0x29, 0x00, +0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, +0x63, 0x68, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, +0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, +0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x31, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, +0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x31, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x2c, +0x20, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x32, 0x31, 0x20, +0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x33, 0x30, 0x39, 0x2e, 0x78, 0x29, +0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x20, +0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x32, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x32, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x32, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x39, 0x32, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x2e, 0x79, +0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x34, 0x31, 0x2b, 0x2b, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, +0x32, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, +0x20, 0x5f, 0x31, 0x30, 0x33, 0x35, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x39, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, +0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x35, 0x31, 0x32, 0x29, 0x20, 0x21, 0x3d, 0x20, +0x30, 0x29, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x34, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, +0x20, 0x5f, 0x31, 0x30, 0x33, 0x37, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, +0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, +0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, +0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x3b, +0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x30, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, +0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x20, +0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, +0x34, 0x34, 0x39, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, +0x74, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x30, 0x2c, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x2b, 0x2b, +0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, +0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x39, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x37, +0x3b, 0x00, 0x5f, 0x39, 0x35, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x3b, 0x00, 0x5f, 0x31, +0x30, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x33, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x30, 0x33, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, +0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x39, 0x35, 0x33, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, +0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, +0x31, 0x30, 0x33, 0x33, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x37, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x34, 0x3b, 0x00, +0x5f, 0x31, 0x30, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x34, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x33, 0x35, +0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x36, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x39, 0x5d, 0x2e, 0x66, 0x6c, +0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x32, 0x35, 0x36, 0x29, 0x20, 0x21, +0x3d, 0x20, 0x30, 0x29, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, +0x33, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x28, 0x5f, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, +0x68, 0x74, 0x73, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x35, 0x35, 0x3b, 0x00, 0x5f, 0x39, 0x35, +0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x32, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x35, 0x2e, 0x79, +0x20, 0x3d, 0x20, 0x5f, 0x36, 0x32, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, +0x5f, 0x36, 0x32, 0x35, 0x2e, 0x7a, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x35, +0x3b, 0x00, 0x5f, 0x31, 0x30, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x35, 0x3b, 0x00, 0x4d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x5f, 0x39, +0x35, 0x31, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, +0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, +0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, +0x2c, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, +0x5f, 0x34, 0x34, 0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, +0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x36, 0x2e, 0x78, 0x79, +0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x39, 0x5d, 0x2e, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x39, +0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x34, 0x36, 0x20, +0x3d, 0x20, 0x5f, 0x39, 0x35, 0x31, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x31, +0x2e, 0x75, 0x76, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x39, +0x34, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x37, 0x2e, 0x78, 0x3b, +0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x37, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, +0x34, 0x36, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, +0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, +0x39, 0x34, 0x36, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x39, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x38, 0x34, 0x20, 0x3d, 0x20, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, +0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x38, 0x38, 0x20, 0x3d, 0x20, +0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, +0x39, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x38, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x34, +0x38, 0x34, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x37, 0x39, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x39, 0x2e, 0x78, +0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x37, +0x39, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x39, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, +0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x38, 0x38, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, +0x20, 0x2b, 0x20, 0x5f, 0x34, 0x39, 0x39, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x37, 0x39, 0x2e, 0x77, 0x29, 0x3b, 0x00, +0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, +0x20, 0x5f, 0x34, 0x37, 0x39, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x34, +0x39, 0x39, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x37, 0x39, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, +0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x34, +0x37, 0x39, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x34, 0x38, 0x38, +0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x34, 0x38, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x5f, 0x34, 0x37, 0x39, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x37, 0x39, 0x2e, 0x7a, 0x20, +0x3d, 0x20, 0x28, 0x5f, 0x34, 0x37, 0x39, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x37, 0x39, 0x2e, 0x77, +0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, +0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, +0x39, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x34, 0x34, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x4d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, +0x65, 0x63, 0x32, 0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, +0x2d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x38, 0x37, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x30, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, +0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x38, 0x37, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x5b, 0x5f, 0x31, 0x38, 0x37, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x38, 0x37, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, +0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, +0x32, 0x30, 0x31, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, +0x2f, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x33, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x31, 0x32, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x30, 0x37, 0x29, 0x3b, +0x00, 0x5f, 0x32, 0x30, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x31, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, +0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x30, 0x31, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x32, 0x30, 0x31, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x32, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, +0x32, 0x32, 0x33, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x30, 0x31, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, +0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, +0x31, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x32, 0x33, 0x29, 0x20, +0x2a, 0x20, 0x5f, 0x32, 0x30, 0x31, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x32, 0x30, 0x31, 0x2e, 0x78, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x31, 0x32, 0x20, 0x2a, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x30, 0x37, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, +0x32, 0x30, 0x31, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x30, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, +0x32, 0x30, 0x31, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x30, 0x31, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, +0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x31, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, +0x32, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x34, +0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x37, 0x35, +0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, +0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x32, 0x20, +0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x31, +0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x31, 0x5b, +0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x31, 0x5b, 0x32, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x32, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, +0x5f, 0x37, 0x34, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x37, 0x34, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, +0x34, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x34, 0x38, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, +0x5f, 0x37, 0x37, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, +0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, +0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x32, +0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x35, 0x36, +0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, +0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x38, 0x33, 0x20, +0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x69, 0x64, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x37, 0x3b, 0x00, 0x5f, +0x31, 0x30, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x32, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x32, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x32, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x32, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, +0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x36, 0x5b, +0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x36, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x36, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x35, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, +0x5f, 0x38, 0x38, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x38, 0x38, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, +0x38, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x38, 0x33, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, +0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, +0x37, 0x32, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x36, 0x20, 0x3c, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x3b, 0x20, 0x29, 0x00, +0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, +0x63, 0x68, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, +0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, +0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x32, 0x36, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, +0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x32, 0x36, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x2c, +0x20, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x00, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x30, 0x20, +0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x33, 0x30, 0x39, 0x2e, 0x78, 0x29, +0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x37, 0x20, +0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x78, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x79, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x70, 0x2e, 0x7a, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x39, 0x31, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x2e, 0x79, +0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x36, 0x2b, 0x2b, 0x3b, 0x00, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, +0x37, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x31, 0x30, 0x31, 0x39, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x32, 0x3b, 0x00, +0x5f, 0x31, 0x30, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x31, -0x31, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, -0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x31, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, -0x31, 0x31, 0x35, 0x32, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x32, -0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x32, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x35, 0x39, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, -0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x36, -0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x32, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x31, 0x35, 0x31, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x32, 0x2b, 0x2b, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, -0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x31, -0x34, 0x32, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, -0x5f, 0x31, 0x30, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x36, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x33, -0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x32, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x35, 0x32, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x30, 0x35, 0x33, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x33, -0x20, 0x2b, 0x20, 0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, -0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, -0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x31, 0x34, 0x32, -0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x36, 0x3b, -0x00, 0x5f, 0x31, 0x31, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x33, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x34, -0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x33, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x6d, -0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, -0x31, 0x31, 0x34, 0x35, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x37, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x31, 0x34, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x28, 0x5f, 0x37, 0x32, 0x39, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, -0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, -0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x31, 0x34, 0x34, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x32, -0x39, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x32, 0x39, 0x2e, -0x79, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x32, 0x39, 0x2e, 0x7a, 0x3b, -0x00, 0x5f, 0x31, 0x31, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x34, -0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x34, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x37, 0x31, 0x36, -0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, -0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, -0x30, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x35, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x31, 0x2e, 0x78, -0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x31, 0x2e, 0x79, 0x20, 0x3d, -0x20, 0x5f, 0x37, 0x31, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x36, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, -0x37, 0x31, 0x36, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x36, 0x20, 0x3d, 0x20, -0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, -0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, -0x35, 0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, -0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x31, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, -0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x37, 0x33, 0x20, 0x3d, -0x20, 0x5f, 0x31, 0x30, 0x33, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, -0x33, 0x2e, 0x78, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, -0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, -0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x38, 0x35, -0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, -0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, -0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, -0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x36, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, -0x39, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, -0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, -0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x39, 0x33, 0x20, 0x3d, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, -0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, -0x39, 0x34, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x39, 0x33, 0x3b, 0x00, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x5f, 0x35, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x39, 0x34, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x28, 0x5f, 0x34, 0x39, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x38, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, -0x34, 0x38, 0x35, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x39, 0x33, 0x29, -0x3b, 0x00, 0x5f, 0x34, 0x38, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x2e, 0x78, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x39, 0x34, 0x20, 0x2f, 0x20, -0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x35, 0x30, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x38, 0x35, -0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, -0x20, 0x2d, 0x20, 0x5f, 0x35, 0x30, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x2e, 0x77, 0x29, 0x3b, 0x00, -0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, -0x20, 0x2d, 0x28, 0x5f, 0x34, 0x38, 0x35, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, -0x28, 0x5f, 0x34, 0x39, 0x34, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x34, 0x39, 0x30, 0x20, 0x2b, -0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x34, -0x38, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x38, 0x35, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, -0x34, 0x38, 0x35, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, -0x3d, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, -0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x3b, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, -0x3c, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69, 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x00, 0x00, 0x75, -0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, -0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, -0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, -0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, -0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, -0x74, 0x49, 0x64, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x44, -0x61, 0x74, 0x61, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x65, -0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, -0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, -0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, -0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4f, -0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x50, 0x65, -0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, -0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, -0x53, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x76, 0x69, -0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, -0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, -0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x76, -0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, -0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, -0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x78, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, -0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, -0x63, 0x6c, 0x69, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x4e, 0x6f, 0x69, 0x73, 0x65, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, -0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, -0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, -0x6f, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x72, 0x65, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, -0x76, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x6f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, -0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x46, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x65, 0x76, 0x31, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, -0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x64, 0x45, 0x64, 0x67, 0x65, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x42, 0x65, 0x6e, 0x74, -0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, -0x7a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, -0x75, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x66, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, -0x6e, 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, -0x58, 0x59, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, -0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, -0x6c, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x69, 0x62, 0x6c, 0x53, 0x48, 0x5b, 0x39, 0x5d, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x6c, -0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, -0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x73, 0x75, -0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, -0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, -0x6c, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, -0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x44, 0x69, 0x73, 0x74, 0x61, -0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x61, 0x73, 0x63, -0x61, 0x64, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, -0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, -0x68, 0x61, 0x64, 0x6f, 0x77, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x53, 0x63, -0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x69, 0x67, 0x68, -0x74, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, -0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x45, 0x78, 0x70, 0x6f, -0x6e, 0x65, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x44, -0x65, 0x70, 0x74, 0x68, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x76, 0x73, 0x6d, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x42, 0x6c, 0x65, 0x65, 0x64, 0x52, 0x65, 0x64, 0x75, 0x63, 0x74, -0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, -0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, -0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, -0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, -0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, -0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6f, -0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, 0x66, 0x44, -0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, -0x62, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, -0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, -0x67, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, -0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, -0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, -0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, -0x34, 0x20, 0x73, 0x73, 0x72, 0x52, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x55, 0x76, 0x46, 0x72, 0x6f, -0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x53, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5b, 0x34, 0x5d, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x37, 0x30, 0x39, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x30, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, -0x76, 0x65, 0x64, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, -0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, -0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, -0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x73, -0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, -0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x34, -0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, -0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, -0x6f, 0x63, 0x6e, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, -0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, -0x6f, 0x63, 0x6e, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, -0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, -0x6e, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, -0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, -0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, -0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, -0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, -0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, -0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, -0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, -0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, -0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x2c, 0x20, +0x30, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x34, 0x3b, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, +0x31, 0x30, 0x32, 0x35, 0x3b, 0x00, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x38, +0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x38, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x39, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, +0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x32, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x30, 0x32, 0x34, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x38, 0x2b, 0x2b, 0x29, 0x00, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, +0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x30, +0x31, 0x38, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, +0x5f, 0x39, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x32, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x38, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x38, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x39, +0x33, 0x38, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x39, 0x20, 0x2b, 0x20, +0x28, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, +0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, +0x20, 0x5f, 0x39, 0x33, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x31, 0x38, 0x5d, 0x2e, 0x78, 0x29, +0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x32, 0x3b, 0x00, 0x5f, 0x31, 0x30, +0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x39, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x30, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x30, 0x31, 0x39, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x31, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x30, 0x2e, +0x78, 0x79, 0x7a, 0x3b, 0x00, 0x73, 0x6b, 0x69, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x36, +0x31, 0x34, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, +0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x29, 0x3b, 0x00, 0x5f, 0x39, 0x34, 0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x31, 0x34, 0x2e, 0x78, 0x3b, 0x00, +0x5f, 0x39, 0x34, 0x30, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x31, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x39, 0x34, +0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x31, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x31, 0x20, +0x3d, 0x20, 0x5f, 0x39, 0x34, 0x30, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, +0x30, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x65, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, +0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x28, 0x76, 0x65, 0x63, 0x32, +0x28, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, +0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x39, +0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x61, 0x5b, 0x5f, 0x34, 0x34, 0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, +0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x31, 0x2e, +0x78, 0x79, 0x7a, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x33, 0x3b, 0x00, 0x69, 0x6e, +0x74, 0x20, 0x5f, 0x34, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, +0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x37, +0x32, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, +0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x34, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x33, 0x20, 0x2a, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x34, 0x36, 0x39, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x36, 0x33, 0x2e, 0x78, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x33, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, +0x34, 0x37, 0x32, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x36, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x33, 0x2e, +0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x37, +0x33, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x34, 0x38, 0x34, 0x29, 0x20, 0x2a, 0x20, +0x5f, 0x34, 0x36, 0x33, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x34, 0x38, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x36, 0x33, 0x2e, +0x77, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, +0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x5f, 0x34, 0x36, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, +0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x34, 0x37, 0x33, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x34, +0x36, 0x39, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x36, 0x33, 0x2e, 0x77, 0x29, 0x29, +0x3b, 0x00, 0x5f, 0x34, 0x36, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x36, 0x33, 0x2e, 0x7a, 0x20, 0x2a, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x78, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x5f, 0x34, 0x36, 0x33, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x33, 0x3b, 0x00, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, +0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x00, 0x23, 0x69, 0x6e, 0x63, +0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69, 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x00, 0x00, +0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, +0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, +0x75, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, +0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x49, 0x64, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, +0x44, 0x61, 0x74, 0x61, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, +0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, +0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, +0x43, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x49, 0x52, 0x56, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x43, 0x4f, +0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x31, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, +0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x50, +0x65, 0x72, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x64, 0x61, 0x74, +0x61, 0x5b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, +0x45, 0x53, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x76, +0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, +0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, +0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x34, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, +0x6c, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x78, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, +0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x63, 0x6c, 0x69, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x4e, 0x6f, 0x69, 0x73, 0x65, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x73, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, +0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, +0x63, 0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x56, 0x69, 0x65, 0x77, +0x70, 0x6f, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x72, 0x65, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, +0x69, 0x76, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x6f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, +0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x46, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x76, 0x31, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, +0x67, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x64, 0x45, 0x64, 0x67, 0x65, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6f, 0x42, 0x65, 0x6e, +0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x7a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, +0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x66, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x75, 0x6e, +0x74, 0x58, 0x59, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x62, 0x6c, 0x4c, 0x75, +0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, +0x62, 0x6c, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x69, 0x62, 0x6c, 0x53, 0x48, 0x5b, 0x39, 0x5d, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, +0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x73, +0x75, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, +0x77, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, +0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, +0x61, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x44, 0x69, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x61, 0x73, +0x63, 0x61, 0x64, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, +0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x53, +0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x69, 0x67, +0x68, 0x74, 0x46, 0x61, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, +0x6d, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, 0x45, 0x78, 0x70, +0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x73, 0x6d, +0x44, 0x65, 0x70, 0x74, 0x68, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x76, 0x73, 0x6d, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x42, 0x6c, 0x65, 0x65, 0x64, 0x52, 0x65, 0x64, 0x75, 0x63, +0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, +0x77, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, +0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, +0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x53, 0x74, +0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4d, 0x61, +0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x66, +0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, 0x66, +0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, +0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, 0x6f, 0x6d, +0x49, 0x62, 0x6c, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, +0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, +0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, +0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, +0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x20, 0x66, 0x6f, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, +0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x52, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x73, 0x73, 0x72, 0x55, 0x76, 0x46, 0x72, +0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x42, 0x69, 0x61, 0x73, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x73, 0x72, 0x53, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5b, 0x34, +0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x37, 0x30, 0x39, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, +0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, 0x52, 0x65, 0x73, 0x65, +0x72, 0x76, 0x65, 0x64, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x73, 0x32, +0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5b, 0x34, 0x30, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, +0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x34, 0x29, 0x5d, 0x5d, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, +0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, +0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, +0x31, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, 0x6c, +0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, +0x76, 0x30, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x33, 0x29, 0x5d, 0x5d, 0x3b, +0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, +0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, +0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, +0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x34, 0x20, 0x5f, 0x33, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x32, -0x38, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, -0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x31, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x37, 0x2e, -0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x37, -0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, -0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x36, -0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, -0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, -0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, -0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x34, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, +0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, +0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, +0x5d, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x75, 0x76, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, +0x73, 0x68, 0x5f, 0x75, 0x76, 0x30, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, -0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, -0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x36, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, -0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x39, 0x36, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, -0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x37, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, -0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, -0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, -0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, -0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, -0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, -0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x68, 0x61, 0x6c, -0x66, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x6d, 0x61, 0x74, 0x65, -0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x2c, 0x20, -0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x33, 0x78, 0x34, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, 0x63, 0x6f, 0x66, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x42, -0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x42, 0x6f, 0x6e, -0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x32, 0x35, 0x36, 0x5d, 0x3b, 0x00, 0x73, 0x74, -0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, -0x5b, 0x32, 0x35, 0x36, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, -0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x32, 0x20, 0x7b, 0x00, -0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x3e, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, -0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, -0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, -0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x6d, 0x70, -0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, -0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x69, 0x6e, 0x74, 0x3e, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, -0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x74, -0x73, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, -0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x74, -0x61, 0x6e, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x33, 0x29, -0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, -0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x34, 0x20, 0x7b, 0x00, 0x74, 0x65, 0x78, -0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, -0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, -0x68, 0x74, 0x73, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, -0x65, 0x72, 0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, -0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, -0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, 0x6d, -0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x20, 0x5b, 0x5b, 0x61, -0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x35, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, -0x68, 0x74, 0x73, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x36, 0x29, 0x5d, 0x5d, -0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, -0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, -0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, -0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, -0x65, 0x72, 0x32, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, -0x74, 0x32, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x38, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, -0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, -0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x34, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, -0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x34, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, -0x33, 0x30, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, -0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x42, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, -0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, -0x66, 0x65, 0x72, 0x28, 0x31, 0x39, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, -0x4d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x6f, -0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, -0x66, 0x65, 0x72, 0x28, 0x32, 0x30, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, -0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, -0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, -0x32, 0x35, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, -0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x64, 0x5d, 0x5d, -0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, -0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5d, 0x5d, 0x29, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, -0x73, 0x20, 0x26, 0x20, 0x35, 0x31, 0x32, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x35, 0x33, -0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x35, 0x34, -0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x69, -0x6e, 0x74, 0x33, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, -0x65, 0x78, 0x29, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, -0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, -0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x37, 0x20, 0x3d, 0x20, -0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x38, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x39, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x35, -0x33, 0x36, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x36, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, -0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, -0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, -0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x36, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x39, 0x2c, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, -0x34, 0x38, 0x2c, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x36, 0x2b, 0x2b, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, -0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, -0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x35, 0x33, 0x36, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x34, 0x36, -0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x34, 0x36, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, -0x33, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x5f, 0x31, 0x35, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x36, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x35, 0x33, 0x37, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, -0x72, 0x53, 0x65, 0x74, 0x32, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, -0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, -0x69, 0x6e, 0x74, 0x32, 0x28, 0x5f, 0x31, 0x34, 0x36, 0x35, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, -0x28, 0x5f, 0x31, 0x34, 0x36, 0x35, 0x2e, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, -0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, -0x5b, 0x5f, 0x31, 0x35, 0x33, 0x36, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, -0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x31, 0x35, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x35, 0x33, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x37, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, -0x35, 0x34, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, -0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x32, 0x35, 0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x35, 0x34, -0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, -0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, -0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, -0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, -0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, -0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, -0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, -0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, -0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, -0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, -0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x78, 0x33, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, -0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, -0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, -0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x32, 0x20, 0x3d, -0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x31, 0x36, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, -0x33, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x31, 0x36, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, -0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x31, 0x36, 0x38, 0x5b, -0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x31, 0x36, -0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, -0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, -0x31, 0x31, 0x39, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x28, 0x5f, 0x31, 0x31, 0x39, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, -0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x31, 0x39, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, -0x35, 0x33, 0x38, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x31, 0x39, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, -0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, -0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x32, 0x32, 0x5b, 0x30, -0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, -0x32, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, -0x28, 0x5f, 0x31, 0x32, 0x32, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x7a, 0x29, -0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, -0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, -0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x34, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, -0x35, 0x33, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x34, 0x39, 0x5b, 0x31, 0x5d, 0x20, -0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x34, 0x39, -0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, -0x34, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, -0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, -0x5f, 0x31, 0x32, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, -0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, -0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, -0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x33, 0x30, 0x33, -0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, -0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, -0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x33, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, -0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, -0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, -0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, -0x20, 0x5f, 0x31, 0x31, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, -0x20, 0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, -0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x32, 0x20, 0x2b, -0x20, 0x28, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, -0x65, 0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x30, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, -0x28, 0x28, 0x5f, 0x31, 0x32, 0x37, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x78, -0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x37, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, -0x33, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x37, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, -0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, 0x37, 0x36, 0x5b, 0x33, 0x5d, -0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, -0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x30, 0x33, -0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, -0x31, 0x33, 0x30, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x30, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, -0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x33, 0x30, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, -0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, -0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x33, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, -0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x33, 0x30, 0x5b, 0x31, -0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x33, -0x33, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, -0x31, 0x33, 0x33, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, -0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, -0x5f, 0x31, 0x35, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x32, 0x3b, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, -0x20, 0x3c, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x36, 0x3b, 0x20, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x34, -0x20, 0x3d, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x34, -0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, -0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, -0x32, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x20, 0x25, 0x20, 0x32, -0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x20, 0x2f, 0x20, 0x32, -0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, -0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, -0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x75, 0x69, 0x6e, 0x74, -0x28, 0x5f, 0x31, 0x31, 0x34, 0x34, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, -0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x31, 0x35, 0x34, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x35, 0x37, 0x5b, 0x30, 0x5d, 0x20, -0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x35, 0x37, -0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, -0x31, 0x33, 0x35, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x2e, 0x7a, 0x29, 0x20, 0x2b, -0x20, 0x5f, 0x31, 0x33, 0x35, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x34, -0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2b, 0x2b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, -0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, -0x6c, 0x73, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x20, 0x5f, 0x31, 0x35, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x32, 0x2e, -0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x35, 0x2e, 0x79, 0x20, 0x3d, -0x20, 0x5f, 0x31, 0x35, 0x34, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, -0x35, 0x32, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x35, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x33, -0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x39, 0x36, 0x31, 0x20, 0x3d, -0x20, 0x5f, 0x31, 0x35, 0x34, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, -0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x35, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x31, 0x2e, -0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, -0x31, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, -0x39, 0x36, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, -0x37, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, -0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, -0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, -0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, -0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x37, 0x30, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, -0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x31, 0x3b, -0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, -0x28, 0x29, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, -0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x31, 0x20, 0x7b, 0x00, 0x64, 0x65, 0x70, 0x74, -0x68, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, -0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, -0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, -0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, -0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, -0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, -0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, -0x62, 0x6c, 0x44, 0x46, 0x47, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x33, 0x29, 0x5d, 0x5d, -0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, -0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x5b, -0x5b, 0x69, 0x64, 0x28, 0x34, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, -0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, -0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x35, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, -0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, -0x5f, 0x73, 0x73, 0x61, 0x6f, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x36, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, -0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x53, 0x6d, 0x70, 0x6c, 0x72, -0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, -0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, -0x5f, 0x73, 0x73, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, -0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, -0x5b, 0x69, 0x64, 0x28, 0x39, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, -0x72, 0x65, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, -0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x53, 0x6d, -0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, -0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, -0x5f, 0x66, 0x6f, 0x67, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, -0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, -0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, -0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, -0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, -0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, -0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x31, 0x26, 0x20, 0x73, 0x70, 0x76, -0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, -0x66, 0x65, 0x72, 0x28, 0x32, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, -0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, -0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, -0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, -0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, -0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x38, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, -0x66, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, -0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, -0x28, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, -0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x38, -0x31, 0x33, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x34, 0x34, -0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, -0x67, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, -0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, -0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, -0x66, 0x34, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, -0x67, 0x74, 0x68, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, -0x66, 0x20, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, -0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x20, -0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, -0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, -0x32, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, -0x6c, 0x6f, 0x66, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x39, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x36, 0x32, 0x32, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, -0x30, 0x31, 0x32, 0x35, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, -0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, -0x78, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x2c, 0x20, -0x5f, 0x36, 0x32, 0x31, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, -0x79, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x36, 0x32, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x37, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x5f, -0x38, 0x31, 0x33, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, -0x37, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, -0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, -0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, -0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, -0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, -0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, -0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, -0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, -0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x38, 0x32, -0x30, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, -0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, -0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, -0x3d, 0x20, 0x5f, 0x38, 0x32, 0x38, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, -0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, -0x6f, 0x67, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, -0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, -0x6c, 0x72, 0x2c, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x33, 0x78, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, -0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, -0x69, 0x78, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, -0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, -0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, -0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, -0x28, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x38, 0x32, 0x30, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x38, 0x32, 0x30, 0x2e, 0x78, 0x2c, -0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x35, -0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, -0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, -0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, -0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x29, -0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x38, 0x31, 0x33, 0x29, 0x29, 0x29, -0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, -0x20, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x35, -0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, -0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, -0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, -0x20, 0x2b, 0x20, 0x28, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, -0x73, 0x69, 0x74, 0x79, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, -0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, -0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, -0x77, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, -0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, -0x38, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, -0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, -0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x33, 0x20, 0x2d, -0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x2a, 0x20, 0x66, -0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, -0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, -0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, -0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x30, 0x33, -0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, -0x66, 0x34, 0x20, 0x5f, 0x38, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, -0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x38, 0x33, 0x37, 0x2e, 0x78, -0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x33, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x29, 0x20, -0x2b, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, -0x34, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x78, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x35, -0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x2e, 0x7a, 0x20, -0x3d, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, -0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, -0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, -0x6c, 0x73, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, -0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x38, 0x30, 0x34, 0x29, 0x3b, 0x00, -0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x35, 0x20, 0x3d, 0x20, -0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, -0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, -0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, -0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, -0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, +0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, +0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x61, 0x63, 0x74, 0x6f, +0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x49, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, +0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x33, 0x20, 0x7b, 0x00, +0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x4d, 0x61, 0x70, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, +0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, +0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x66, +0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, +0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, +0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, +0x75, 0x66, 0x66, 0x65, 0x72, 0x33, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, +0x72, 0x53, 0x65, 0x74, 0x33, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x39, 0x29, 0x5d, 0x5d, +0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, +0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, +0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, +0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x34, 0x20, 0x5f, 0x34, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, +0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, +0x61, 0x63, 0x74, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x34, +0x30, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, +0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x3e, 0x20, 0x28, 0x2d, 0x31, 0x29, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x32, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, +0x66, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, +0x30, 0x31, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x30, 0x39, 0x20, +0x3d, 0x20, 0x5f, 0x34, 0x31, 0x37, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, +0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, +0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, +0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, +0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, +0x5f, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x5f, 0x34, 0x31, 0x33, 0x29, 0x2c, 0x20, 0x62, 0x69, 0x61, 0x73, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, +0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x37, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x34, 0x30, 0x39, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x34, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, 0x63, 0x6f, 0x66, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, +0x20, 0x42, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x42, +0x6f, 0x6e, 0x65, 0x44, 0x61, 0x74, 0x61, 0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x32, 0x35, 0x36, 0x5d, 0x3b, 0x00, +0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, +0x74, 0x73, 0x5b, 0x32, 0x35, 0x36, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x73, 0x74, 0x72, +0x75, 0x63, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, +0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x32, 0x20, 0x7b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, +0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, +0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, +0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, +0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, +0x69, 0x6e, 0x74, 0x3e, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, +0x65, 0x72, 0x5f, 0x74, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, +0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x6d, 0x70, +0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, +0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, +0x66, 0x65, 0x72, 0x34, 0x20, 0x7b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x3e, 0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, +0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, +0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, +0x74, 0x73, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x35, +0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, +0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x36, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, +0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, +0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, +0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, +0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x32, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, +0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x32, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, +0x72, 0x28, 0x32, 0x38, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x70, +0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, +0x34, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x34, +0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x33, 0x30, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, +0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, -0x31, 0x38, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, -0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x3e, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x35, 0x5d, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, -0x2e, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, -0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, -0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, -0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, -0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, -0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x5b, 0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, -0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, -0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, -0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x66, -0x69, 0x6e, 0x65, 0x64, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, -0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x29, 0x20, 0x3f, 0x20, 0x43, 0x4f, 0x4e, 0x46, -0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, -0x74, 0x6d, 0x70, 0x20, 0x3a, 0x20, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, -0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x5b, 0x5b, 0x63, 0x6c, 0x69, -0x70, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, 0x5d, 0x20, 0x5b, 0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, -0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x30, 0x29, 0x5d, -0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, -0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, -0x69, 0x70, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x37, 0x20, -0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, -0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, -0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, -0x37, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x34, 0x20, 0x3d, 0x20, -0x5f, 0x37, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, -0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x20, 0x5f, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, -0x36, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x36, -0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x36, 0x2e, -0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x34, 0x20, 0x5f, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x37, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, -0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x36, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, -0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x31, 0x2e, 0x78, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, -0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x31, 0x2e, 0x79, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, -0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x31, 0x2e, 0x7a, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, -0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, -0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, -0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, -0x5f, 0x38, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, -0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, -0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, -0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, -0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x37, 0x20, 0x3d, 0x20, -0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x39, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x20, 0x5f, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x34, 0x29, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x32, 0x2e, -0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x3d, 0x20, -0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, 0x32, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x39, 0x37, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, -0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x39, 0x35, 0x2c, 0x20, 0x5f, 0x39, 0x39, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, -0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x37, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x29, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x32, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x2d, -0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x39, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, -0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, -0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x30, 0x36, 0x2c, 0x20, 0x5f, 0x39, 0x39, 0x2c, 0x20, -0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x29, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x30, -0x36, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, -0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x29, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, -0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, -0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, -0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, -0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, -0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, -0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x35, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, -0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x35, 0x31, 0x32, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x28, +0x31, 0x38, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x42, 0x6f, 0x6e, 0x65, +0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x39, 0x29, 0x5d, 0x5d, 0x2c, +0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x30, 0x29, 0x5d, 0x5d, 0x2c, +0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, +0x20, 0x5b, 0x5b, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x64, 0x5d, 0x5d, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x5b, 0x5b, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, +0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, +0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x35, 0x31, +0x32, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, +0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x31, 0x30, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, +0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, -0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, -0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, -0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, -0x5f, 0x31, 0x32, 0x37, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x35, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, -0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x32, 0x33, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x2c, 0x20, 0x5f, 0x31, 0x32, -0x37, 0x2b, 0x2b, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, -0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, -0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x32, 0x37, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, -0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, -0x74, 0x33, 0x20, 0x5f, 0x31, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x33, 0x37, 0x2e, 0x7a, 0x20, 0x3d, -0x20, 0x5f, 0x31, 0x32, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x32, 0x35, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, -0x53, 0x65, 0x74, 0x32, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, -0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, -0x6e, 0x74, 0x32, 0x28, 0x5f, 0x31, 0x33, 0x37, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, -0x31, 0x33, 0x37, 0x2e, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, -0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, -0x32, 0x37, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x32, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x20, 0x3d, -0x20, 0x5f, 0x31, 0x32, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x20, -0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x35, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, -0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x32, 0x35, 0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x33, 0x31, 0x36, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x36, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, -0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, -0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, -0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x78, 0x33, 0x20, 0x5f, 0x31, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, -0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, -0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, -0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, -0x20, 0x5f, 0x31, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, -0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, -0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, -0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, -0x32, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, -0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, -0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x5d, 0x2e, -0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, -0x5f, 0x31, 0x36, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x5f, 0x31, 0x36, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x79, 0x29, 0x20, -0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x36, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x7a, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x36, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, -0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, -0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x37, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, -0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x37, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, -0x34, 0x33, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x37, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, -0x5f, 0x31, 0x34, 0x33, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x37, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, -0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, -0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x39, 0x36, 0x5b, 0x30, 0x5d, -0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x39, 0x36, 0x5b, -0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x39, -0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x39, -0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, -0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, -0x5f, 0x32, 0x31, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x5f, 0x32, 0x31, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x79, 0x29, 0x20, -0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x31, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x7a, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x31, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, -0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x78, 0x33, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, -0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, -0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, -0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x34, -0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, -0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, -0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, -0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, -0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, -0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, -0x20, 0x5f, 0x32, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, -0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, -0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, -0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x39, 0x20, 0x2b, 0x20, 0x28, 0x69, -0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, -0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x32, 0x38, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x32, -0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, -0x32, 0x32, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, -0x28, 0x5f, 0x32, 0x32, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x7a, 0x29, 0x20, 0x2b, -0x20, 0x5f, 0x32, 0x32, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, -0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x28, 0x5f, 0x32, 0x34, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x78, 0x29, -0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x34, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, -0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x34, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, -0x33, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x34, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, -0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, -0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x36, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, -0x5f, 0x31, 0x34, 0x33, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x36, 0x35, 0x5b, 0x31, 0x5d, 0x20, -0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x36, 0x35, 0x5b, 0x32, -0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x5b, 0x33, -0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, -0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x37, 0x20, 0x3d, -0x20, 0x5f, 0x32, 0x37, 0x39, 0x3b, 0x20, 0x5f, 0x32, 0x38, 0x37, 0x20, 0x3c, 0x20, 0x5f, 0x32, 0x38, 0x32, 0x3b, 0x20, -0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, -0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x34, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, -0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, -0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, -0x5f, 0x32, 0x38, 0x37, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, -0x32, 0x38, 0x37, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x33, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, -0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, -0x73, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x32, 0x39, 0x38, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, -0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x38, 0x34, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x30, 0x33, 0x5b, -0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x30, -0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, -0x33, 0x30, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, -0x33, 0x30, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x39, 0x38, 0x2e, 0x79, 0x29, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x38, -0x37, 0x2b, 0x2b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x31, -0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x36, 0x2e, -0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x31, 0x38, 0x2e, 0x79, 0x20, 0x3d, 0x20, -0x5f, 0x33, 0x31, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x31, 0x38, -0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x36, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x5f, 0x33, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x2e, 0x78, 0x79, -0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, -0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x32, -0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x2e, 0x78, -0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x2e, -0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, 0x39, -0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x35, 0x5d, 0x2e, 0x77, 0x6f, 0x72, -0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, -0x5f, 0x33, 0x32, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, -0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, -0x33, 0x33, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, -0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, -0x5f, 0x33, 0x33, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, -0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, -0x20, 0x5f, 0x33, 0x33, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, -0x5f, 0x33, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, -0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, -0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, -0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x33, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, -0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, -0x20, 0x5f, 0x33, 0x34, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x20, -0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, -0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, -0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, -0x34, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, -0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, -0x5f, 0x33, 0x34, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x32, -0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x33, 0x34, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x35, 0x2e, 0x77, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6d, -0x61, 0x28, 0x5f, 0x33, 0x34, 0x35, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, -0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x33, 0x34, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x35, 0x32, 0x2c, 0x20, 0x28, 0x2d, -0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x29, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x38, 0x20, 0x3d, 0x20, -0x5f, 0x33, 0x34, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x35, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, -0x33, 0x35, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x39, 0x20, -0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x33, 0x34, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, -0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x33, 0x35, 0x39, 0x2c, 0x20, -0x5f, 0x33, 0x35, 0x32, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x2c, 0x20, 0x5f, 0x33, -0x35, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, -0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, -0x6d, 0x61, 0x28, 0x5f, 0x33, 0x35, 0x39, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x33, 0x34, 0x37, 0x20, -0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x35, 0x35, 0x2c, 0x20, 0x5f, 0x33, -0x35, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, -0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x20, -0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, -0x30, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, -0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x34, 0x20, 0x5f, 0x33, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x33, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x5f, 0x33, 0x32, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x5f, 0x33, 0x32, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, -0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, -0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, -0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, -0x33, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, -0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, -0x39, 0x37, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, -0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, -0x32, 0x39, 0x37, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, -0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, -0x5f, 0x32, 0x39, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, -0x32, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, -0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, -0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x61, -0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x30, -0x5d, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x6f, -0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, -0x6d, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x37, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x28, -0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, -0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, -0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x39, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x35, 0x35, 0x30, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, -0x31, 0x35, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x37, 0x20, 0x3c, 0x20, 0x6f, 0x62, -0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, -0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x6f, -0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x35, 0x34, -0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x35, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x35, 0x34, 0x39, 0x2c, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x37, 0x2b, 0x2b, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x35, 0x33, -0x37, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x34, 0x36, 0x36, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x34, 0x36, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x37, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, -0x35, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x36, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, -0x33, 0x38, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, -0x65, 0x74, 0x32, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, -0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, -0x74, 0x32, 0x28, 0x5f, 0x31, 0x34, 0x36, 0x36, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, -0x31, 0x34, 0x36, 0x36, 0x2e, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, -0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, -0x31, 0x35, 0x33, 0x37, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x37, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, -0x34, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x5f, 0x31, 0x35, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, -0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, -0x5f, 0x31, 0x35, 0x34, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x33, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x39, 0x20, -0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, -0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, -0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x39, 0x36, 0x20, 0x3d, +0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x31, 0x30, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x31, 0x30, 0x35, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, +0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, +0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x34, +0x32, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, +0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, +0x3b, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x30, +0x34, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x34, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x2b, 0x2b, 0x29, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x5d, 0x2e, 0x78, +0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x7b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, +0x6e, 0x74, 0x33, 0x20, 0x5f, 0x39, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x37, 0x37, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x37, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x35, +0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x33, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, +0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x32, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, +0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, +0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x5f, 0x39, 0x37, 0x37, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, +0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x39, 0x37, 0x37, 0x2e, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, +0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, +0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x34, 0x20, 0x3d, +0x20, 0x5f, 0x31, 0x30, 0x34, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x33, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, +0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, +0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x32, 0x35, +0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, +0x6f, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, +0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, +0x20, 0x3e, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, -0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x33, 0x20, 0x3d, 0x20, -0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, -0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, -0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x74, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, -0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x5f, 0x31, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x31, 0x36, 0x39, 0x5b, -0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, -0x31, 0x36, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x5f, 0x31, 0x31, 0x36, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x7a, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, -0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, -0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x31, 0x39, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, -0x35, 0x33, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x31, 0x39, 0x36, 0x5b, 0x31, 0x5d, 0x20, -0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x31, 0x39, 0x36, -0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x31, -0x39, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, -0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, -0x28, 0x5f, 0x31, 0x32, 0x32, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x78, 0x29, -0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x32, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, -0x39, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x32, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, -0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x33, 0x5b, 0x33, 0x5d, 0x29, -0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, -0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x35, 0x30, -0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, -0x31, 0x32, 0x35, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x79, 0x29, 0x20, 0x2b, -0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x35, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, -0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, +0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, +0x34, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x34, 0x5b, 0x31, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x34, +0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x33, +0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, +0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, +0x37, 0x36, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x37, 0x36, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x36, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x36, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, -0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x32, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, -0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, -0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, -0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, -0x5f, 0x31, 0x33, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, -0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, -0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, -0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x33, 0x33, 0x31, +0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, +0x31, 0x30, 0x34, 0x34, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x38, 0x5b, 0x31, 0x5d, 0x20, +0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x38, 0x5b, +0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x38, 0x38, +0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, +0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, +0x38, 0x31, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x38, 0x31, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x31, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x31, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, +0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, +0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, +0x33, 0x20, 0x5f, 0x38, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, +0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, +0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, -0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, -0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x31, 0x32, 0x33, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, -0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x35, 0x34, -0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x31, -0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x37, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, -0x35, 0x33, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x37, 0x37, 0x5b, 0x31, 0x5d, 0x20, -0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x37, 0x37, -0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, -0x37, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, -0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, -0x5f, 0x31, 0x33, 0x30, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x78, 0x29, 0x20, -0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x30, 0x34, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, -0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x30, 0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, -0x31, 0x35, 0x33, 0x39, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x33, 0x30, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, +0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, +0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, +0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x39, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x38, 0x38, +0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x36, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x36, 0x20, 0x3d, 0x20, +0x28, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, +0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, +0x34, 0x34, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x34, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, -0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x33, 0x31, 0x5b, -0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, -0x33, 0x33, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x5f, 0x31, 0x33, 0x33, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x7a, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x33, 0x33, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, -0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, -0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, -0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x33, 0x3b, 0x20, -0x5f, 0x31, 0x35, 0x34, 0x30, 0x20, 0x3c, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x37, 0x3b, 0x20, 0x29, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, -0x5f, 0x31, 0x31, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, -0x72, 0x53, 0x65, 0x74, 0x34, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, -0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, -0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x35, 0x34, -0x30, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x35, 0x34, -0x30, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x78, 0x33, 0x20, 0x5f, 0x31, 0x33, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, -0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, -0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x34, 0x35, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, +0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x36, 0x39, 0x5b, 0x30, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x36, 0x39, +0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x38, 0x36, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, +0x5f, 0x38, 0x36, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x28, 0x5f, 0x38, 0x39, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x78, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x39, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, +0x34, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x39, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, +0x31, 0x30, 0x34, 0x34, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x39, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, +0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x36, +0x38, 0x38, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x20, 0x3c, 0x20, 0x5f, 0x36, 0x39, 0x32, 0x3b, 0x20, 0x29, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x5f, 0x37, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, +0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x34, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, +0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x65, +0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, +0x30, 0x34, 0x35, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, +0x30, 0x34, 0x35, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, +0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, +0x73, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x37, 0x31, 0x30, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x35, -0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, -0x5f, 0x31, 0x33, 0x35, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x2e, 0x79, 0x29, 0x20, -0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x35, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, -0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x33, 0x35, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, -0x5f, 0x31, 0x31, 0x34, 0x35, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x30, 0x2b, 0x2b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x31, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x35, -0x32, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x5f, 0x31, 0x35, 0x32, 0x36, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, -0x34, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x36, 0x2e, -0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x5f, 0x31, 0x35, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x39, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x39, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, -0x34, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, -0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x34, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x5f, 0x31, 0x35, 0x33, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x32, 0x2e, 0x78, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x32, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x32, 0x2e, 0x79, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x32, 0x2e, -0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x37, 0x31, 0x20, 0x3d, -0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x36, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x32, 0x33, +0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x39, 0x32, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x39, 0x32, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x2e, 0x7a, 0x29, +0x20, 0x2b, 0x20, 0x5f, 0x39, 0x32, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x31, 0x30, +0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2b, 0x2b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, +0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, +0x6c, 0x73, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x31, 0x30, 0x33, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, +0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x37, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x38, 0x2e, 0x79, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x30, 0x34, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, +0x35, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x31, 0x30, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x30, 0x35, 0x31, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, +0x31, 0x30, 0x35, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x30, 0x35, 0x31, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x38, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, +0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x35, 0x38, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x35, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, +0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, +0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, -0x78, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x33, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, -0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, -0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, -0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, -0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, -0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, -0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x37, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, -0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x38, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, -0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, -0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, -0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, -0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x38, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, -0x5f, 0x38, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, -0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, -0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, -0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x20, 0x2a, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x33, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, -0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, -0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, -0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, -0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, -0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, -0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, -0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, -0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, -0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, -0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, -0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x31, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x28, 0x5f, 0x38, 0x31, 0x30, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x63, 0x6c, 0x61, -0x6d, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, -0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, -0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, -0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, -0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, -0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, -0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x38, 0x20, 0x2a, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, -0x2a, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, -0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, -0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, -0x77, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, -0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x34, 0x38, 0x29, 0x2c, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, -0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, -0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, -0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x2a, -0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x39, 0x37, 0x20, 0x2a, -0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x66, 0x72, -0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, -0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, -0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, -0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x35, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, -0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x35, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x39, 0x32, -0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, -0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, -0x6e, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, -0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, -0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x33, 0x20, 0x5f, 0x33, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, -0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, -0x65, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x30, 0x31, 0x20, 0x3d, -0x20, 0x5f, 0x33, 0x37, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x30, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, -0x5f, 0x33, 0x36, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x30, 0x31, 0x2e, 0x79, 0x20, 0x3d, -0x20, 0x5f, 0x33, 0x36, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x30, 0x31, 0x2e, 0x7a, 0x20, -0x3d, 0x20, 0x5f, 0x33, 0x36, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x20, 0x5f, 0x33, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x38, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, -0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, -0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, -0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x30, -0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, -0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, -0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, -0x37, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x31, -0x34, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, -0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, -0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, -0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, -0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, -0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, -0x31, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x6f, -0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, -0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, -0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x20, -0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, -0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, -0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x33, 0x20, 0x3d, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x31, 0x39, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, -0x32, 0x31, 0x34, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x37, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, -0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x2c, 0x20, 0x5f, 0x32, 0x33, 0x33, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x32, 0x37, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x29, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, -0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x31, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x28, -0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, -0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, -0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x31, 0x38, 0x2c, 0x20, 0x5f, 0x32, 0x33, -0x33, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x29, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, -0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, -0x5f, 0x34, 0x31, 0x38, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x31, 0x39, 0x20, 0x2b, 0x20, 0x31, -0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x36, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x29, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, -0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x38, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, -0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, -0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x35, 0x32, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, -0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x35, 0x31, 0x32, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, -0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x36, -0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x36, -0x33, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x33, 0x20, 0x3d, 0x20, -0x69, 0x6e, 0x74, 0x33, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, -0x64, 0x65, 0x78, 0x29, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, -0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, -0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x34, 0x20, 0x3d, -0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x35, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x36, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, -0x36, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x33, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, -0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x35, -0x32, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, -0x20, 0x5f, 0x31, 0x36, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x31, 0x36, 0x32, -0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x33, 0x2b, 0x2b, 0x29, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, -0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, -0x5b, 0x5f, 0x31, 0x36, 0x32, 0x33, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, -0x31, 0x35, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x36, 0x32, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x31, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x35, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, -0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x32, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, -0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x61, -0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x5f, 0x31, 0x35, 0x34, 0x31, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x75, -0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x35, 0x34, 0x31, 0x2e, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, -0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, -0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x36, 0x32, 0x33, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x36, 0x33, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x34, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, -0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, +0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, -0x5b, 0x5f, 0x34, 0x35, 0x32, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, -0x20, 0x26, 0x20, 0x32, 0x35, 0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, -0x20, 0x5f, 0x31, 0x32, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, +0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, +0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x3b, 0x00, 0x66, 0x72, 0x61, +0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x31, +0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, +0x30, 0x32, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, +0x5f, 0x31, 0x30, 0x32, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, +0x5f, 0x31, 0x30, 0x33, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x36, +0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, +0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, +0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x30, +0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x32, +0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, +0x33, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, +0x33, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, +0x20, 0x5f, 0x31, 0x30, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x36, 0x20, 0x3c, 0x20, +0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, +0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, +0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x37, 0x20, 0x3d, +0x20, 0x5f, 0x31, 0x30, 0x33, 0x38, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x36, 0x2b, 0x2b, 0x29, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, +0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, +0x30, 0x32, 0x36, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x39, 0x36, 0x31, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x36, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x36, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, +0x37, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, +0x74, 0x32, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, +0x32, 0x28, 0x5f, 0x39, 0x36, 0x31, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x39, 0x36, +0x31, 0x2e, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x30, 0x32, +0x36, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x36, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x38, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, +0x32, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x31, 0x30, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, +0x33, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, +0x31, 0x30, 0x33, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, +0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, +0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, +0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, +0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, +0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, +0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, +0x65, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x32, 0x20, +0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, +0x32, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x32, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x32, 0x32, 0x5b, 0x33, +0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, +0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x34, 0x39, +0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x37, 0x34, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x37, 0x34, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x7a, 0x29, +0x20, 0x2b, 0x20, 0x5f, 0x37, 0x34, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, +0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, +0x31, 0x30, 0x32, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x36, 0x5b, 0x32, 0x5d, 0x20, +0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x37, 0x36, 0x5b, 0x33, 0x5d, +0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, +0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x33, +0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x38, 0x30, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x38, 0x30, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x7a, 0x29, +0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, +0x33, 0x20, 0x5f, 0x38, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, -0x5f, 0x31, 0x32, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, -0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, -0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, -0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x35, 0x37, +0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, +0x5f, 0x36, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, +0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, +0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, +0x6e, 0x74, 0x20, 0x5f, 0x36, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x37, 0x36, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, +0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, +0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x38, +0x33, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x5f, 0x38, 0x33, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x79, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x33, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, +0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x33, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, +0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, +0x32, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x37, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x35, 0x37, 0x5b, 0x33, +0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, +0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x38, +0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x38, 0x38, 0x34, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x38, 0x38, 0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x7a, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x38, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, +0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x37, 0x36, 0x3b, 0x20, 0x5f, 0x31, +0x30, 0x32, 0x39, 0x20, 0x3c, 0x20, 0x5f, 0x36, 0x38, 0x30, 0x3b, 0x20, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x36, 0x39, +0x38, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, +0x34, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, +0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, +0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x20, 0x25, 0x20, +0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x20, 0x2f, 0x20, +0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, -0x31, 0x32, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, -0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, -0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, -0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, -0x33, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, +0x39, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, +0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x75, 0x69, 0x6e, 0x74, +0x28, 0x5f, 0x36, 0x39, 0x38, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x31, 0x5b, 0x31, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x31, +0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x31, +0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x39, 0x38, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, +0x2b, 0x2b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, +0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x31, 0x30, 0x32, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x32, 0x2e, 0x78, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x31, +0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, +0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x6f, +0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, +0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, +0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, +0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x35, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x39, +0x3b, 0x00, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, +0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x31, 0x20, 0x7b, 0x00, 0x64, 0x65, 0x70, 0x74, 0x68, +0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, +0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x68, 0x61, +0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x29, 0x5d, +0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x44, 0x46, 0x47, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x32, 0x29, +0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, +0x6c, 0x44, 0x46, 0x47, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x33, 0x29, 0x5d, 0x5d, 0x3b, +0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x5b, 0x5b, +0x69, 0x64, 0x28, 0x34, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, +0x68, 0x74, 0x5f, 0x69, 0x62, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, +0x5b, 0x5b, 0x69, 0x64, 0x28, 0x35, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, +0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x73, 0x73, 0x61, 0x6f, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x36, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x61, 0x6f, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, +0x5b, 0x5b, 0x69, 0x64, 0x28, 0x37, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, +0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x73, 0x73, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, +0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x73, 0x72, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, +0x69, 0x64, 0x28, 0x39, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, +0x65, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, +0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x53, 0x6d, 0x70, +0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, +0x72, 0x65, 0x63, 0x75, 0x62, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, +0x66, 0x6f, 0x67, 0x20, 0x5b, 0x5b, 0x69, 0x64, 0x28, 0x31, 0x32, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, +0x5b, 0x69, 0x64, 0x28, 0x31, 0x33, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, +0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, +0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, +0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, +0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x31, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, +0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, +0x65, 0x72, 0x28, 0x32, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, +0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, +0x72, 0x33, 0x26, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, +0x33, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x39, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x26, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, +0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x37, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, +0x20, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x26, 0x20, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, +0x28, 0x32, 0x35, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, +0x36, 0x33, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, +0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x61, 0x63, 0x74, 0x6f, +0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x34, 0x34, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x38, 0x35, 0x39, 0x20, 0x3d, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, +0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x35, 0x39, 0x2e, 0x79, 0x20, 0x3d, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, +0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x38, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x33, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, +0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, +0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, +0x72, 0x4d, 0x61, 0x70, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, +0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x53, 0x6d, 0x70, +0x6c, 0x72, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x5f, 0x38, 0x35, 0x39, 0x29, 0x2c, 0x20, 0x62, 0x69, +0x61, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x6f, 0x64, +0x42, 0x69, 0x61, 0x73, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x34, +0x34, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x36, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, +0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x38, 0x34, +0x34, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x34, 0x37, 0x36, 0x20, +0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x46, +0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x69, 0x6e, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, +0x20, 0x5f, 0x38, 0x35, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, +0x68, 0x28, 0x5f, 0x34, 0x37, 0x36, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, +0x28, 0x5f, 0x36, 0x34, 0x38, 0x20, 0x3e, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x75, 0x74, 0x4f, 0x66, 0x66, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x35, 0x32, 0x20, 0x3d, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x36, 0x34, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, +0x66, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x36, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, 0x34, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, +0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x36, 0x36, 0x35, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, +0x32, 0x35, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x34, 0x35, +0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x78, 0x70, +0x28, 0x66, 0x6d, 0x61, 0x28, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x66, 0x6f, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x5f, 0x36, +0x36, 0x34, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, +0x32, 0x5d, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x36, 0x36, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x65, 0x6c, 0x73, 0x65, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x34, +0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x44, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x5b, 0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x38, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x31, 0x2e, +0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x36, 0x39, +0x38, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x5f, 0x38, 0x36, 0x35, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, +0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x38, 0x34, 0x35, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, +0x61, 0x78, 0x28, 0x5f, 0x36, 0x34, 0x38, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, +0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x29, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x37, 0x37, 0x20, 0x3d, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x34, 0x36, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x62, 0x6c, +0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x38, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, +0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, +0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x37, 0x37, 0x20, 0x2a, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, +0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, +0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, +0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, +0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, +0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x37, +0x36, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x5f, 0x38, 0x36, 0x38, 0x2e, 0x79, +0x2c, 0x20, 0x5f, 0x38, 0x36, 0x38, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x68, 0x61, 0x6c, 0x66, +0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x34, 0x38, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, +0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, +0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x30, 0x2e, 0x30, 0x29, +0x2c, 0x20, 0x5f, 0x38, 0x36, 0x35, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x37, 0x37, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x34, 0x37, +0x20, 0x3d, 0x20, 0x5f, 0x38, 0x34, 0x36, 0x20, 0x2a, 0x20, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x6e, +0x63, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x39, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x35, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, +0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3e, +0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, +0x35, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x37, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, +0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, +0x77, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x61, 0x73, 0x74, +0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, +0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, 0x37, 0x36, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, +0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x29, 0x20, +0x2a, 0x20, 0x28, 0x5f, 0x38, 0x36, 0x35, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, +0x28, 0x5f, 0x38, 0x34, 0x35, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, +0x34, 0x38, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, +0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, +0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x37, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x68, +0x61, 0x6c, 0x66, 0x34, 0x28, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x20, +0x3d, 0x20, 0x28, 0x5f, 0x38, 0x38, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x38, 0x36, 0x35, 0x20, +0x2d, 0x20, 0x5f, 0x36, 0x39, 0x38, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x35, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x38, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x38, +0x38, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x33, 0x39, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x37, 0x39, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x33, +0x39, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x38, 0x33, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 0x39, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x7d, +0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x28, 0x5f, 0x38, 0x35, 0x32, 0x29, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x5f, 0x31, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x32, 0x20, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, +0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, +0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, +0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x26, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, +0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x31, 0x38, 0x29, 0x5d, 0x5d, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x61, +0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x38, 0x5d, 0x2e, +0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, +0x75, 0x74, 0x50, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x2f, 0x20, 0x69, 0x6e, 0x2e, +0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x77, 0x3b, 0x00, 0x66, +0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, +0x69, 0x6e, 0x30, 0x28, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, +0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, +0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, +0x5b, 0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, +0x38, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x43, +0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, +0x4e, 0x54, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, +0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, +0x70, 0x29, 0x20, 0x3f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x74, 0x6d, 0x70, 0x20, 0x3a, 0x20, 0x32, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x20, 0x5b, 0x5b, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, +0x5d, 0x20, 0x5b, 0x32, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c, 0x5f, +0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, +0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, 0x20, +0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x69, 0x70, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, +0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x38, 0x5d, 0x2e, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, +0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, +0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, +0x20, 0x3d, 0x20, 0x5f, 0x39, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, +0x20, 0x3d, 0x20, 0x5f, 0x39, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x5f, 0x39, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x31, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, +0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, +0x20, 0x5f, 0x31, 0x30, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x20, +0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, +0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, +0x30, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, +0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, +0x5f, 0x31, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x38, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x2e, 0x77, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6d, +0x61, 0x28, 0x5f, 0x31, 0x30, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, +0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x2c, 0x20, 0x28, 0x2d, +0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x30, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, +0x31, 0x31, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x20, +0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, +0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x35, 0x2c, 0x20, +0x5f, 0x31, 0x30, 0x38, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x2c, 0x20, 0x5f, 0x31, +0x31, 0x33, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, +0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, +0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x35, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x20, +0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x2c, 0x20, 0x5f, 0x31, +0x31, 0x33, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, +0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, +0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x31, +0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5b, 0x31, 0x5d, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, +0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, +0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, +0x5b, 0x5f, 0x31, 0x30, 0x38, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, +0x20, 0x26, 0x20, 0x35, 0x31, 0x32, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x33, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, +0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, +0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, +0x29, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x31, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, +0x5f, 0x31, 0x33, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x31, 0x33, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, +0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x33, 0x36, 0x20, 0x3c, +0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, +0x5b, 0x5f, 0x31, 0x30, 0x38, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, +0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x32, 0x2c, 0x20, 0x5f, 0x31, +0x33, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x36, 0x2b, 0x2b, 0x29, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, +0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, +0x5f, 0x31, 0x33, 0x36, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x34, +0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x34, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x36, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x33, +0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x34, 0x20, 0x2b, 0x20, +0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x32, 0x2e, 0x6d, +0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x5f, 0x31, +0x34, 0x36, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x34, 0x36, 0x2e, 0x7a, 0x29, +0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x33, 0x36, 0x5d, 0x2e, 0x78, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, +0x33, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x34, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x34, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, +0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, +0x5f, 0x31, 0x30, 0x38, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, +0x26, 0x20, 0x32, 0x35, 0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, +0x31, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, -0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x5d, 0x2e, +0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, -0x28, 0x5f, 0x31, 0x32, 0x34, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x78, 0x29, -0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x34, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, -0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x34, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, -0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x30, 0x5b, 0x33, 0x5d, 0x29, -0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, -0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x36, 0x37, 0x5b, -0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, -0x32, 0x36, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x5f, 0x31, 0x32, 0x36, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x7a, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, -0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, -0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x39, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, -0x31, 0x36, 0x32, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x39, 0x34, 0x5b, 0x31, 0x5d, -0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x32, 0x39, -0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, -0x32, 0x39, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, -0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, -0x28, 0x28, 0x5f, 0x31, 0x33, 0x32, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x78, -0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x32, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, -0x32, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x32, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, -0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x33, 0x32, 0x31, 0x5b, 0x33, 0x5d, -0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, -0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x33, 0x34, 0x38, 0x20, 0x3d, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x38, +0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x20, +0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, +0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, +0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, -0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, -0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x33, 0x37, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, +0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x33, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x36, 0x39, 0x5b, 0x30, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x36, 0x39, +0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, +0x36, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, +0x36, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, +0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, +0x5f, 0x31, 0x38, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x31, 0x38, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x79, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x38, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x7a, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x38, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x30, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, +0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x30, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, +0x31, 0x35, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x30, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x30, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, +0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, +0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x32, 0x31, 0x5b, 0x30, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x32, 0x31, +0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, +0x32, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, +0x32, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, +0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x33, +0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, +0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, +0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, +0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, +0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x20, +0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, +0x39, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x20, 0x5f, 0x32, 0x39, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x32, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x33, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x33, 0x38, 0x5b, 0x31, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x33, 0x38, 0x5b, +0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x33, 0x38, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, +0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x35, +0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x32, 0x35, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x5f, 0x32, 0x35, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x32, 0x35, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x37, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x78, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x37, 0x34, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, +0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x37, 0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x35, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x37, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, +0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, +0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, +0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x38, 0x3b, +0x20, 0x5f, 0x32, 0x39, 0x36, 0x20, 0x3c, 0x20, 0x5f, 0x32, 0x39, 0x31, 0x3b, 0x20, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x33, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, +0x65, 0x74, 0x34, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, +0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, +0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x32, 0x39, 0x36, 0x20, 0x25, +0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x32, 0x39, 0x36, 0x20, 0x2f, 0x20, +0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, +0x33, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, +0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x75, 0x69, 0x6e, 0x74, +0x28, 0x5f, 0x33, 0x30, 0x37, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, +0x39, 0x33, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, 0x31, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, +0x31, 0x35, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x31, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x31, 0x32, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x31, 0x32, 0x5b, 0x33, 0x5d, +0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x37, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x39, 0x36, 0x2b, 0x2b, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x32, +0x39, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x33, 0x32, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x32, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, +0x32, 0x37, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x35, 0x2e, 0x7a, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x37, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x32, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x34, 0x35, 0x20, 0x3d, 0x20, +0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, +0x5b, 0x5f, 0x31, 0x30, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x33, 0x32, 0x2e, 0x78, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x33, +0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x33, 0x33, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x38, 0x5d, 0x2e, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, +0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, +0x35, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, +0x34, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x34, 0x35, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, +0x35, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, +0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, +0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x34, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x35, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x38, 0x20, 0x3d, 0x20, +0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, +0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, +0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x39, +0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, +0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x33, +0x35, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x20, 0x3d, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x33, 0x35, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x36, 0x2e, 0x77, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, +0x5f, 0x33, 0x35, 0x36, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x31, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, +0x30, 0x20, 0x2f, 0x20, 0x5f, 0x33, 0x35, 0x39, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, +0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x36, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x36, 0x36, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, +0x35, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x36, 0x39, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, +0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, 0x30, 0x20, 0x3d, 0x20, +0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x33, 0x35, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, +0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x33, 0x37, 0x30, 0x2c, 0x20, 0x5f, 0x33, +0x36, 0x33, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x38, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, +0x28, 0x5f, 0x33, 0x37, 0x30, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x33, 0x35, 0x38, 0x20, 0x2b, 0x20, +0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x38, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x38, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, +0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, +0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, +0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, +0x74, 0x61, 0x5b, 0x5f, 0x36, 0x33, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, +0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, +0x33, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x33, 0x5d, 0x2e, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, +0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x36, 0x33, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x38, +0x36, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, +0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, 0x39, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, +0x5f, 0x38, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x31, 0x20, 0x3d, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x36, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x34, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x38, 0x34, 0x2e, +0x78, 0x2c, 0x20, 0x5f, 0x38, 0x39, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x38, +0x37, 0x2c, 0x20, 0x5f, 0x39, 0x31, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x39, +0x29, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x34, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x37, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x39, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x38, 0x37, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, 0x38, 0x2c, +0x20, 0x5f, 0x39, 0x31, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x39, 0x34, 0x2c, 0x20, 0x5f, 0x39, 0x36, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, +0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, +0x28, 0x5f, 0x39, 0x38, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x36, 0x20, 0x2b, 0x20, 0x31, 0x29, +0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x39, 0x34, 0x2c, 0x20, 0x5f, 0x39, 0x36, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, +0x20, 0x5f, 0x39, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x33, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x7b, +0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, +0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, +0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x34, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, +0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x35, 0x31, 0x32, 0x29, 0x20, 0x21, 0x3d, 0x20, +0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x32, 0x31, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x32, +0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x69, 0x6e, +0x74, 0x33, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, +0x78, 0x29, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, +0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, +0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x20, 0x3d, 0x20, +0x30, 0x3b, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x34, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, +0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x20, 0x3d, +0x20, 0x5f, 0x31, 0x32, 0x32, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x2c, 0x20, +0x5f, 0x31, 0x32, 0x36, 0x2b, 0x2b, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x32, 0x36, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, +0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x33, 0x36, 0x2e, +0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x36, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, +0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x32, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, +0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, +0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x5f, 0x31, 0x33, 0x36, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x6e, +0x74, 0x28, 0x5f, 0x31, 0x33, 0x36, 0x2e, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, +0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x5b, 0x5f, 0x31, 0x32, 0x36, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x32, 0x35, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x34, +0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, +0x34, 0x32, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x34, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, +0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x32, 0x35, 0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, +0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x33, 0x31, +0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, -0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, -0x33, 0x20, 0x5f, 0x31, 0x34, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, -0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, -0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, -0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x39, 0x34, 0x20, 0x3d, -0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, -0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, -0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x39, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, -0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, -0x75, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x33, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x34, 0x38, 0x5b, -0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, -0x33, 0x34, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, -0x28, 0x28, 0x5f, 0x31, 0x33, 0x34, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x7a, -0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x33, 0x34, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, -0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, -0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x37, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, -0x36, 0x32, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x37, 0x35, 0x5b, 0x31, 0x5d, 0x20, -0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x37, 0x35, -0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x33, -0x37, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, -0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, -0x28, 0x5f, 0x31, 0x34, 0x30, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x78, 0x29, -0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x34, 0x30, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, -0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x34, 0x30, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, -0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x34, 0x30, 0x32, 0x5b, 0x33, 0x5d, 0x29, -0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, -0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x36, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x31, 0x39, 0x34, 0x3b, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x36, 0x20, 0x3c, 0x20, 0x5f, 0x31, 0x31, 0x39, 0x38, -0x3b, 0x20, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, +0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, +0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, +0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, +0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, +0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, +0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, +0x33, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, +0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, +0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x28, +0x28, 0x28, 0x28, 0x5f, 0x31, 0x35, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x78, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x35, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, +0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x35, 0x39, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, +0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x35, 0x39, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, +0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x37, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, +0x31, 0x34, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x37, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x37, 0x38, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x37, 0x38, 0x5b, 0x33, 0x5d, +0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, +0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x39, 0x35, +0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, +0x39, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x31, 0x39, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, +0x5f, 0x31, 0x39, 0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x28, 0x5f, 0x32, 0x31, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x78, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x31, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, +0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x31, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, +0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, +0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, +0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, +0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, +0x5f, 0x32, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, +0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x32, 0x36, 0x34, 0x20, 0x3d, +0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, +0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, +0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x31, 0x2e, +0x30, 0x29, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, +0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x38, 0x20, 0x2b, +0x20, 0x28, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, +0x65, 0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x32, 0x38, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, +0x5f, 0x32, 0x32, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x32, 0x32, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x79, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x32, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x7a, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x32, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x34, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, +0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x34, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x34, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x34, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x34, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x34, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, +0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x36, 0x34, 0x5b, 0x30, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x36, 0x34, 0x5b, +0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x32, 0x36, +0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x36, +0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, +0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, +0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x38, 0x3b, 0x20, 0x5f, 0x32, 0x38, 0x36, 0x20, 0x3c, 0x20, 0x5f, 0x32, 0x38, +0x31, 0x3b, 0x20, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x34, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, -0x6e, 0x74, 0x28, 0x5f, 0x31, 0x36, 0x32, 0x36, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, -0x6e, 0x74, 0x28, 0x5f, 0x31, 0x36, 0x32, 0x36, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x29, 0x2c, -0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, +0x6e, 0x74, 0x28, 0x5f, 0x32, 0x38, 0x36, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, +0x74, 0x28, 0x5f, 0x32, 0x38, 0x36, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x30, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, +0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x32, 0x39, 0x37, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x38, 0x33, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x33, +0x30, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x33, 0x30, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x33, 0x30, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x2e, 0x7a, 0x29, 0x20, +0x2b, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x2e, +0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x32, 0x38, 0x36, 0x2b, 0x2b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x33, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x31, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x33, 0x31, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x31, 0x37, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x35, +0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x31, 0x37, 0x2e, 0x7a, 0x20, 0x3d, +0x20, 0x5f, 0x33, 0x31, 0x35, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x32, +0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x31, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, +0x32, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, +0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x34, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, +0x34, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, +0x5b, 0x5f, 0x31, 0x30, 0x34, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x2e, 0x7a, 0x29, +0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, +0x74, 0x61, 0x5b, 0x5f, 0x31, 0x30, 0x34, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, 0x34, +0x32, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, +0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x33, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, +0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, +0x2f, 0x20, 0x5f, 0x33, 0x34, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, +0x34, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x33, 0x34, 0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x2e, +0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x32, 0x20, 0x3d, 0x20, +0x66, 0x6d, 0x61, 0x28, 0x5f, 0x33, 0x34, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x33, 0x34, 0x35, 0x2c, 0x20, 0x66, 0x6d, +0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x33, 0x34, 0x33, 0x2c, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x2c, 0x20, +0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x34, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x35, +0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x33, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x35, 0x33, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x33, 0x35, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, +0x34, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x33, 0x34, 0x33, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x33, 0x35, 0x34, +0x2c, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x2c, 0x20, +0x5f, 0x33, 0x35, 0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, +0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, +0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x33, 0x35, 0x34, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x33, 0x34, +0x32, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x2c, 0x20, +0x5f, 0x33, 0x35, 0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x38, +0x39, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, +0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, +0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x39, 0x2e, 0x78, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x39, 0x2e, 0x79, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x39, 0x2e, +0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x32, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, +0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x32, 0x38, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x30, +0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x5f, 0x33, +0x36, 0x33, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x2e, +0x30, 0x20, 0x2d, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x34, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, +0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x2a, 0x20, +0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, +0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, +0x6f, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, +0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, +0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x53, 0x6d, +0x70, 0x6c, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x2c, 0x20, 0x62, 0x69, 0x61, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x29, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, +0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x39, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x7b, 0x7d, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x33, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x69, 0x6e, +0x74, 0x33, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, +0x78, 0x29, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, +0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, +0x30, 0x35, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, +0x30, 0x35, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, +0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x33, 0x20, 0x3c, +0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, +0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, +0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, +0x31, 0x30, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x36, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x33, 0x2b, 0x2b, 0x29, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, +0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, +0x31, 0x30, 0x34, 0x33, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x39, 0x37, +0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x37, 0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, +0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x31, 0x30, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x37, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, +0x34, 0x34, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, +0x65, 0x74, 0x32, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, +0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, +0x74, 0x32, 0x28, 0x5f, 0x39, 0x37, 0x38, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x39, +0x37, 0x38, 0x2e, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x30, +0x34, 0x33, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x35, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, +0x30, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, +0x30, 0x35, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, +0x5f, 0x31, 0x30, 0x34, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, +0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x38, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, +0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, +0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, +0x63, 0x65, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x39, +0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x30, 0x34, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x33, 0x35, 0x5b, 0x32, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x33, 0x35, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, +0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x36, +0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x37, 0x36, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x37, 0x36, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x7a, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x36, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, +0x34, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x38, 0x39, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x38, 0x39, 0x5b, 0x33, +0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, +0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x31, +0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x38, 0x31, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x38, 0x31, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x7a, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x31, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x78, 0x33, 0x20, 0x5f, 0x38, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, +0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, +0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, +0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x37, +0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, -0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x32, 0x31, 0x36, 0x2e, 0x78, +0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, +0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x5f, 0x36, 0x38, 0x39, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, +0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, +0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, +0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x38, 0x39, 0x20, 0x2b, 0x20, 0x28, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, +0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, +0x38, 0x34, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x38, 0x34, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x34, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, +0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x37, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x30, 0x34, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x37, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x37, 0x30, 0x5b, 0x32, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x37, 0x30, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, +0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, +0x39, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x5f, 0x38, 0x39, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x79, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x39, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, +0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x39, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, +0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, +0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x38, 0x39, 0x3b, 0x20, 0x5f, +0x31, 0x30, 0x34, 0x36, 0x20, 0x3c, 0x20, 0x5f, 0x36, 0x39, 0x33, 0x3b, 0x20, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, +0x31, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, +0x74, 0x34, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, +0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, +0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x36, 0x20, 0x25, +0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x36, 0x20, 0x2f, +0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, +0x5f, 0x39, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x75, 0x69, 0x6e, +0x74, 0x28, 0x5f, 0x37, 0x31, 0x31, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x31, 0x30, 0x34, 0x37, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x32, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x32, 0x34, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x32, +0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, +0x32, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x31, 0x31, 0x2e, 0x79, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x34, +0x36, 0x2b, 0x2b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, +0x34, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x31, 0x30, 0x33, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x38, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, +0x34, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x38, 0x2e, +0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x39, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x35, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x39, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, +0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, +0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, +0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, +0x2a, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x32, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x39, 0x2e, 0x78, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x39, 0x2e, 0x79, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x39, 0x2e, +0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x36, 0x35, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, +0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x39, 0x35, 0x39, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x67, +0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, +0x38, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, +0x78, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x37, 0x20, +0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x37, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, +0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, +0x31, 0x30, 0x34, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x2c, +0x20, 0x5f, 0x31, 0x30, 0x32, 0x37, 0x2b, 0x2b, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x30, 0x32, 0x37, 0x5d, 0x2e, 0x78, 0x20, +0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x39, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, +0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x39, 0x36, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x5f, +0x39, 0x36, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x70, +0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x32, 0x2e, 0x6d, 0x6f, 0x72, 0x70, +0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x5f, 0x39, 0x36, 0x32, 0x2e, +0x78, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x39, 0x36, 0x32, 0x2e, 0x7a, 0x29, 0x2c, 0x20, 0x30, +0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x30, 0x32, 0x37, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x34, +0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x38, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x30, 0x32, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x20, 0x3d, +0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, +0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, +0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, +0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, +0x33, 0x20, 0x5f, 0x37, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, +0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, +0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, +0x5f, 0x37, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, +0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, +0x30, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, +0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, +0x5f, 0x37, 0x32, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x79, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x32, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, +0x39, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x32, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, +0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x35, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, +0x31, 0x30, 0x32, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x35, 0x30, 0x5b, 0x31, 0x5d, 0x20, +0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x35, 0x30, 0x5b, +0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x35, 0x30, +0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, +0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, +0x37, 0x37, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x37, 0x37, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x37, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x37, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, +0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, +0x31, 0x30, 0x32, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x34, 0x5b, 0x31, 0x5d, 0x20, +0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x34, 0x5b, +0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x34, +0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, +0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x33, 0x31, 0x20, +0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, +0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, +0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, +0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, +0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x78, 0x33, 0x20, 0x5f, 0x38, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, +0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, +0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, +0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x37, 0x37, 0x20, 0x3d, 0x20, +0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x38, 0x31, +0x20, 0x3d, 0x20, 0x5f, 0x36, 0x37, 0x37, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, +0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, +0x5f, 0x31, 0x30, 0x33, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x31, 0x30, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x33, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x33, 0x31, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x33, +0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, +0x33, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, +0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, +0x5f, 0x38, 0x35, 0x38, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x38, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x79, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x35, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, +0x39, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x35, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, +0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, +0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x38, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x38, 0x35, 0x5b, 0x31, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x38, 0x35, +0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x38, +0x35, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, +0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, +0x33, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x37, 0x37, 0x3b, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x30, 0x20, 0x3c, 0x20, 0x5f, +0x36, 0x38, 0x31, 0x3b, 0x20, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x36, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x76, +0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x34, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, +0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, +0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x32, +0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x30, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, +0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x30, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, +0x29, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x36, 0x39, 0x39, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x37, 0x20, 0x2b, 0x3d, 0x20, -0x28, 0x28, 0x28, 0x5f, 0x31, 0x34, 0x32, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, -0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x34, 0x32, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, -0x36, 0x32, 0x35, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x34, 0x32, 0x39, 0x5b, 0x32, 0x5d, 0x20, -0x2a, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x34, 0x32, 0x39, 0x5b, 0x33, -0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x36, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x36, 0x2b, 0x2b, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x39, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x36, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x35, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x30, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, -0x32, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x30, 0x31, 0x2e, -0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -0x20, 0x5f, 0x31, 0x36, 0x30, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x32, 0x39, 0x2e, 0x7a, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x30, -0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x36, 0x32, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, -0x33, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, -0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x36, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, -0x36, 0x33, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x30, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x30, 0x33, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x30, 0x37, 0x2e, 0x79, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x30, 0x37, -0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, -0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x35, 0x32, 0x5d, 0x2e, 0x77, -0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, -0x2a, 0x20, 0x5f, 0x31, 0x36, 0x30, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, -0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, -0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, -0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, -0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, -0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, -0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, -0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, -0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, -0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x32, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, -0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, -0x74, 0x20, 0x5f, 0x34, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, -0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, -0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x31, 0x20, 0x2b, 0x3d, 0x20, +0x28, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x2e, 0x78, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x32, +0x39, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, +0x31, 0x30, 0x32, 0x39, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x31, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, +0x20, 0x2a, 0x20, 0x5f, 0x36, 0x39, 0x39, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x30, 0x2b, 0x2b, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, +0x33, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x31, 0x30, 0x32, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x32, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x31, 0x30, 0x32, 0x32, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x33, 0x2e, 0x79, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x36, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, +0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x36, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, +0x33, 0x36, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, +0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x33, +0x36, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, 0x34, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x5f, 0x35, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x75, 0x76, 0x30, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, +0x39, 0x39, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x35, 0x39, 0x39, 0x2e, 0x79, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, +0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x2a, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, +0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, +0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, +0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x33, 0x2e, +0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x43, +0x6f, 0x6c, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x39, 0x39, 0x2c, 0x20, +0x62, 0x69, 0x61, 0x73, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, +0x6f, 0x64, 0x42, 0x69, 0x61, 0x73, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, +0x34, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, +0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x34, +0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x20, 0x3d, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, 0x35, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x66, +0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, +0x28, 0x5f, 0x38, 0x34, 0x35, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, +0x34, 0x38, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, +0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x61, +0x63, 0x69, 0x74, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x20, 0x5f, 0x38, 0x34, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x38, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x28, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x61, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x3e, +0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4d, 0x69, +0x6e, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x70, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, +0x29, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, 0x70, 0x76, +0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, +0x5f, 0x66, 0x6f, 0x67, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, +0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x31, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x6f, 0x67, 0x53, +0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x33, 0x78, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, +0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x57, 0x6f, +0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, +0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x37, 0x36, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, +0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x35, 0x38, 0x2e, 0x79, 0x29, +0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x38, 0x35, 0x38, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x61, 0x73, +0x74, 0x3a, 0x3a, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x36, 0x34, 0x38, 0x2c, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4f, 0x6e, 0x65, 0x4f, +0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x2d, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x4e, 0x65, 0x61, 0x72, 0x4f, +0x76, 0x65, 0x72, 0x46, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x73, 0x4e, 0x65, 0x61, 0x72, 0x29, 0x2c, 0x20, 0x30, 0x2e, +0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x34, 0x36, 0x20, 0x2a, 0x20, 0x28, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x69, 0x62, 0x6c, 0x4c, 0x75, 0x6d, 0x69, +0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x5f, 0x36, 0x39, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x38, 0x35, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x37, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, +0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x78, 0x79, +0x7a, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, +0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x2e, 0x77, 0x29, +0x20, 0x2a, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, +0x74, 0x28, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x34, +0x37, 0x36, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, +0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, +0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, +0x69, 0x7a, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, +0x5f, 0x38, 0x34, 0x35, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x36, 0x34, +0x38, 0x20, 0x2d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x6f, +0x67, 0x49, 0x6e, 0x73, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, +0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x78, +0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x39, 0x38, 0x29, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x38, 0x35, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x38, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x35, 0x32, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x36, 0x32, 0x20, 0x3d, 0x20, +0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, +0x5b, 0x5f, 0x31, 0x37, 0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, +0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x37, +0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x37, 0x39, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x32, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, +0x6e, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x37, 0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x32, 0x2e, 0x78, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x32, 0x2e, 0x79, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x32, 0x2e, +0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x20, 0x3d, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, +0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, +0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x33, 0x36, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, +0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, +0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, +0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x32, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x38, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x28, 0x5f, 0x32, 0x31, 0x34, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, +0x5f, 0x32, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x32, 0x30, 0x39, +0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x33, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, +0x5f, 0x32, 0x31, 0x38, 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x32, 0x32, 0x33, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x39, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x39, 0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, +0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x31, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, +0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, +0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x33, 0x39, 0x36, 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x39, 0x2c, 0x20, +0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x33, 0x39, +0x36, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, +0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x35, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, +0x20, 0x5f, 0x33, 0x39, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, +0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x37, 0x39, 0x3b, 0x00, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x37, 0x20, +0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x32, 0x20, 0x3d, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, +0x2f, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, +0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, +0x31, 0x33, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x32, 0x5d, 0x2e, +0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x35, 0x31, 0x32, 0x29, +0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, +0x33, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, +0x33, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, +0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x69, 0x6e, +0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x2f, 0x20, +0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, +0x31, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, +0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, +0x31, 0x31, 0x34, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, +0x31, 0x31, 0x34, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, +0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x39, 0x20, +0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, +0x61, 0x5b, 0x5f, 0x34, 0x34, 0x32, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, +0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x32, 0x2c, +0x20, 0x5f, 0x31, 0x31, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x32, +0x39, 0x2b, 0x2b, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, +0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, +0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x31, 0x32, 0x39, 0x5d, 0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, +0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, +0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x39, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x33, +0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x35, +0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x31, 0x31, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x30, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x70, 0x76, 0x44, +0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x32, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, +0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x2e, 0x78, +0x79, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x35, 0x33, 0x2e, 0x7a, 0x29, 0x2c, 0x20, 0x30, +0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x31, 0x32, 0x39, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x34, +0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x39, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x30, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x31, 0x33, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x20, 0x3d, +0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x32, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, +0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x32, 0x35, 0x36, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x35, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, +0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, +0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, +0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, +0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, +0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, +0x33, 0x20, 0x5f, 0x38, 0x36, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, +0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, +0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, +0x5f, 0x38, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x5d, +0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, +0x28, 0x28, 0x5f, 0x38, 0x30, 0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x78, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, +0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x30, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x31, 0x33, 0x31, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x30, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, +0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, +0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x33, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x33, 0x33, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x33, +0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, +0x33, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, +0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x28, 0x5f, 0x38, 0x36, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x78, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x36, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, +0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x36, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, +0x33, 0x31, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x36, 0x30, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, +0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, +0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x38, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x38, 0x37, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x38, +0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, +0x38, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, +0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x31, +0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, +0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, +0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, +0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, +0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, 0x36, 0x30, 0x20, +0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, +0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, +0x36, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x36, 0x30, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x33, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x31, 0x31, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x34, 0x5b, 0x30, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x31, 0x34, +0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, +0x39, 0x31, 0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, +0x5f, 0x39, 0x31, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, +0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x28, 0x5f, 0x39, 0x34, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x78, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x34, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, +0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x34, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x31, 0x33, 0x31, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x34, 0x31, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, +0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, +0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x36, 0x38, 0x5b, 0x30, 0x5d, 0x20, +0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x36, 0x38, 0x5b, +0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, +0x36, 0x38, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, +0x39, 0x36, 0x38, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, +0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, +0x31, 0x31, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x36, 0x30, 0x3b, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x32, 0x20, 0x3c, +0x20, 0x5f, 0x37, 0x36, 0x34, 0x3b, 0x20, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x73, +0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x34, 0x2e, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, +0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, +0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x33, 0x32, 0x20, 0x25, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, +0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x33, 0x32, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x75, +0x29, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x39, 0x35, 0x20, 0x3d, +0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x37, 0x38, 0x32, +0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x33, 0x20, 0x2b, +0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x39, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, +0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x39, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x31, 0x33, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x39, 0x35, 0x5b, 0x32, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x39, 0x35, 0x5b, 0x33, 0x5d, 0x29, +0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x38, 0x32, 0x2e, 0x79, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x32, 0x2b, 0x2b, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x5f, +0x31, 0x31, 0x33, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x20, 0x5f, 0x31, 0x31, 0x31, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x31, +0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x33, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x35, 0x2e, 0x79, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x31, 0x33, 0x35, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, +0x33, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x31, 0x31, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, +0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x32, 0x5d, +0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, +0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x38, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, +0x5f, 0x34, 0x34, 0x32, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, +0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x38, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, +0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x32, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, +0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, +0x33, 0x38, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x32, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, 0x72, 0x6c, +0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x30, 0x2e, +0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x77, 0x6f, +0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, +0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, +0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x30, 0x33, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, +0x37, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, +0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, +0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, +0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, +0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, +0x5f, 0x34, 0x37, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x37, 0x37, 0x20, 0x3d, +0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, +0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, +0x43, 0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x38, +0x30, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, +0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, +0x34, 0x38, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x39, 0x31, 0x20, +0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x34, 0x37, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x2e, 0x77, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, +0x28, 0x5f, 0x34, 0x37, 0x32, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, +0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x38, 0x30, 0x2c, 0x20, 0x5f, 0x34, 0x39, 0x31, 0x2c, 0x20, 0x28, 0x2d, 0x31, +0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x35, 0x30, 0x32, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x34, 0x20, 0x3d, 0x20, +0x5f, 0x34, 0x37, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, +0x5f, 0x35, 0x30, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x34, +0x34, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x38, 0x30, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, +0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x34, +0x34, 0x2c, 0x20, 0x5f, 0x34, 0x39, 0x31, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x32, 0x2c, +0x20, 0x5f, 0x35, 0x30, 0x36, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, +0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, +0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x34, 0x34, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, +0x34, 0x37, 0x37, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x32, +0x2c, 0x20, 0x5f, 0x35, 0x30, 0x36, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, +0x5f, 0x31, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, +0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, +0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, +0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x37, 0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, +0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, +0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, +0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x37, 0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, +0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, +0x74, 0x61, 0x5b, 0x5f, 0x31, 0x37, 0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, +0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, +0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x31, 0x37, +0x39, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, +0x72, 0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, +0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, +0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x39, 0x20, 0x3d, 0x20, 0x6f, 0x75, +0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, +0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, +0x4e, 0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x20, 0x3d, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, +0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x30, 0x33, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x39, 0x39, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x32, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x33, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, +0x39, 0x33, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x32, 0x30, 0x38, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, +0x2f, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x2c, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, +0x20, 0x2b, 0x20, 0x5f, 0x32, 0x30, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x32, 0x36, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x33, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x30, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x2d, +0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, +0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x33, 0x38, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x31, 0x34, +0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x36, 0x2c, 0x20, 0x5f, 0x32, 0x33, 0x30, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, +0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, +0x33, 0x38, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x39, 0x39, 0x20, 0x2b, 0x20, 0x31, 0x29, +0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x36, 0x2c, 0x20, 0x5f, 0x32, 0x33, 0x30, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x35, 0x3b, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x28, 0x69, 0x6e, +0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x25, 0x20, +0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, +0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x30, +0x3b, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x34, 0x20, 0x3c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x32, 0x5d, 0x2e, 0x6d, 0x6f, 0x72, 0x70, +0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x34, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x37, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, +0x32, 0x36, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x34, 0x2b, 0x2b, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, +0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x31, 0x31, 0x34, 0x5d, +0x2e, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x38, 0x20, 0x3d, 0x20, +0x5f, 0x31, 0x31, 0x32, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x34, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x32, +0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x35, +0x20, 0x2b, 0x20, 0x28, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, +0x32, 0x2e, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, +0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x32, +0x28, 0x5f, 0x31, 0x30, 0x33, 0x38, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x30, +0x33, 0x38, 0x2e, 0x7a, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x69, 0x6e, 0x67, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x5f, 0x31, 0x31, +0x31, 0x34, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x34, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x36, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, +0x31, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, +0x31, 0x32, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, +0x5f, 0x31, 0x31, 0x32, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x37, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x74, +0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, +0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, +0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, +0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, +0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, +0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, +0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, +0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x38, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, +0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, +0x63, 0x65, 0x73, 0x2e, 0x77, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x30, +0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x5f, 0x37, 0x39, 0x35, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x31, 0x31, 0x36, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x39, 0x35, 0x5b, 0x31, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x39, 0x35, 0x5b, 0x32, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x39, 0x35, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, +0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x32, +0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x38, 0x32, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x38, 0x32, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x7a, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x32, 0x32, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x39, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, +0x31, 0x36, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x39, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x38, 0x34, 0x39, 0x5b, 0x32, 0x5d, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x34, 0x39, 0x5b, 0x33, +0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, +0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x38, 0x37, +0x36, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, +0x5f, 0x38, 0x37, 0x36, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x79, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x5f, 0x38, 0x37, 0x36, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x7a, +0x29, 0x20, 0x2b, 0x20, 0x5f, 0x38, 0x37, 0x36, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, +0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x77, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, +0x78, 0x33, 0x20, 0x5f, 0x39, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, +0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, +0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, +0x2e, 0x78, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x33, +0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, +0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x5d, 0x2e, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x39, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x72, +0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, +0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, +0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, +0x6d, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x5f, 0x37, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, +0x2d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, +0x74, 0x73, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, +0x69, 0x6e, 0x74, 0x20, 0x5f, 0x37, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x39, 0x20, 0x2b, 0x20, 0x28, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, +0x77, 0x20, 0x2d, 0x20, 0x33, 0x75, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x5f, +0x39, 0x30, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x28, 0x5f, 0x39, 0x30, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x79, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x30, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, +0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x30, 0x33, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, +0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, +0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x30, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, +0x31, 0x31, 0x36, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x33, 0x30, 0x5b, 0x32, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x33, 0x30, 0x5b, +0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, +0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, +0x35, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x5f, 0x39, 0x35, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x79, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x35, 0x37, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, +0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x35, 0x37, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, +0x2e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x7a, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, +0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x34, 0x39, 0x3b, 0x20, 0x5f, +0x31, 0x31, 0x31, 0x37, 0x20, 0x3c, 0x20, 0x5f, 0x37, 0x35, 0x33, 0x3b, 0x20, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x37, +0x37, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x76, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, +0x74, 0x34, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, +0x65, 0x73, 0x41, 0x6e, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x69, +0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x31, 0x37, 0x20, 0x25, +0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x31, 0x37, 0x20, 0x2f, +0x20, 0x32, 0x30, 0x34, 0x38, 0x75, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, +0x5f, 0x39, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x62, 0x6f, 0x6e, +0x65, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x5b, 0x75, 0x69, 0x6e, +0x74, 0x28, 0x5f, 0x37, 0x37, 0x31, 0x2e, 0x78, 0x29, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x31, 0x31, 0x31, 0x38, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x39, 0x38, 0x34, 0x5b, 0x30, 0x5d, 0x20, 0x2a, +0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x38, 0x34, 0x5b, 0x31, +0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x5f, 0x39, 0x38, +0x34, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x39, +0x38, 0x34, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x37, 0x31, 0x2e, 0x79, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x31, +0x37, 0x2b, 0x2b, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, +0x32, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x30, 0x2e, 0x78, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x38, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, +0x31, 0x31, 0x32, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x39, +0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x38, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x36, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x46, 0x72, 0x6f, +0x6d, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, +0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, +0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5d, 0x20, 0x2a, +0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, +0x74, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x32, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, +0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x33, +0x2e, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, +0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x32, 0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, +0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, +0x5f, 0x31, 0x31, 0x32, 0x33, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, +0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x32, 0x5d, 0x2e, 0x77, +0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, +0x32, 0x5d, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x33, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x62, 0x6a, 0x65, +0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x5f, 0x34, 0x34, 0x32, +0x5d, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x72, +0x69, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x76, 0x65, +0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x36, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, +0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, 0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, -0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x39, 0x31, 0x20, 0x3d, -0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x38, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x5f, 0x34, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x34, 0x38, 0x33, -0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x30, 0x38, 0x20, 0x3d, 0x20, -0x5f, 0x34, 0x37, 0x38, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, -0x31, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x37, 0x38, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x34, 0x39, -0x31, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x38, 0x36, 0x2c, 0x20, 0x5f, -0x34, 0x39, 0x37, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x34, 0x39, 0x31, 0x29, 0x20, -0x2a, 0x20, 0x5f, 0x35, 0x30, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, -0x5f, 0x31, 0x36, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, -0x36, 0x31, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x31, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, -0x20, 0x5f, 0x34, 0x38, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, -0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, -0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x36, 0x33, 0x38, 0x2c, 0x20, 0x5f, 0x34, 0x39, 0x37, 0x2c, 0x20, 0x31, 0x2e, 0x30, -0x29, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x38, 0x2c, 0x20, 0x5f, 0x35, 0x31, 0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, -0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x36, 0x33, 0x38, 0x2c, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x34, 0x38, 0x33, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, -0x30, 0x29, 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x38, 0x2c, 0x20, 0x5f, 0x35, 0x31, 0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, -0x31, 0x36, 0x31, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x32, 0x3b, 0x00, 0x4c, 0x53, 0x4c, -0x47, 0x5f, 0x54, 0x41, 0x4d, 0xd0, 0x11, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, -0xbe, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xda, 0x01, 0x00, 0x00, 0x01, 0x08, 0x00, 0x14, 0x02, 0x00, 0x00, 0x01, 0x10, -0x00, 0xbe, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x2c, 0x04, 0x00, 0x00, 0x01, 0x18, 0x00, 0x14, 0x02, 0x00, 0x00, 0x01, -0x20, 0x01, 0x40, 0x04, 0x00, 0x00, 0x01, 0x30, 0x01, 0x88, 0x05, 0x00, 0x00, 0x01, 0x44, 0x01, 0xca, 0x05, 0x00, 0x00, -0x01, 0x80, 0x00, 0xe2, 0x05, 0x00, 0x00, 0x01, 0x88, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x01, 0x90, 0x00, 0xe2, 0x05, 0x00, -0x00, 0x01, 0x98, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x52, 0x09, 0x00, 0x00, 0x02, 0x00, 0x01, 0x70, 0x0a, -0x00, 0x00, 0x02, 0x08, 0x00, 0xa8, 0x0a, 0x00, 0x00, 0x02, 0x10, 0x00, 0x52, 0x09, 0x00, 0x00, 0x02, 0x10, 0x01, 0xc2, -0x0c, 0x00, 0x00, 0x02, 0x18, 0x00, 0xa8, 0x0a, 0x00, 0x00, 0x02, 0x20, 0x01, 0xd4, 0x0c, 0x00, 0x00, 0x02, 0x30, 0x01, -0x0a, 0x0e, 0x00, 0x00, 0x02, 0x44, 0x01, 0x4a, 0x0e, 0x00, 0x00, 0x02, 0x80, 0x00, 0x60, 0x0e, 0x00, 0x00, 0x02, 0x88, -0x00, 0x9a, 0x0f, 0x00, 0x00, 0x02, 0x90, 0x00, 0x60, 0x0e, 0x00, 0x00, 0x02, 0x98, 0x00, 0x9a, 0x0f, 0x00, 0x00, 0x1b, -0x0a, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, -0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, -0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, -0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, -0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, -0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, -0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, -0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, -0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, -0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, -0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x63, 0x00, 0x64, -0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, -0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, -0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, -0x00, 0x6d, 0x00, 0x11, 0x02, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x02, -0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x04, 0x00, 0x88, 0x00, 0x89, 0x00, 0x8a, -0x00, 0x62, 0x00, 0x02, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x65, 0x00, 0x8d, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x6d, -0x00, 0xc0, 0x17, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, -0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, -0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x8f, 0x00, 0x02, 0x00, 0x90, 0x00, 0x91, 0x00, 0x04, 0x00, 0x11, 0x00, 0x12, -0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, -0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, -0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, -0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, -0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, -0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, -0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, -0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, -0x00, 0x60, 0x00, 0x61, 0x00, 0x92, 0x00, 0x02, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x02, 0x00, 0x96, 0x00, 0x97, -0x00, 0x62, 0x00, 0x02, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x98, 0x00, 0x99, 0x00, 0x66, 0x00, 0x9a, 0x00, 0x9b, -0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x9c, 0x00, 0x02, 0x00, 0x9d, 0x00, 0x02, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, -0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0x6d, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, -0x00, 0xaa, 0x00, 0xab, 0x00, 0x02, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0x6d, 0x00, 0xb1, -0x00, 0x6d, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, -0x00, 0x6d, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0x02, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, -0x00, 0xba, 0x00, 0xbb, 0x00, 0x02, 0x00, 0xbc, 0x00, 0x02, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0x6d, -0x00, 0x6e, 0x00, 0x02, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0xc3, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, -0x00, 0xc4, 0x00, 0x6d, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0x02, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x6d, 0x00, 0xc9, 0x00, 0xb4, -0x00, 0x02, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0x02, 0x00, 0xd1, -0x00, 0x02, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xd6, 0x00, 0xd7, -0x00, 0x6d, 0x00, 0x6d, 0x00, 0xd8, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xd9, 0x00, 0x6d, 0x00, 0xda, 0x00, 0xc6, -0x00, 0x02, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0xde, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0x6d, 0x00, 0x6e, -0x00, 0x02, 0x00, 0xe2, 0x00, 0x6d, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, -0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, 0x00, 0xf0, 0x00, 0x6d, 0x00, 0x51, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x96, 0x0c, 0x00, -0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x02, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, -0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x04, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0x17, 0x00, 0x02, 0x00, 0xf4, -0x00, 0xf5, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, -0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, -0x01, 0x09, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x0c, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, -0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, -0x01, 0x1d, 0x01, 0x1e, 0x01, 0x1f, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x26, -0x01, 0x27, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x2e, 0x01, 0x2f, 0x01, 0x30, -0x01, 0x31, 0x01, 0x32, 0x01, 0x33, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, -0x01, 0x3b, 0x01, 0x3c, 0x01, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x65, 0x00, 0x3d, 0x01, 0x3e, -0x01, 0x8d, 0x00, 0x3f, 0x01, 0x02, 0x00, 0x40, 0x01, 0x41, 0x01, 0x02, 0x00, 0x42, 0x01, 0x6d, 0x00, 0x43, 0x01, 0x44, -0x01, 0x45, 0x01, 0x02, 0x00, 0x46, 0x01, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x47, 0x01, 0x6d, 0x00, 0x48, 0x01, 0x49, -0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x02, 0x00, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x6d, 0x00, 0x6e, -0x00, 0x02, 0x00, 0x51, 0x01, 0x6d, 0x00, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x02, 0x00, 0x55, 0x01, 0x56, 0x01, 0x57, -0x01, 0x58, 0x01, 0x59, 0x01, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x5a, 0x01, 0x6d, 0x00, 0x5b, 0x01, 0x5c, 0x01, 0x5d, -0x01, 0x5e, 0x01, 0x5f, 0x01, 0x42, 0x01, 0x6d, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, -0x01, 0x64, 0x01, 0x6d, 0x00, 0xec, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x05, -0x00, 0x02, 0x00, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x04, 0x00, 0x0d, -0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x6c, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x6d, 0x01, 0x6e, -0x01, 0x6a, 0x00, 0x02, 0x00, 0x6f, 0x01, 0x70, 0x01, 0x6d, 0x00, 0x91, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x7f, 0x00, 0x80, 0x00, 0x8d, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x71, 0x01, 0x6d, 0x00, 0xa9, 0x0c, 0x00, 0x00, 0x99, -0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, -0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, -0x00, 0x10, 0x00, 0x73, 0x01, 0x74, 0x01, 0x0f, 0x00, 0x75, 0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, -0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, -0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, -0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, -0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, -0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, -0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, -0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, -0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, -0x00, 0x02, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x67, 0x00, 0x66, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, -0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x76, 0x01, 0x77, -0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, -0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, -0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x6d, 0x00, 0xf2, 0x19, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x00, 0x00, 0x72, -0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, -0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x73, 0x01, 0x74, -0x01, 0x0f, 0x00, 0x75, 0x01, 0x8f, 0x00, 0x02, 0x00, 0x90, 0x00, 0x91, 0x00, 0x04, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, -0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, -0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, -0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, -0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, -0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, -0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, -0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, -0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, -0x00, 0x61, 0x00, 0x92, 0x00, 0x02, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x02, 0x00, 0x96, 0x00, 0x97, 0x00, 0x62, -0x00, 0x02, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x98, 0x00, 0x99, 0x00, 0x67, 0x00, 0x66, 0x00, 0x9a, 0x00, 0x9b, -0x00, 0x68, 0x00, 0x69, 0x00, 0x9c, 0x00, 0x02, 0x00, 0x9d, 0x00, 0x02, 0x00, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, -0x01, 0x93, 0x01, 0xa3, 0x00, 0x6d, 0x00, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, -0x01, 0x9b, 0x01, 0x02, 0x00, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xb0, 0x00, 0x6d, 0x00, 0xa0, 0x01, 0x6d, -0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, -0x00, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0x02, 0x00, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, -0x01, 0xaa, 0x01, 0xab, 0x01, 0x02, 0x00, 0xac, 0x01, 0x02, 0x00, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0x6d, -0x00, 0x6e, 0x00, 0x02, 0x00, 0xb1, 0x01, 0xb2, 0x01, 0x6d, 0x00, 0x6d, 0x00, 0xb3, 0x01, 0x6d, 0x00, 0x6e, 0x00, 0x02, -0x00, 0xb4, 0x01, 0x6d, 0x00, 0xb5, 0x01, 0xb6, 0x01, 0x02, 0x00, 0xb7, 0x01, 0xb8, 0x01, 0x6d, 0x00, 0xb9, 0x01, 0xa4, -0x01, 0x02, 0x00, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0x02, 0x00, 0xc1, -0x01, 0x02, 0x00, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xc6, 0x01, 0xc7, -0x01, 0x6d, 0x00, 0x6d, 0x00, 0xc8, 0x01, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xc9, 0x01, 0x6d, 0x00, 0xca, 0x01, 0xb6, -0x01, 0x02, 0x00, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0x6d, 0x00, 0x6e, -0x00, 0x02, 0x00, 0xd2, 0x01, 0x6d, 0x00, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, -0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, -0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xe9, 0x01, 0x6d, 0x00, 0x4b, 0x09, 0x00, 0x00, 0x8b, -0x00, 0x00, 0x00, 0xea, 0x01, 0xeb, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, -0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, -0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, -0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, -0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x2a, -0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x0a, 0x01, 0x0b, 0x01, 0x0c, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, -0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x39, 0x00, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x3d, 0x00, 0x1a, -0x01, 0x1b, 0x01, 0x40, 0x00, 0x1d, 0x01, 0x1e, 0x01, 0x43, 0x00, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x48, -0x00, 0x49, 0x00, 0x26, 0x01, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x2a, 0x01, 0x2b, 0x01, 0x50, 0x00, 0x2d, 0x01, 0x52, -0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x33, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x5b, 0x00, 0x38, -0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x65, -0x00, 0x66, 0x00, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x6d, -0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, -0x01, 0xf5, 0x01, 0xf6, 0x01, 0x78, 0x00, 0x79, 0x00, 0x7a, 0x00, 0xf7, 0x01, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x6d, -0x00, 0x12, 0x02, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xea, 0x01, 0xeb, 0x01, 0x81, 0x00, 0x02, 0x00, 0x82, 0x00, 0x83, -0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x04, 0x00, 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x62, 0x00, 0x02, -0x00, 0x8b, 0x00, 0x8c, 0x00, 0x65, 0x00, 0x8d, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x6d, 0x00, 0xdc, 0x16, 0x00, -0x00, 0x09, 0x01, 0x00, 0x00, 0xea, 0x01, 0xeb, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, -0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, -0x00, 0x0f, 0x00, 0x10, 0x00, 0x8f, 0x00, 0x02, 0x00, 0x90, 0x00, 0x91, 0x00, 0x04, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, -0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, -0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, -0x00, 0x25, 0x00, 0x26, 0x00, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x0a, -0x01, 0x0b, 0x01, 0x0c, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, -0x01, 0x39, 0x00, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x3d, 0x00, 0x1a, 0x01, 0x1b, 0x01, 0x40, 0x00, 0x1d, 0x01, 0x1e, -0x01, 0x43, 0x00, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x48, 0x00, 0x49, 0x00, 0x26, 0x01, 0x4b, 0x00, 0x4c, -0x00, 0x4d, 0x00, 0x2a, 0x01, 0x2b, 0x01, 0x50, 0x00, 0x2d, 0x01, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, -0x00, 0x33, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x5b, 0x00, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, -0x01, 0x61, 0x00, 0x92, 0x00, 0x02, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x02, 0x00, 0xf8, 0x01, 0x97, 0x00, 0x62, -0x00, 0x02, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x65, 0x00, 0xf9, 0x01, 0xfa, 0x01, 0x66, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0xec, -0x01, 0xed, 0x01, 0xee, 0x01, 0x9c, 0x00, 0x02, 0x00, 0x9d, 0x00, 0x02, 0x00, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, -0x01, 0xff, 0x01, 0xa3, 0x00, 0x6d, 0x00, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0xa7, 0x00, 0xa8, 0x00, 0x03, 0x02, 0x04, -0x02, 0x05, 0x02, 0x02, 0x00, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0xb0, 0x00, 0x6d, 0x00, 0x0a, 0x02, 0x6d, -0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, -0x00, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x02, 0x00, 0xb3, 0x00, 0x0e, 0x02, 0x0f, 0x02, 0xc4, 0x00, 0xce, 0x00, 0x10, -0x02, 0x11, 0x02, 0x02, 0x00, 0x12, 0x02, 0x02, 0x00, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x6d, 0x00, 0x6e, -0x00, 0x02, 0x00, 0x17, 0x02, 0x18, 0x02, 0x6d, 0x00, 0x6d, 0x00, 0x19, 0x02, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x1a, -0x02, 0x6d, 0x00, 0x1b, 0x02, 0x1c, 0x02, 0x02, 0x00, 0x1d, 0x02, 0x1e, 0x02, 0x6d, 0x00, 0xda, 0x00, 0x0d, 0x02, 0x02, -0x00, 0xc9, 0x00, 0x1f, 0x02, 0x20, 0x02, 0xd9, 0x00, 0x21, 0x02, 0xba, 0x00, 0x22, 0x02, 0x02, 0x00, 0x23, 0x02, 0x02, -0x00, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x28, 0x02, 0x29, 0x02, 0x6d, -0x00, 0x6d, 0x00, 0xe2, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x2a, 0x02, 0x6d, 0x00, 0x2b, 0x02, 0x1c, 0x02, 0x02, -0x00, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x6d, 0x00, 0x6e, 0x00, 0x02, -0x00, 0x33, 0x02, 0x6d, 0x00, 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0xea, -0x00, 0xeb, 0x00, 0xec, 0x00, 0x3b, 0x02, 0xee, 0x00, 0xef, 0x00, 0xf0, 0x00, 0x6d, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, -0x00, 0x00, 0x00, 0xea, 0x01, 0xeb, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x6d, 0x00, 0xc0, 0x0a, 0x00, 0x00, 0x97, 0x00, 0x00, -0x00, 0xea, 0x01, 0xeb, 0x01, 0x81, 0x00, 0x02, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, -0x00, 0x04, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, -0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, -0x00, 0x26, 0x00, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x0a, 0x01, 0x0b, -0x01, 0x0c, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x39, -0x00, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x3d, 0x00, 0x1a, 0x01, 0x1b, 0x01, 0x40, 0x00, 0x1d, 0x01, 0x1e, 0x01, 0x43, -0x00, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x48, 0x00, 0x49, 0x00, 0x26, 0x01, 0x4b, 0x00, 0x4c, 0x00, 0x4d, -0x00, 0x2a, 0x01, 0x2b, 0x01, 0x50, 0x00, 0x2d, 0x01, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x33, -0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x5b, 0x00, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x61, -0x00, 0x62, 0x00, 0x02, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x65, 0x00, 0x3c, 0x02, 0x3d, 0x02, 0x8d, 0x00, 0x3e, 0x02, 0x02, -0x00, 0x3f, 0x02, 0x41, 0x01, 0x02, 0x00, 0x42, 0x01, 0x6d, 0x00, 0x40, 0x02, 0x41, 0x02, 0x45, 0x01, 0x02, 0x00, 0x46, -0x01, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x47, 0x01, 0x6d, 0x00, 0x42, 0x02, 0x4b, 0x01, 0x4c, 0x01, 0x02, 0x00, 0x43, -0x02, 0x44, 0x02, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x51, 0x01, 0x6d, 0x00, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x02, -0x00, 0x45, 0x02, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x5a, 0x01, 0x6d, 0x00, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, -0x01, 0x5f, 0x01, 0x42, 0x01, 0x6d, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x60, 0x01, 0x61, 0x01, 0x46, 0x02, 0x63, 0x01, 0x64, -0x01, 0x6d, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xea, 0x01, 0xeb, 0x01, 0x05, 0x00, 0x02, 0x00, 0x06, -0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, -0x00, 0x10, 0x00, 0x6c, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x47, 0x02, 0x48, 0x02, 0x6a, 0x00, 0x02, -0x00, 0x6f, 0x01, 0x70, 0x01, 0x6d, 0x00, 0x92, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xea, 0x01, 0xeb, 0x01, 0x8d, -0x00, 0x6a, 0x00, 0x02, 0x00, 0x71, 0x01, 0x6d, 0x00, 0xc0, 0x0b, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0xea, 0x01, 0xeb, -0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, -0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x73, 0x01, 0x74, -0x01, 0x0f, 0x00, 0x75, 0x01, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, -0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, -0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x03, 0x01, 0x04, 0x01, 0x05, -0x01, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x0a, 0x01, 0x0b, 0x01, 0x0c, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x0f, -0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x39, 0x00, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x3d, -0x00, 0x1a, 0x01, 0x1b, 0x01, 0x40, 0x00, 0x1d, 0x01, 0x1e, 0x01, 0x43, 0x00, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, -0x01, 0x48, 0x00, 0x49, 0x00, 0x26, 0x01, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x2a, 0x01, 0x2b, 0x01, 0x50, 0x00, 0x2d, -0x01, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x33, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x5b, -0x00, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x8b, 0x00, 0x8c, -0x00, 0x65, 0x00, 0xec, 0x01, 0x66, 0x00, 0xed, 0x01, 0xee, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, -0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x49, 0x02, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, -0x02, 0x4e, 0x02, 0x4f, 0x02, 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, 0x55, 0x02, 0x56, 0x02, 0x57, -0x02, 0x58, 0x02, 0x59, 0x02, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, -0x02, 0x6d, 0x00, 0x43, 0x19, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0xea, 0x01, 0xeb, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, -0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, -0x00, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x73, 0x01, 0x74, 0x01, 0x0f, 0x00, 0x75, 0x01, 0x8f, -0x00, 0x02, 0x00, 0x90, 0x00, 0x91, 0x00, 0x04, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x14, 0x00, 0x02, -0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, -0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x03, -0x01, 0x04, 0x01, 0x05, 0x01, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x0a, 0x01, 0x0b, 0x01, 0x0c, 0x01, 0x0d, -0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x39, 0x00, 0x16, 0x01, 0x17, -0x01, 0x18, 0x01, 0x3d, 0x00, 0x1a, 0x01, 0x1b, 0x01, 0x40, 0x00, 0x1d, 0x01, 0x1e, 0x01, 0x43, 0x00, 0x20, 0x01, 0x21, -0x01, 0x22, 0x01, 0x23, 0x01, 0x48, 0x00, 0x49, 0x00, 0x26, 0x01, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x2a, 0x01, 0x2b, -0x01, 0x50, 0x00, 0x2d, 0x01, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x33, 0x01, 0x34, 0x01, 0x35, -0x01, 0x36, 0x01, 0x5b, 0x00, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x61, 0x00, 0x92, 0x00, 0x02, -0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x02, 0x00, 0xf8, 0x01, 0x97, 0x00, 0x62, 0x00, 0x02, 0x00, 0x8b, 0x00, 0x8c, -0x00, 0x65, 0x00, 0xf9, 0x01, 0xfa, 0x01, 0xec, 0x01, 0x66, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0xed, 0x01, 0xee, 0x01, 0x9c, -0x00, 0x02, 0x00, 0x9d, 0x00, 0x02, 0x00, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0xa3, 0x00, 0x6d, -0x00, 0x67, 0x02, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x02, 0x00, 0x6f, -0x02, 0x70, 0x02, 0x71, 0x02, 0x72, 0x02, 0xb0, 0x00, 0x6d, 0x00, 0x73, 0x02, 0x6d, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, -0x00, 0x02, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x74, 0x02, 0x75, 0x02, 0x76, -0x02, 0x77, 0x02, 0x02, 0x00, 0x78, 0x02, 0x79, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x02, -0x00, 0x7f, 0x02, 0x02, 0x00, 0x80, 0x02, 0x81, 0x02, 0x82, 0x02, 0x83, 0x02, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x84, -0x02, 0x85, 0x02, 0x6d, 0x00, 0x6d, 0x00, 0x86, 0x02, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x87, 0x02, 0x6d, 0x00, 0x88, -0x02, 0x89, 0x02, 0x02, 0x00, 0x8a, 0x02, 0x8b, 0x02, 0x6d, 0x00, 0x8c, 0x02, 0x77, 0x02, 0x02, 0x00, 0x8d, 0x02, 0x8e, -0x02, 0x8f, 0x02, 0x90, 0x02, 0x91, 0x02, 0x92, 0x02, 0x93, 0x02, 0x02, 0x00, 0x94, 0x02, 0x02, 0x00, 0x95, 0x02, 0x96, -0x02, 0x97, 0x02, 0x98, 0x02, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x99, 0x02, 0x9a, 0x02, 0x6d, 0x00, 0x6d, 0x00, 0x9b, -0x02, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x9c, 0x02, 0x6d, 0x00, 0x9d, 0x02, 0x89, 0x02, 0x02, 0x00, 0x9e, 0x02, 0x9f, -0x02, 0xa0, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xa5, 0x02, 0x6d, -0x00, 0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa9, 0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xaf, -0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, -0x02, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0x6d, 0x00, 0x4c, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x41, 0x4d, 0x96, 0x11, 0x00, -0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xe2, -0x01, 0x00, 0x00, 0x01, 0x08, 0x00, 0x18, 0x02, 0x00, 0x00, 0x01, 0x10, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, -0x08, 0x04, 0x00, 0x00, 0x01, 0x18, 0x00, 0x18, 0x02, 0x00, 0x00, 0x01, 0x20, 0x01, 0x22, 0x04, 0x00, 0x00, 0x01, 0x30, -0x01, 0x8a, 0x05, 0x00, 0x00, 0x01, 0x44, 0x01, 0xee, 0x05, 0x00, 0x00, 0x01, 0x80, 0x00, 0x18, 0x06, 0x00, 0x00, 0x01, -0x88, 0x00, 0x66, 0x07, 0x00, 0x00, 0x01, 0x90, 0x00, 0x18, 0x06, 0x00, 0x00, 0x01, 0x98, 0x00, 0x66, 0x07, 0x00, 0x00, -0x02, 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x02, 0x00, 0x01, 0xa4, 0x0a, 0x00, 0x00, 0x02, 0x08, 0x00, 0xda, 0x0a, 0x00, -0x00, 0x02, 0x10, 0x00, 0x80, 0x09, 0x00, 0x00, 0x02, 0x10, 0x01, 0x08, 0x04, 0x00, 0x00, 0x02, 0x18, 0x00, 0xda, 0x0a, -0x00, 0x00, 0x02, 0x20, 0x01, 0xca, 0x0c, 0x00, 0x00, 0x02, 0x30, 0x01, 0x8a, 0x05, 0x00, 0x00, 0x02, 0x44, 0x01, 0xee, -0x05, 0x00, 0x00, 0x02, 0x80, 0x00, 0x2e, 0x0e, 0x00, 0x00, 0x02, 0x88, 0x00, 0x7c, 0x0f, 0x00, 0x00, 0x02, 0x90, 0x00, -0x2e, 0x0e, 0x00, 0x00, 0x02, 0x98, 0x00, 0x7c, 0x0f, 0x00, 0x00, 0x92, 0x0e, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0xbd, -0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0x05, 0x00, 0x02, 0x00, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, -0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0x04, 0x00, 0xbf, 0x02, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0xc8, 0x02, 0xbf, -0x02, 0xc9, 0x02, 0x02, 0x00, 0xca, 0x02, 0x04, 0x00, 0xbf, 0x02, 0xcb, 0x02, 0x02, 0x00, 0xcc, 0x02, 0xcd, 0x02, 0xce, -0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, -0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, -0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, -0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, -0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x02, 0x00, -0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, -0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, -0x03, 0x04, 0x00, 0xbf, 0x02, 0x15, 0x03, 0x02, 0x00, 0x16, 0x03, 0x17, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x18, 0x03, 0x02, -0x00, 0x19, 0x03, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x1d, 0x03, 0x02, 0x00, 0x1e, 0x03, 0x04, -0x00, 0xbf, 0x02, 0x1f, 0x03, 0x02, 0x00, 0x20, 0x03, 0x21, 0x03, 0x22, 0x03, 0x23, 0x03, 0x24, 0x03, 0x25, 0x03, 0x26, -0x03, 0x27, 0x03, 0x28, 0x03, 0x29, 0x03, 0x2a, 0x03, 0x2b, 0x03, 0x2c, 0x03, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x6d, -0x00, 0xbf, 0x02, 0x9a, 0x01, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, -0x02, 0x15, 0x03, 0x02, 0x00, 0x16, 0x03, 0x17, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x18, 0x03, 0x02, 0x00, 0x30, 0x03, 0x04, -0x00, 0xbf, 0x02, 0x31, 0x03, 0x02, 0x00, 0x20, 0x03, 0x32, 0x03, 0x2f, 0x03, 0x6d, 0x00, 0xbf, 0x02, 0x6a, 0x20, 0x00, -0x00, 0xf4, 0x00, 0x00, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0x05, 0x00, 0x02, 0x00, 0xc1, -0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0x04, 0x00, 0xbf, 0x02, 0x0d, 0x00, 0x0e, -0x00, 0x0f, 0x00, 0xc8, 0x02, 0xbf, 0x02, 0xc9, 0x02, 0x02, 0x00, 0xca, 0x02, 0x04, 0x00, 0xbf, 0x02, 0xcb, 0x02, 0x02, -0x00, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, -0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, -0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, -0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, -0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, -0x02, 0xfe, 0x02, 0xff, 0x02, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, -0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, -0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x8f, 0x00, 0x02, 0x00, 0x33, 0x03, 0x34, 0x03, 0x04, -0x00, 0xbf, 0x02, 0x35, 0x03, 0x02, 0x00, 0x36, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x37, 0x03, 0x02, 0x00, 0x38, 0x03, 0x04, -0x00, 0xbf, 0x02, 0x15, 0x03, 0x02, 0x00, 0x16, 0x03, 0x17, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x39, 0x03, 0x3a, 0x03, 0x3b, -0x03, 0x3c, 0x03, 0x3d, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x18, -0x03, 0x02, 0x00, 0x19, 0x03, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x1d, 0x03, 0x02, 0x00, 0x1e, -0x03, 0x41, 0x03, 0x42, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x43, 0x03, 0x02, 0x00, 0x20, 0x03, 0x21, 0x03, 0x44, 0x03, 0x45, -0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, -0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x50, 0x03, 0x57, 0x03, 0x58, -0x03, 0x55, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x46, 0x03, 0x5d, 0x03, 0x5b, 0x03, 0x5e, 0x03, 0x5f, -0x03, 0x46, 0x03, 0x60, 0x03, 0x61, 0x03, 0x4e, 0x03, 0x62, 0x03, 0x50, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, -0x03, 0x67, 0x03, 0x68, 0x03, 0x55, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, -0x03, 0x70, 0x03, 0x50, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x55, 0x03, 0x76, 0x03, 0x77, -0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x46, 0x03, 0x7e, -0x03, 0x5b, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, 0x03, 0x86, 0x03, 0x87, -0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x2f, 0x03, 0x6d, 0x00, 0xbf, 0x02, 0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0x8b, 0x03, 0x02, 0x00, 0x6d, 0x00, 0xbf, 0x02, 0x72, -0x16, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0xcb, 0x02, 0x02, -0x00, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, -0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, -0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, -0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, -0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, -0x02, 0xfe, 0x02, 0xff, 0x02, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, -0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, -0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x15, 0x03, 0x02, 0x00, 0x16, 0x03, 0x17, 0x03, 0x04, -0x00, 0xbf, 0x02, 0x8c, 0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, -0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x18, 0x03, 0x02, -0x00, 0x30, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x1d, 0x03, 0x02, 0x00, 0x19, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x9b, 0x03, 0x02, -0x00, 0x20, 0x03, 0x9c, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0x46, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0x4e, -0x03, 0xa3, 0x03, 0x77, 0x03, 0x59, 0x03, 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, 0x4e, 0x03, 0xa8, 0x03, 0x59, -0x03, 0xa9, 0x03, 0x4e, 0x03, 0xaa, 0x03, 0x59, 0x03, 0xab, 0x03, 0xac, 0x03, 0xad, 0x03, 0xae, 0x03, 0x4e, 0x03, 0xaf, -0x03, 0xb0, 0x03, 0x59, 0x03, 0xa9, 0x03, 0x4e, 0x03, 0xb1, 0x03, 0x59, 0x03, 0xb2, 0x03, 0xb3, 0x03, 0xb4, 0x03, 0x4e, -0x03, 0xb5, 0x03, 0x59, 0x03, 0xa9, 0x03, 0x4e, 0x03, 0xb6, 0x03, 0x59, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, -0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xc0, 0x03, 0x2f, 0x03, 0x6d, 0x00, 0xbf, 0x02, 0xbc, -0x03, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0x05, 0x00, 0x02, -0x00, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0x04, 0x00, 0xbf, 0x02, 0x0d, -0x00, 0x0e, 0x00, 0x0f, 0x00, 0xc8, 0x02, 0xbf, 0x02, 0xc9, 0x02, 0x02, 0x00, 0xca, 0x02, 0x04, 0x00, 0xbf, 0x02, 0xc1, -0x03, 0xbf, 0x02, 0x18, 0x03, 0x02, 0x00, 0xc2, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x1d, 0x03, 0x02, 0x00, 0x1a, 0x03, 0x04, -0x00, 0xbf, 0x02, 0xc3, 0x03, 0x02, 0x00, 0x20, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0x2f, 0x03, 0x6d, 0x00, 0xbf, 0x02, 0xec, -0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0x18, 0x03, 0x02, -0x00, 0x30, 0x03, 0x04, 0x00, 0xbf, 0x02, 0xc6, 0x03, 0x02, 0x00, 0x20, 0x03, 0xc7, 0x03, 0x2f, 0x03, 0x6d, 0x00, 0xbf, -0x02, 0x92, 0x12, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0x05, -0x00, 0x02, 0x00, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0x04, 0x00, 0xbf, -0x02, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0xc8, 0x02, 0xbf, 0x02, 0xc9, 0x02, 0x02, 0x00, 0xca, 0x02, 0x04, 0x00, 0xbf, -0x02, 0xc8, 0x03, 0xc9, 0x03, 0xbf, 0x02, 0xcb, 0x02, 0x02, 0x00, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, -0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, -0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, -0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, -0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, -0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x02, 0x00, 0x03, 0x01, 0x03, 0x02, -0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, -0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x04, 0x00, 0xbf, -0x02, 0x15, 0x03, 0x02, 0x00, 0x16, 0x03, 0x17, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x18, 0x03, 0x02, 0x00, 0x19, 0x03, 0x1a, -0x03, 0x1b, 0x03, 0x1c, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x1d, 0x03, 0x02, 0x00, 0x1e, -0x03, 0x04, 0x00, 0xbf, 0x02, 0x1f, 0x03, 0x02, 0x00, 0x20, 0x03, 0x21, 0x03, 0xcd, 0x03, 0xce, 0x03, 0xcf, 0x03, 0xd0, -0x03, 0xd1, 0x03, 0xd2, 0x03, 0xd3, 0x03, 0xd4, 0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xda, -0x03, 0xdb, 0x03, 0xdc, 0x03, 0xdd, 0x03, 0xde, 0x03, 0xdf, 0x03, 0xe0, 0x03, 0xe1, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xe4, -0x03, 0xe5, 0x03, 0xe6, 0x03, 0xe7, 0x03, 0xe8, 0x03, 0x2f, 0x03, 0x6d, 0x00, 0xbf, 0x02, 0xdd, 0x23, 0x00, 0x00, 0x09, -0x01, 0x00, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0x05, 0x00, 0x02, 0x00, 0xc1, 0x02, 0xc2, -0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0x04, 0x00, 0xbf, 0x02, 0x0d, 0x00, 0x0e, 0x00, 0x0f, -0x00, 0xc8, 0x02, 0xbf, 0x02, 0xc9, 0x02, 0x02, 0x00, 0xca, 0x02, 0x04, 0x00, 0xbf, 0x02, 0xc8, 0x03, 0xc9, 0x03, 0xbf, -0x02, 0xcb, 0x02, 0x02, 0x00, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, -0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, -0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, -0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, -0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, -0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x02, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, -0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, -0x03, 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x8f, 0x00, 0x02, 0x00, 0x33, -0x03, 0x34, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x35, 0x03, 0x02, 0x00, 0x36, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x37, 0x03, 0x02, -0x00, 0x38, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x15, 0x03, 0x02, 0x00, 0x16, 0x03, 0x17, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x39, -0x03, 0x3a, 0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x04, -0x00, 0xbf, 0x02, 0x18, 0x03, 0x02, 0x00, 0x19, 0x03, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, -0x03, 0x04, 0x00, 0xbf, 0x02, 0x1d, 0x03, 0x02, 0x00, 0x1e, 0x03, 0x41, 0x03, 0x42, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x43, -0x03, 0x02, 0x00, 0x20, 0x03, 0x21, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xeb, 0x03, 0x46, 0x03, 0xec, 0x03, 0xed, 0x03, 0xee, -0x03, 0xef, 0x03, 0xf0, 0x03, 0xf1, 0x03, 0xf2, 0x03, 0x4e, 0x03, 0xf3, 0x03, 0x50, 0x03, 0xf4, 0x03, 0xf5, 0x03, 0xf6, -0x03, 0xf7, 0x03, 0x55, 0x03, 0x56, 0x03, 0x50, 0x03, 0xf8, 0x03, 0xf9, 0x03, 0x55, 0x03, 0x59, 0x03, 0xfa, 0x03, 0x5b, -0x03, 0x5c, 0x03, 0x46, 0x03, 0xfb, 0x03, 0x5b, 0x03, 0xfc, 0x03, 0xfd, 0x03, 0x46, 0x03, 0xfe, 0x03, 0x61, 0x03, 0x4e, -0x03, 0x62, 0x03, 0x50, 0x03, 0xff, 0x03, 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, 0x68, 0x03, 0x55, 0x03, 0x04, -0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, 0x08, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x0b, 0x04, 0x50, 0x03, 0x0c, 0x04, 0x0d, -0x04, 0x0e, 0x04, 0x0f, 0x04, 0x75, 0x03, 0x55, 0x03, 0x10, 0x04, 0x77, 0x03, 0x78, 0x03, 0x11, 0x04, 0x12, 0x04, 0x13, -0x04, 0x14, 0x04, 0x15, 0x04, 0x5b, 0x03, 0x5c, 0x03, 0x46, 0x03, 0x16, 0x04, 0x5b, 0x03, 0x17, 0x04, 0x18, 0x04, 0x19, -0x04, 0x1a, 0x04, 0x1b, 0x04, 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, 0x04, 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, -0x04, 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, 0x04, 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, 0x04, 0x2c, 0x04, 0x2d, -0x04, 0x2e, 0x04, 0xe7, 0x03, 0xe8, 0x03, 0x2f, 0x03, 0x6d, 0x00, 0xbf, 0x02, 0x92, 0x0e, 0x00, 0x00, 0x8e, 0x00, 0x00, -0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0x05, 0x00, 0x02, 0x00, 0xc1, 0x02, 0xc2, 0x02, 0xc3, -0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0x04, 0x00, 0xbf, 0x02, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0xc8, -0x02, 0xbf, 0x02, 0xc9, 0x02, 0x02, 0x00, 0xca, 0x02, 0x04, 0x00, 0xbf, 0x02, 0xcb, 0x02, 0x02, 0x00, 0xcc, 0x02, 0xcd, -0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, -0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, -0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, -0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, -0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, -0x02, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, -0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, -0x03, 0x14, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x15, 0x03, 0x02, 0x00, 0x16, 0x03, 0x17, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x18, -0x03, 0x02, 0x00, 0x19, 0x03, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x1d, 0x03, 0x02, 0x00, 0x1e, -0x03, 0x04, 0x00, 0xbf, 0x02, 0x1f, 0x03, 0x02, 0x00, 0x20, 0x03, 0x21, 0x03, 0x2f, 0x04, 0x30, 0x04, 0x31, 0x04, 0x32, -0x04, 0x33, 0x04, 0x34, 0x04, 0x35, 0x04, 0x36, 0x04, 0x37, 0x04, 0x38, 0x04, 0x39, 0x04, 0x2d, 0x03, 0x2e, 0x03, 0x2f, -0x03, 0x6d, 0x00, 0xbf, 0x02, 0xb3, 0x01, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, -0x02, 0xbf, 0x02, 0x15, 0x03, 0x02, 0x00, 0x16, 0x03, 0x17, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x18, 0x03, 0x02, 0x00, 0x30, -0x03, 0x04, 0x00, 0xbf, 0x02, 0x31, 0x03, 0x02, 0x00, 0x20, 0x03, 0x3a, 0x04, 0x2f, 0x03, 0x6d, 0x00, 0xbf, 0x02, 0x6a, -0x20, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0x05, 0x00, 0x02, -0x00, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0x04, 0x00, 0xbf, 0x02, 0x0d, -0x00, 0x0e, 0x00, 0x0f, 0x00, 0xc8, 0x02, 0xbf, 0x02, 0xc9, 0x02, 0x02, 0x00, 0xca, 0x02, 0x04, 0x00, 0xbf, 0x02, 0xcb, -0x02, 0x02, 0x00, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, -0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, -0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, -0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, -0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, -0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x02, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, -0x03, 0x07, 0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, -0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x8f, 0x00, 0x02, 0x00, 0x33, 0x03, 0x34, -0x03, 0x04, 0x00, 0xbf, 0x02, 0x35, 0x03, 0x02, 0x00, 0x36, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x37, 0x03, 0x02, 0x00, 0x38, -0x03, 0x04, 0x00, 0xbf, 0x02, 0x15, 0x03, 0x02, 0x00, 0x16, 0x03, 0x17, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x39, 0x03, 0x3a, -0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x04, 0x00, 0xbf, -0x02, 0x18, 0x03, 0x02, 0x00, 0x19, 0x03, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x1d, 0x03, 0x02, -0x00, 0x1e, 0x03, 0x41, 0x03, 0x42, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x43, 0x03, 0x02, 0x00, 0x20, 0x03, 0x21, 0x03, 0x3b, -0x04, 0x45, 0x03, 0x46, 0x03, 0x3c, 0x04, 0x3d, 0x04, 0x3e, 0x04, 0x5d, 0x03, 0x3f, 0x04, 0x40, 0x04, 0x41, 0x04, 0x4e, -0x03, 0x42, 0x04, 0x50, 0x03, 0x43, 0x04, 0x44, 0x04, 0x45, 0x04, 0x46, 0x04, 0x55, 0x03, 0x56, 0x03, 0x50, 0x03, 0x47, -0x04, 0x48, 0x04, 0x55, 0x03, 0x59, 0x03, 0x49, 0x04, 0x5b, 0x03, 0x5c, 0x03, 0x46, 0x03, 0x4a, 0x04, 0x5b, 0x03, 0x4b, -0x04, 0x5f, 0x03, 0x46, 0x03, 0x4c, 0x04, 0x61, 0x03, 0x4e, 0x03, 0x62, 0x03, 0x50, 0x03, 0x4d, 0x04, 0x4e, 0x04, 0x4f, -0x04, 0x50, 0x04, 0x51, 0x04, 0x68, 0x03, 0x55, 0x03, 0x52, 0x04, 0x53, 0x04, 0x54, 0x04, 0x55, 0x04, 0x56, 0x04, 0x57, -0x04, 0x58, 0x04, 0x59, 0x04, 0x50, 0x03, 0x5a, 0x04, 0x5b, 0x04, 0x5c, 0x04, 0x5d, 0x04, 0x75, 0x03, 0x55, 0x03, 0x5e, -0x04, 0x77, 0x03, 0x78, 0x03, 0x5f, 0x04, 0x60, 0x04, 0x61, 0x04, 0x62, 0x04, 0x63, 0x04, 0x5b, 0x03, 0x5c, 0x03, 0x46, -0x03, 0x64, 0x04, 0x5b, 0x03, 0x65, 0x04, 0x66, 0x04, 0x67, 0x04, 0x68, 0x04, 0x69, 0x04, 0x6a, 0x04, 0x6b, 0x04, 0x6c, -0x04, 0x6d, 0x04, 0x6e, 0x04, 0x89, 0x03, 0x8a, 0x03, 0x2f, 0x03, 0x6d, 0x00, 0xbf, 0x02, 0x33, 0x16, 0x00, 0x00, 0xae, -0x00, 0x00, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0xcb, 0x02, 0x02, 0x00, 0xcc, 0x02, 0xcd, -0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, -0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, -0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, -0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, -0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, -0x02, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, -0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, -0x03, 0x14, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x15, 0x03, 0x02, 0x00, 0x16, 0x03, 0x17, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x8c, -0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, -0x03, 0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x18, 0x03, 0x02, 0x00, 0x30, 0x03, 0x04, -0x00, 0xbf, 0x02, 0x1d, 0x03, 0x02, 0x00, 0x19, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x9b, 0x03, 0x02, 0x00, 0x20, 0x03, 0x3a, -0x04, 0x9e, 0x03, 0x6f, 0x04, 0x70, 0x04, 0xa0, 0x03, 0x46, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0x4e, 0x03, 0x71, 0x04, 0x77, -0x03, 0x59, 0x03, 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, 0x4e, 0x03, 0xa8, 0x03, 0x59, 0x03, 0xa9, 0x03, 0x4e, -0x03, 0xaa, 0x03, 0x59, 0x03, 0x72, 0x04, 0x73, 0x04, 0xae, 0x03, 0x4e, 0x03, 0x74, 0x04, 0x75, 0x04, 0x59, 0x03, 0xa9, -0x03, 0x4e, 0x03, 0x76, 0x04, 0x59, 0x03, 0x77, 0x04, 0x78, 0x04, 0xb4, 0x03, 0x4e, 0x03, 0x79, 0x04, 0x59, 0x03, 0xa9, -0x03, 0x4e, 0x03, 0xb6, 0x03, 0x59, 0x03, 0x7a, 0x04, 0x7b, 0x04, 0xba, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbe, -0x03, 0xbf, 0x03, 0x7c, 0x04, 0x2f, 0x03, 0x6d, 0x00, 0xbf, 0x02, 0xb8, 0x12, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xbd, -0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0x05, 0x00, 0x02, 0x00, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, -0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0x04, 0x00, 0xbf, 0x02, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0xc8, 0x02, 0xbf, -0x02, 0xc9, 0x02, 0x02, 0x00, 0xca, 0x02, 0x04, 0x00, 0xbf, 0x02, 0xc8, 0x03, 0xc9, 0x03, 0xbf, 0x02, 0xcb, 0x02, 0x02, -0x00, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, -0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, -0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, -0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, -0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, -0x02, 0xfe, 0x02, 0xff, 0x02, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, -0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, -0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x15, 0x03, 0x02, 0x00, 0x16, 0x03, 0x17, 0x03, 0x04, -0x00, 0xbf, 0x02, 0x18, 0x03, 0x02, 0x00, 0x19, 0x03, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, -0x03, 0x04, 0x00, 0xbf, 0x02, 0x1d, 0x03, 0x02, 0x00, 0x1e, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x1f, 0x03, 0x02, 0x00, 0x20, -0x03, 0x21, 0x03, 0x7d, 0x04, 0x7e, 0x04, 0x7f, 0x04, 0x80, 0x04, 0x81, 0x04, 0x82, 0x04, 0x83, 0x04, 0x84, 0x04, 0x85, -0x04, 0x86, 0x04, 0x87, 0x04, 0x88, 0x04, 0x89, 0x04, 0x8a, 0x04, 0x8b, 0x04, 0x8c, 0x04, 0x8d, 0x04, 0x8e, 0x04, 0x8f, -0x04, 0x90, 0x04, 0x91, 0x04, 0x92, 0x04, 0x93, 0x04, 0x94, 0x04, 0x95, 0x04, 0x96, 0x04, 0xe7, 0x03, 0xe8, 0x03, 0x2f, -0x03, 0x6d, 0x00, 0xbf, 0x02, 0x75, 0x24, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, -0x02, 0xbf, 0x02, 0x05, 0x00, 0x02, 0x00, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, -0x02, 0x04, 0x00, 0xbf, 0x02, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0xc8, 0x02, 0xbf, 0x02, 0xc9, 0x02, 0x02, 0x00, 0xca, -0x02, 0x04, 0x00, 0xbf, 0x02, 0xc8, 0x03, 0xc9, 0x03, 0xbf, 0x02, 0xcb, 0x02, 0x02, 0x00, 0xcc, 0x02, 0xcd, 0x02, 0xce, -0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, -0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, -0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, -0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, -0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x02, 0x00, -0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, -0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, -0x03, 0x04, 0x00, 0xbf, 0x02, 0x8f, 0x00, 0x02, 0x00, 0x33, 0x03, 0x34, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x35, 0x03, 0x02, -0x00, 0x36, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x37, 0x03, 0x02, 0x00, 0x38, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x15, 0x03, 0x02, -0x00, 0x16, 0x03, 0x17, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x39, 0x03, 0x3a, 0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x04, -0x00, 0xbf, 0x02, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x18, 0x03, 0x02, 0x00, 0x19, 0x03, 0x1a, -0x03, 0x1b, 0x03, 0x1c, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x1d, 0x03, 0x02, 0x00, 0x1e, -0x03, 0x41, 0x03, 0x42, 0x03, 0x04, 0x00, 0xbf, 0x02, 0x43, 0x03, 0x02, 0x00, 0x20, 0x03, 0x21, 0x03, 0x97, 0x04, 0x98, -0x04, 0x99, 0x04, 0x46, 0x03, 0x9a, 0x04, 0x9b, 0x04, 0x9c, 0x04, 0x9d, 0x04, 0x9e, 0x04, 0x9f, 0x04, 0xa0, 0x04, 0x4e, -0x03, 0xa1, 0x04, 0x50, 0x03, 0xa2, 0x04, 0xa3, 0x04, 0xa4, 0x04, 0xa5, 0x04, 0x55, 0x03, 0x56, 0x03, 0x50, 0x03, 0xa6, -0x04, 0xa7, 0x04, 0x55, 0x03, 0x59, 0x03, 0xa8, 0x04, 0x5b, 0x03, 0x5c, 0x03, 0x46, 0x03, 0xa9, 0x04, 0x5b, 0x03, 0xaa, -0x04, 0xab, 0x04, 0x46, 0x03, 0xac, 0x04, 0x61, 0x03, 0x4e, 0x03, 0x62, 0x03, 0x50, 0x03, 0xad, 0x04, 0xae, 0x04, 0xaf, -0x04, 0xb0, 0x04, 0xb1, 0x04, 0x68, 0x03, 0x55, 0x03, 0xb2, 0x04, 0xb3, 0x04, 0xb4, 0x04, 0xb5, 0x04, 0xb6, 0x04, 0xb7, -0x04, 0xb8, 0x04, 0xb9, 0x04, 0x50, 0x03, 0xba, 0x04, 0xbb, 0x04, 0xbc, 0x04, 0xbd, 0x04, 0x75, 0x03, 0x55, 0x03, 0xbe, -0x04, 0x77, 0x03, 0x78, 0x03, 0xbf, 0x04, 0xc0, 0x04, 0xc1, 0x04, 0xc2, 0x04, 0xc3, 0x04, 0x5b, 0x03, 0x5c, 0x03, 0x46, -0x03, 0xc4, 0x04, 0x5b, 0x03, 0xc5, 0x04, 0xc6, 0x04, 0xc7, 0x04, 0xc8, 0x04, 0xc9, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, -0x04, 0xcd, 0x04, 0xce, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd1, 0x04, 0xd2, 0x04, 0xd3, 0x04, 0xd4, 0x04, 0xd5, 0x04, 0xd6, -0x04, 0xd7, 0x04, 0xd8, 0x04, 0xd9, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xe7, 0x03, 0xe8, 0x03, 0x2f, 0x03, 0x6d, -0x00, 0xbf, 0x02, +0x54, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x36, 0x35, 0x20, 0x3d, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, 0x45, 0x52, 0x45, 0x4f, 0x5f, +0x45, 0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x34, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x36, 0x35, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x28, 0x5f, 0x34, 0x36, 0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x20, 0x5f, 0x34, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x36, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x34, 0x35, +0x36, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x34, 0x37, 0x30, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, +0x20, 0x5f, 0x34, 0x36, 0x35, 0x2c, 0x20, 0x5f, 0x34, 0x37, 0x36, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, +0x2b, 0x20, 0x5f, 0x34, 0x37, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x36, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x39, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x39, 0x31, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x39, 0x20, 0x3d, 0x20, +0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x5f, 0x34, 0x36, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, +0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x30, +0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x32, 0x39, 0x2c, 0x20, 0x5f, +0x34, 0x37, 0x36, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x2c, 0x20, 0x5f, 0x34, 0x39, +0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44, +0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, +0x61, 0x28, 0x5f, 0x31, 0x31, 0x32, 0x39, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x34, 0x36, 0x32, 0x20, +0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x34, 0x38, 0x37, 0x2c, 0x20, 0x5f, 0x34, +0x39, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x39, 0x3b, 0x00, 0x4c, 0x53, 0x4c, 0x47, 0x5f, 0x54, +0x41, 0x4d, 0x54, 0x1d, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xbe, 0x00, 0x00, +0x00, 0x01, 0x00, 0x01, 0xce, 0x01, 0x00, 0x00, 0x01, 0x08, 0x00, 0xba, 0x02, 0x00, 0x00, 0x01, 0x10, 0x00, 0x80, 0x04, +0x00, 0x00, 0x01, 0x10, 0x01, 0x82, 0x05, 0x00, 0x00, 0x01, 0x18, 0x00, 0x96, 0x05, 0x00, 0x00, 0x01, 0x20, 0x01, 0x4e, +0x07, 0x00, 0x00, 0x01, 0x30, 0x01, 0xb0, 0x08, 0x00, 0x00, 0x01, 0x44, 0x01, 0xf2, 0x08, 0x00, 0x00, 0x01, 0x80, 0x00, +0x0a, 0x09, 0x00, 0x00, 0x01, 0x88, 0x00, 0x38, 0x0a, 0x00, 0x00, 0x01, 0x90, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0x01, 0x98, +0x00, 0x3c, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x00, 0x12, 0x0f, 0x00, 0x00, 0x02, 0x00, 0x01, 0x24, 0x10, 0x00, 0x00, 0x02, +0x08, 0x00, 0x0e, 0x11, 0x00, 0x00, 0x02, 0x10, 0x00, 0xd6, 0x12, 0x00, 0x00, 0x02, 0x10, 0x01, 0xda, 0x13, 0x00, 0x00, +0x02, 0x18, 0x00, 0xec, 0x13, 0x00, 0x00, 0x02, 0x20, 0x01, 0xa6, 0x15, 0x00, 0x00, 0x02, 0x30, 0x01, 0xf6, 0x16, 0x00, +0x00, 0x02, 0x44, 0x01, 0x36, 0x17, 0x00, 0x00, 0x02, 0x80, 0x00, 0x4c, 0x17, 0x00, 0x00, 0x02, 0x88, 0x00, 0x7a, 0x18, +0x00, 0x00, 0x02, 0x90, 0x00, 0x5e, 0x1a, 0x00, 0x00, 0x02, 0x98, 0x00, 0x7e, 0x1b, 0x00, 0x00, 0xd5, 0x0a, 0x00, 0x00, +0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, +0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x14, 0x00, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, +0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, +0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, +0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, +0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, +0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, +0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, +0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, +0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, +0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, +0x6e, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, +0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x6c, 0x00, 0xe9, 0x06, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x00, +0x7b, 0x00, 0x7c, 0x00, 0x02, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x05, 0x00, +0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x18, 0x00, 0x02, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, +0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, +0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, +0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, +0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, +0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, +0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, +0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0x62, 0x00, 0xcf, 0x00, +0x02, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0x69, 0x00, 0x02, 0x00, 0xd6, 0x00, +0xd7, 0x00, 0x02, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0xdb, 0x00, 0x6c, 0x00, +0xdc, 0x00, 0x6c, 0x00, 0xa1, 0x15, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, +0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, +0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0xdd, 0x00, 0x02, 0x00, 0xde, 0x00, 0xdf, 0x00, +0x05, 0x00, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x14, 0x00, 0xe0, 0x00, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, +0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, +0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, +0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, +0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, +0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, +0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, +0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, +0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0xe1, 0x00, 0x02, 0x00, 0xe2, 0x00, 0xe3, 0x00, +0xe4, 0x00, 0x02, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0x63, 0x00, 0xe9, 0x00, 0xea, 0x00, 0x64, 0x00, +0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0xeb, 0x00, 0x02, 0x00, 0xec, 0x00, 0x02, 0x00, 0xed, 0x00, 0xee, 0x00, +0xef, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0x6c, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0xf7, 0x00, +0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0x02, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x6c, 0x00, +0x00, 0x01, 0x6c, 0x00, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, +0x6e, 0x00, 0x6c, 0x00, 0x01, 0x01, 0x02, 0x01, 0x02, 0x00, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, +0x08, 0x01, 0x09, 0x01, 0x02, 0x00, 0x0a, 0x01, 0x02, 0x00, 0x0b, 0x01, 0x0c, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x6c, 0x00, +0x6d, 0x00, 0x02, 0x00, 0x0f, 0x01, 0x10, 0x01, 0x6c, 0x00, 0x6c, 0x00, 0x11, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, +0x12, 0x01, 0x6c, 0x00, 0x13, 0x01, 0x14, 0x01, 0x02, 0x00, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, +0x1a, 0x01, 0x1b, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x1c, 0x01, 0x6c, 0x00, 0x1d, 0x01, 0x1e, 0x01, 0x1f, 0x01, +0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x26, 0x01, 0x27, 0x01, 0x6c, 0x00, 0x10, 0x0a, +0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, +0x02, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, +0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x14, 0x00, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, +0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, +0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, +0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, +0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, +0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, +0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, +0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, +0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, +0x68, 0x00, 0x67, 0x00, 0x66, 0x00, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, +0x02, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x28, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x6c, 0x00, 0x51, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x69, 0x00, 0x02, 0x00, 0x6c, 0x00, 0xdc, 0x14, 0x00, 0x00, +0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, +0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x10, 0x00, 0x11, 0x00, 0xdd, 0x00, 0x02, 0x00, 0xde, 0x00, 0xdf, 0x00, 0x05, 0x00, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, +0x14, 0x00, 0x2c, 0x01, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, +0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, +0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, +0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, +0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, +0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, +0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, +0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, +0x61, 0x00, 0x62, 0x00, 0xe1, 0x00, 0x02, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0x02, 0x00, 0xe5, 0x00, 0xe6, 0x00, +0xe7, 0x00, 0xe8, 0x00, 0x63, 0x00, 0xe9, 0x00, 0xea, 0x00, 0x64, 0x00, 0x65, 0x00, 0x68, 0x00, 0x67, 0x00, 0x66, 0x00, +0xeb, 0x00, 0x02, 0x00, 0xec, 0x00, 0x02, 0x00, 0x2d, 0x01, 0x2e, 0x01, 0x2f, 0x01, 0x30, 0x01, 0x31, 0x01, 0xf2, 0x00, +0x6c, 0x00, 0x32, 0x01, 0x33, 0x01, 0x34, 0x01, 0xf6, 0x00, 0xf7, 0x00, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x02, 0x00, +0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0xff, 0x00, 0x6c, 0x00, 0x3c, 0x01, 0x6c, 0x00, 0x69, 0x00, 0x02, 0x00, +0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x3d, 0x01, 0x02, 0x01, +0x02, 0x00, 0x3e, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x01, 0x44, 0x01, 0x02, 0x00, 0x45, 0x01, +0x02, 0x00, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x4a, 0x01, 0x4b, 0x01, +0x6c, 0x00, 0x6c, 0x00, 0x4c, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x4d, 0x01, 0x6c, 0x00, 0x4e, 0x01, 0x14, 0x01, +0x02, 0x00, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x6c, 0x00, 0x6d, 0x00, +0x02, 0x00, 0x56, 0x01, 0x6c, 0x00, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x6c, 0x00, 0xaa, 0x0d, 0x00, 0x00, +0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x02, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, +0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x05, 0x00, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x18, 0x00, 0x02, 0x00, 0x86, 0x00, +0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, +0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, +0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, +0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, +0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, +0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, +0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, +0xcd, 0x00, 0xce, 0x00, 0x62, 0x00, 0xcf, 0x00, 0x02, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0x5e, 0x01, 0xd3, 0x00, +0xd4, 0x00, 0x5f, 0x01, 0xd5, 0x00, 0x60, 0x01, 0x02, 0x00, 0x61, 0x01, 0x62, 0x01, 0x02, 0x00, 0x63, 0x01, 0x6c, 0x00, +0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x02, 0x00, 0x67, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x68, 0x01, 0x6c, 0x00, +0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, +0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x72, 0x01, 0x6c, 0x00, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, +0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x7b, 0x01, 0x6c, 0x00, 0x7c, 0x01, +0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x63, 0x01, 0x6c, 0x00, 0x69, 0x00, 0x02, 0x00, 0x81, 0x01, 0xd7, 0x00, +0x02, 0x00, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x85, 0x01, 0x6c, 0x00, 0x86, 0x01, +0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x6c, 0x00, 0xec, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, +0x7a, 0x00, 0x7b, 0x00, 0x06, 0x00, 0x02, 0x00, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, +0x91, 0x01, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x92, 0x01, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, +0x17, 0x00, 0x93, 0x01, 0x94, 0x01, 0x69, 0x00, 0x02, 0x00, 0x95, 0x01, 0x96, 0x01, 0x6c, 0x00, 0x91, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0xd5, 0x00, 0x69, 0x00, 0x02, 0x00, 0x97, 0x01, 0x6c, 0x00, +0x55, 0x0d, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, +0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, +0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x99, 0x01, 0x9a, 0x01, 0x10, 0x00, 0x9b, 0x01, 0x12, 0x00, +0x13, 0x00, 0x10, 0x00, 0x14, 0x00, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, +0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, +0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, +0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, +0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, +0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, +0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, +0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, +0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x65, 0x00, 0x63, 0x00, 0x64, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, +0x02, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x9c, 0x01, +0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, +0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, +0x6c, 0x00, 0x09, 0x18, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, +0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, +0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x99, 0x01, 0x9a, 0x01, 0x10, 0x00, 0x9b, 0x01, +0xdd, 0x00, 0x02, 0x00, 0xde, 0x00, 0xdf, 0x00, 0x05, 0x00, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x14, 0x00, 0xb1, 0x01, +0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, +0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, +0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, +0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, +0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, +0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, +0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, +0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, +0xe1, 0x00, 0x02, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0x02, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, +0x65, 0x00, 0x63, 0x00, 0xe9, 0x00, 0xea, 0x00, 0x64, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0xeb, 0x00, 0x02, 0x00, +0xec, 0x00, 0x02, 0x00, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xf2, 0x00, 0x6c, 0x00, 0xb7, 0x01, +0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0x02, 0x00, 0xbf, 0x01, 0xc0, 0x01, +0xc1, 0x01, 0xc2, 0x01, 0xff, 0x00, 0x6c, 0x00, 0xc3, 0x01, 0x6c, 0x00, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x02, 0x00, +0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0x02, 0x00, +0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0x02, 0x00, 0xce, 0x01, 0x02, 0x00, +0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0xd3, 0x01, 0xd4, 0x01, 0x6c, 0x00, +0x6c, 0x00, 0xd5, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0xd6, 0x01, 0x6c, 0x00, 0xd7, 0x01, 0xd8, 0x01, 0x02, 0x00, +0xd9, 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, +0xe0, 0x01, 0x6c, 0x00, 0xe1, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, +0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, +0xf3, 0x01, 0xf4, 0x01, 0x6c, 0x00, 0x90, 0x0c, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x01, 0x01, 0x00, +0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, +0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x99, 0x01, 0x9a, 0x01, +0x10, 0x00, 0x9b, 0x01, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x14, 0x00, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, +0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, +0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, +0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, +0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, +0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, +0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, +0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, +0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x65, 0x00, 0x63, 0x00, 0x64, 0x00, 0x68, 0x00, +0x67, 0x00, 0x66, 0x00, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, +0x6e, 0x00, 0x6c, 0x00, 0x9c, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, +0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x01, 0x00, 0x02, 0xb0, 0x01, 0x6c, 0x00, 0x44, 0x17, 0x00, 0x00, 0xe7, 0x00, +0x00, 0x00, 0x00, 0x00, 0x98, 0x01, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, +0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x10, 0x00, 0x11, 0x00, 0x99, 0x01, 0x9a, 0x01, 0x10, 0x00, 0x9b, 0x01, 0xdd, 0x00, 0x02, 0x00, 0xde, 0x00, 0xdf, 0x00, +0x05, 0x00, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x14, 0x00, 0xb1, 0x01, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, +0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, +0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, +0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, +0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, +0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, +0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, +0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, +0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0xe1, 0x00, 0x02, 0x00, 0xe2, 0x00, 0xe3, 0x00, +0xe4, 0x00, 0x02, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0x65, 0x00, 0x63, 0x00, 0xe9, 0x00, 0xea, 0x00, +0x64, 0x00, 0x68, 0x00, 0x67, 0x00, 0x66, 0x00, 0xeb, 0x00, 0x02, 0x00, 0xec, 0x00, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, +0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0xf2, 0x00, 0x6c, 0x00, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, +0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x02, 0x00, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0xff, 0x00, 0x6c, 0x00, +0x12, 0x02, 0x6c, 0x00, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, +0x6e, 0x00, 0x6c, 0x00, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, +0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0x02, 0x00, 0xce, 0x01, 0x02, 0x00, 0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, +0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0xd3, 0x01, 0xd4, 0x01, 0x6c, 0x00, 0x6c, 0x00, 0xd5, 0x01, 0x6c, 0x00, 0x6d, 0x00, +0x02, 0x00, 0xd6, 0x01, 0x6c, 0x00, 0xd7, 0x01, 0xd8, 0x01, 0x02, 0x00, 0xd9, 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, +0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0xe0, 0x01, 0x6c, 0x00, 0x13, 0x02, 0x14, 0x02, +0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, +0xf4, 0x01, 0x6c, 0x00, 0x2b, 0x0a, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x1f, 0x02, 0x20, 0x02, 0x01, 0x00, 0x02, 0x00, +0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, +0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, +0x14, 0x00, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, +0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, +0x26, 0x00, 0x27, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x9c, 0x00, +0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, +0x3a, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0x3e, 0x00, 0xac, 0x00, 0xad, 0x00, 0x41, 0x00, 0xaf, 0x00, 0xb0, 0x00, +0x44, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x49, 0x00, 0x4a, 0x00, 0xb8, 0x00, 0x4c, 0x00, 0x4d, 0x00, +0x4e, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0x51, 0x00, 0xbf, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, +0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, +0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, +0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, +0x28, 0x02, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x29, 0x02, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x6c, 0x00, 0x1a, 0x06, +0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x1f, 0x02, 0x20, 0x02, 0x7c, 0x00, 0x02, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, +0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x05, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, +0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, +0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, +0x2e, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, +0xa5, 0x00, 0xa6, 0x00, 0x3a, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0x3e, 0x00, 0xac, 0x00, 0xad, 0x00, 0x41, 0x00, +0xaf, 0x00, 0xb0, 0x00, 0x44, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x49, 0x00, 0x4a, 0x00, 0xb8, 0x00, +0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0x51, 0x00, 0xbf, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, +0x56, 0x00, 0x57, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, +0xcd, 0x00, 0xce, 0x00, 0x62, 0x00, 0xcf, 0x00, 0x02, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0x2a, 0x02, 0x2b, 0x02, +0xd5, 0x00, 0x69, 0x00, 0x02, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0x02, 0x00, 0x2c, 0x02, 0xd9, 0x00, 0xda, 0x00, 0x6c, 0x00, +0x6d, 0x00, 0x02, 0x00, 0xdb, 0x00, 0x6c, 0x00, 0xdc, 0x00, 0x6c, 0x00, 0xe3, 0x14, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, +0x1f, 0x02, 0x20, 0x02, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, +0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, +0x11, 0x00, 0xdd, 0x00, 0x02, 0x00, 0xde, 0x00, 0xdf, 0x00, 0x05, 0x00, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x14, 0x00, +0x2d, 0x02, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, +0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, +0x26, 0x00, 0x27, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x9c, 0x00, +0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, +0x3a, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0x3e, 0x00, 0xac, 0x00, 0xad, 0x00, 0x41, 0x00, 0xaf, 0x00, 0xb0, 0x00, +0x44, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x49, 0x00, 0x4a, 0x00, 0xb8, 0x00, 0x4c, 0x00, 0x4d, 0x00, +0x4e, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0x51, 0x00, 0xbf, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, +0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, +0x62, 0x00, 0xe1, 0x00, 0x02, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0x02, 0x00, 0x2e, 0x02, 0xe6, 0x00, 0x2f, 0x02, +0x30, 0x02, 0x63, 0x00, 0xe9, 0x00, 0xea, 0x00, 0x64, 0x00, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0xeb, 0x00, +0x02, 0x00, 0xec, 0x00, 0x02, 0x00, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0xf2, 0x00, 0x6c, 0x00, +0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0xf6, 0x00, 0xf7, 0x00, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x02, 0x00, 0x3c, 0x02, +0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0xff, 0x00, 0x6c, 0x00, 0x40, 0x02, 0x6c, 0x00, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, +0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x13, 0x01, 0x02, 0x01, 0x02, 0x00, +0x01, 0x01, 0x41, 0x02, 0x42, 0x02, 0x12, 0x01, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x02, 0x00, 0x46, 0x02, 0x02, 0x00, +0x47, 0x02, 0x48, 0x02, 0x49, 0x02, 0x4a, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x4b, 0x02, 0x4c, 0x02, 0x6c, 0x00, +0x6c, 0x00, 0x1c, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x4d, 0x02, 0x6c, 0x00, 0x4e, 0x02, 0x14, 0x01, 0x02, 0x00, +0x4f, 0x02, 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, 0x55, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, +0x56, 0x02, 0x6c, 0x00, 0x57, 0x02, 0x58, 0x02, 0x59, 0x02, 0x5a, 0x02, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x5b, 0x02, +0x25, 0x01, 0x26, 0x01, 0x27, 0x01, 0x6c, 0x00, 0x66, 0x09, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x1f, 0x02, 0x20, 0x02, +0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, +0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, +0x13, 0x00, 0x10, 0x00, 0x14, 0x00, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, +0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, +0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, +0x2e, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, +0xa5, 0x00, 0xa6, 0x00, 0x3a, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0x3e, 0x00, 0xac, 0x00, 0xad, 0x00, 0x41, 0x00, +0xaf, 0x00, 0xb0, 0x00, 0x44, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x49, 0x00, 0x4a, 0x00, 0xb8, 0x00, +0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0x51, 0x00, 0xbf, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, +0x56, 0x00, 0x57, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, +0xcd, 0x00, 0xce, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x21, 0x02, 0x24, 0x02, 0x23, 0x02, 0x22, 0x02, 0x69, 0x00, +0x02, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x28, 0x01, +0x29, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x6c, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x1f, 0x02, 0x20, 0x02, +0x69, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x1e, 0x14, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0x1f, 0x02, 0x20, 0x02, 0x01, 0x00, +0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, +0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0xdd, 0x00, 0x02, 0x00, +0xde, 0x00, 0xdf, 0x00, 0x05, 0x00, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x14, 0x00, 0x5c, 0x02, 0x15, 0x00, 0x02, 0x00, +0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, +0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x95, 0x00, +0x96, 0x00, 0x97, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, +0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0x3a, 0x00, 0xa8, 0x00, 0xa9, 0x00, +0xaa, 0x00, 0x3e, 0x00, 0xac, 0x00, 0xad, 0x00, 0x41, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0x44, 0x00, 0xb2, 0x00, 0xb3, 0x00, +0xb4, 0x00, 0xb5, 0x00, 0x49, 0x00, 0x4a, 0x00, 0xb8, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0xbc, 0x00, 0xbd, 0x00, +0x51, 0x00, 0xbf, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, +0xc8, 0x00, 0x5c, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0x62, 0x00, 0xe1, 0x00, 0x02, 0x00, +0xe2, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0x02, 0x00, 0x2e, 0x02, 0xe6, 0x00, 0x2f, 0x02, 0x30, 0x02, 0x63, 0x00, 0xe9, 0x00, +0xea, 0x00, 0x64, 0x00, 0x21, 0x02, 0x24, 0x02, 0x23, 0x02, 0x22, 0x02, 0xeb, 0x00, 0x02, 0x00, 0xec, 0x00, 0x02, 0x00, +0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, 0x02, 0xf2, 0x00, 0x6c, 0x00, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, +0xf6, 0x00, 0xf7, 0x00, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, 0x02, 0x00, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0x6b, 0x02, +0xff, 0x00, 0x6c, 0x00, 0x6c, 0x02, 0x6c, 0x00, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, +0x6d, 0x00, 0x02, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x4e, 0x01, 0x02, 0x01, 0x02, 0x00, 0x3d, 0x01, 0x6d, 0x02, 0x6e, 0x02, +0x4d, 0x01, 0x6f, 0x02, 0x70, 0x02, 0x71, 0x02, 0x02, 0x00, 0x72, 0x02, 0x02, 0x00, 0x73, 0x02, 0x74, 0x02, 0x75, 0x02, +0x76, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x77, 0x02, 0x78, 0x02, 0x6c, 0x00, 0x6c, 0x00, 0x56, 0x01, 0x6c, 0x00, +0x6d, 0x00, 0x02, 0x00, 0x79, 0x02, 0x6c, 0x00, 0x7a, 0x02, 0x14, 0x01, 0x02, 0x00, 0x7b, 0x02, 0x7c, 0x02, 0x7d, 0x02, +0x7e, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x82, 0x02, 0x6c, 0x00, 0x83, 0x02, +0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x6c, 0x00, 0xd6, 0x0b, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x1f, 0x02, 0x20, 0x02, +0x7c, 0x00, 0x02, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x05, 0x00, 0x5b, 0x01, +0x5c, 0x01, 0x5d, 0x01, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, +0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x95, 0x00, +0x96, 0x00, 0x97, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, +0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0x3a, 0x00, 0xa8, 0x00, 0xa9, 0x00, +0xaa, 0x00, 0x3e, 0x00, 0xac, 0x00, 0xad, 0x00, 0x41, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0x44, 0x00, 0xb2, 0x00, 0xb3, 0x00, +0xb4, 0x00, 0xb5, 0x00, 0x49, 0x00, 0x4a, 0x00, 0xb8, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0xbc, 0x00, 0xbd, 0x00, +0x51, 0x00, 0xbf, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, +0xc8, 0x00, 0x5c, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0x62, 0x00, 0xcf, 0x00, 0x02, 0x00, +0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0x84, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x85, 0x02, 0xd5, 0x00, 0x86, 0x02, 0x02, 0x00, +0x87, 0x02, 0x62, 0x01, 0x02, 0x00, 0x63, 0x01, 0x6c, 0x00, 0x88, 0x02, 0x89, 0x02, 0x66, 0x01, 0x02, 0x00, 0x67, 0x01, +0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x68, 0x01, 0x6c, 0x00, 0x8a, 0x02, 0x6c, 0x01, 0x6d, 0x01, 0x02, 0x00, 0x8b, 0x02, +0x8c, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x72, 0x01, 0x6c, 0x00, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x02, 0x00, +0x8d, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x7b, 0x01, 0x6c, 0x00, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, +0x80, 0x01, 0x63, 0x01, 0x6c, 0x00, 0x69, 0x00, 0x02, 0x00, 0x81, 0x01, 0xd7, 0x00, 0x02, 0x00, 0x8e, 0x02, 0x83, 0x01, +0x84, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x85, 0x01, 0x6c, 0x00, 0x86, 0x01, 0x87, 0x01, 0x8f, 0x02, 0x89, 0x01, +0x8a, 0x01, 0x6c, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f, 0x02, 0x20, 0x02, 0x06, 0x00, 0x02, 0x00, +0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x10, 0x00, 0x11, 0x00, 0x92, 0x01, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x90, 0x02, 0x91, 0x02, 0x69, 0x00, +0x02, 0x00, 0x95, 0x01, 0x96, 0x01, 0x6c, 0x00, 0x92, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1f, 0x02, 0x20, 0x02, +0xd5, 0x00, 0x69, 0x00, 0x02, 0x00, 0x97, 0x01, 0x6c, 0x00, 0x82, 0x0c, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x1f, 0x02, +0x20, 0x02, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x08, 0x00, +0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, +0x99, 0x01, 0x9a, 0x01, 0x10, 0x00, 0x9b, 0x01, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x14, 0x00, 0x15, 0x00, 0x02, 0x00, +0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, +0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x95, 0x00, +0x96, 0x00, 0x97, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, +0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0x3a, 0x00, 0xa8, 0x00, 0xa9, 0x00, +0xaa, 0x00, 0x3e, 0x00, 0xac, 0x00, 0xad, 0x00, 0x41, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0x44, 0x00, 0xb2, 0x00, 0xb3, 0x00, +0xb4, 0x00, 0xb5, 0x00, 0x49, 0x00, 0x4a, 0x00, 0xb8, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0xbc, 0x00, 0xbd, 0x00, +0x51, 0x00, 0xbf, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, +0xc8, 0x00, 0x5c, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0x62, 0x00, 0x21, 0x02, 0x63, 0x00, +0x64, 0x00, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, +0x6d, 0x00, 0x02, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, +0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x9f, 0x02, 0xa0, 0x02, 0xa1, 0x02, +0xa2, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0x6c, 0x00, 0x4a, 0x17, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, +0x1f, 0x02, 0x20, 0x02, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, +0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, +0x11, 0x00, 0x99, 0x01, 0x9a, 0x01, 0x10, 0x00, 0x9b, 0x01, 0xdd, 0x00, 0x02, 0x00, 0xde, 0x00, 0xdf, 0x00, 0x05, 0x00, +0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x14, 0x00, 0xa7, 0x02, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, +0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, +0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x2b, 0x00, +0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, +0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0x3a, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0x3e, 0x00, 0xac, 0x00, +0xad, 0x00, 0x41, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0x44, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x49, 0x00, +0x4a, 0x00, 0xb8, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0x51, 0x00, 0xbf, 0x00, 0x53, 0x00, +0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xca, 0x00, +0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0x62, 0x00, 0xe1, 0x00, 0x02, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0xe4, 0x00, +0x02, 0x00, 0x2e, 0x02, 0xe6, 0x00, 0x2f, 0x02, 0x30, 0x02, 0x21, 0x02, 0x63, 0x00, 0xe9, 0x00, 0xea, 0x00, 0x64, 0x00, +0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0xeb, 0x00, 0x02, 0x00, 0xec, 0x00, 0x02, 0x00, 0xa8, 0x02, 0xa9, 0x02, 0xaa, 0x02, +0xab, 0x02, 0xac, 0x02, 0xf2, 0x00, 0x6c, 0x00, 0xad, 0x02, 0xae, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, +0xb3, 0x02, 0xb4, 0x02, 0x02, 0x00, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xff, 0x00, 0x6c, 0x00, 0xb9, 0x02, +0x6c, 0x00, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x6e, 0x00, +0x6c, 0x00, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0x02, 0x00, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, 0x02, +0xc2, 0x02, 0xc3, 0x02, 0x02, 0x00, 0xc4, 0x02, 0x02, 0x00, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0xc8, 0x02, 0x6c, 0x00, +0x6d, 0x00, 0x02, 0x00, 0xc9, 0x02, 0xca, 0x02, 0x6c, 0x00, 0x6c, 0x00, 0xcb, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, +0xcc, 0x02, 0x6c, 0x00, 0xcd, 0x02, 0xce, 0x02, 0x02, 0x00, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, +0xd4, 0x02, 0xd5, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0xd6, 0x02, 0x6c, 0x00, 0xd7, 0x02, 0xd8, 0x02, 0xd9, 0x02, +0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, +0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0x6c, 0x00, 0xbd, 0x0b, 0x00, 0x00, +0x8c, 0x00, 0x00, 0x00, 0x1f, 0x02, 0x20, 0x02, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, +0x02, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, +0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x99, 0x01, 0x9a, 0x01, 0x10, 0x00, 0x9b, 0x01, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, +0x14, 0x00, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, +0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, +0x26, 0x00, 0x27, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x9c, 0x00, +0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, +0x3a, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0x3e, 0x00, 0xac, 0x00, 0xad, 0x00, 0x41, 0x00, 0xaf, 0x00, 0xb0, 0x00, +0x44, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x49, 0x00, 0x4a, 0x00, 0xb8, 0x00, 0x4c, 0x00, 0x4d, 0x00, +0x4e, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0x51, 0x00, 0xbf, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, +0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, +0x62, 0x00, 0x21, 0x02, 0x63, 0x00, 0x64, 0x00, 0x24, 0x02, 0x23, 0x02, 0x22, 0x02, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, +0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x92, 0x02, 0xeb, 0x02, 0xec, 0x02, +0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, +0xa6, 0x02, 0x6c, 0x00, 0x85, 0x16, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x1f, 0x02, 0x20, 0x02, 0x01, 0x00, 0x02, 0x00, +0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, +0x0c, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x99, 0x01, 0x9a, 0x01, 0x10, 0x00, +0x9b, 0x01, 0xdd, 0x00, 0x02, 0x00, 0xde, 0x00, 0xdf, 0x00, 0x05, 0x00, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x14, 0x00, +0xf7, 0x02, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, +0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, +0x26, 0x00, 0x27, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x9c, 0x00, +0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, +0x3a, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0x3e, 0x00, 0xac, 0x00, 0xad, 0x00, 0x41, 0x00, 0xaf, 0x00, 0xb0, 0x00, +0x44, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x49, 0x00, 0x4a, 0x00, 0xb8, 0x00, 0x4c, 0x00, 0x4d, 0x00, +0x4e, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0x51, 0x00, 0xbf, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, +0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, +0x62, 0x00, 0xe1, 0x00, 0x02, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0x02, 0x00, 0x2e, 0x02, 0xe6, 0x00, 0x2f, 0x02, +0x30, 0x02, 0x21, 0x02, 0x63, 0x00, 0xe9, 0x00, 0xea, 0x00, 0x64, 0x00, 0x24, 0x02, 0x23, 0x02, 0x22, 0x02, 0xeb, 0x00, +0x02, 0x00, 0xec, 0x00, 0x02, 0x00, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xf2, 0x00, 0x6c, 0x00, +0xfd, 0x02, 0xfe, 0x02, 0xff, 0x02, 0xb0, 0x02, 0xb1, 0x02, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x02, 0x00, 0x03, 0x03, +0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0xff, 0x00, 0x6c, 0x00, 0x07, 0x03, 0x6c, 0x00, 0x69, 0x00, 0x02, 0x00, 0x6a, 0x00, +0x02, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0xba, 0x02, 0x08, 0x03, 0xbc, 0x02, +0x02, 0x00, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x02, 0x00, 0x10, 0x03, +0x02, 0x00, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x15, 0x03, 0x16, 0x03, +0x6c, 0x00, 0x6c, 0x00, 0x17, 0x03, 0x6c, 0x00, 0x6d, 0x00, 0x02, 0x00, 0x18, 0x03, 0x6c, 0x00, 0x19, 0x03, 0xce, 0x02, +0x02, 0x00, 0x1a, 0x03, 0x1b, 0x03, 0x2c, 0x01, 0x1c, 0x03, 0x1d, 0x03, 0x1e, 0x03, 0x1f, 0x03, 0x6c, 0x00, 0x6d, 0x00, +0x02, 0x00, 0x20, 0x03, 0x6c, 0x00, 0x21, 0x03, 0x22, 0x03, 0x23, 0x03, 0x24, 0x03, 0x25, 0x03, 0x26, 0x03, 0x27, 0x03, +0x28, 0x03, 0x29, 0x03, 0x2a, 0x03, 0x2b, 0x03, 0x2c, 0x03, 0xea, 0x02, 0x6c, 0x00, 0x4c, 0x54, 0x45, 0x4d, 0x5f, 0x54, +0x41, 0x4d, 0x08, 0x1e, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xbe, 0x00, 0x00, +0x00, 0x01, 0x00, 0x01, 0xd0, 0x01, 0x00, 0x00, 0x01, 0x08, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x01, 0x10, 0x00, 0xb0, 0x04, +0x00, 0x00, 0x01, 0x10, 0x01, 0xb6, 0x05, 0x00, 0x00, 0x01, 0x18, 0x00, 0xd0, 0x05, 0x00, 0x00, 0x01, 0x20, 0x01, 0xa8, +0x07, 0x00, 0x00, 0x01, 0x30, 0x01, 0x34, 0x09, 0x00, 0x00, 0x01, 0x44, 0x01, 0x98, 0x09, 0x00, 0x00, 0x01, 0x80, 0x00, +0xc2, 0x09, 0x00, 0x00, 0x01, 0x88, 0x00, 0xfe, 0x0a, 0x00, 0x00, 0x01, 0x90, 0x00, 0x0c, 0x0d, 0x00, 0x00, 0x01, 0x98, +0x00, 0x3c, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3e, 0x10, 0x00, 0x00, 0x02, 0x00, 0x01, 0x50, 0x11, 0x00, 0x00, 0x02, +0x08, 0x00, 0x4a, 0x12, 0x00, 0x00, 0x02, 0x10, 0x00, 0xb0, 0x04, 0x00, 0x00, 0x02, 0x10, 0x01, 0xb6, 0x05, 0x00, 0x00, +0x02, 0x18, 0x00, 0x2e, 0x14, 0x00, 0x00, 0x02, 0x20, 0x01, 0x06, 0x16, 0x00, 0x00, 0x02, 0x30, 0x01, 0x34, 0x09, 0x00, +0x00, 0x02, 0x44, 0x01, 0x98, 0x09, 0x00, 0x00, 0x02, 0x80, 0x00, 0x8c, 0x17, 0x00, 0x00, 0x02, 0x88, 0x00, 0xc8, 0x18, +0x00, 0x00, 0x02, 0x90, 0x00, 0xd6, 0x1a, 0x00, 0x00, 0x02, 0x98, 0x00, 0x06, 0x1c, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, +0x85, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, +0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, +0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, +0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, +0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, +0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, +0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, +0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, +0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, +0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, +0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, +0x89, 0x03, 0x8a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, 0x8d, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x8e, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, +0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0x85, 0x0c, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x2d, 0x03, +0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, +0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, +0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, +0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, +0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, +0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, +0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, +0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, +0x2f, 0x03, 0x9a, 0x03, 0x02, 0x00, 0x9b, 0x03, 0x9c, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, +0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0xa0, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x89, 0x03, +0x05, 0x00, 0x2f, 0x03, 0xa1, 0x03, 0x02, 0x00, 0x8f, 0x03, 0xa2, 0x03, 0xa3, 0x03, 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, +0xa7, 0x03, 0xa8, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0xab, 0x03, 0xa9, 0x03, 0xac, 0x03, 0x99, 0x03, 0x6c, 0x00, +0x2f, 0x03, 0xb6, 0x20, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, +0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x05, 0x00, +0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, +0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, +0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, +0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, +0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, +0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, +0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, +0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, +0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xdd, 0x00, 0x02, 0x00, +0xad, 0x03, 0xae, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xaf, 0x03, 0x02, 0x00, 0xb0, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb1, 0x03, +0x02, 0x00, 0xb2, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb3, 0x03, 0x2f, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, +0xb8, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, +0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, +0x8d, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xbe, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0xbf, 0x03, +0xc0, 0x03, 0xa5, 0x03, 0xc1, 0x03, 0xc2, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, 0x03, 0xc8, 0x03, +0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, 0x03, 0xcf, 0x03, 0xd0, 0x03, 0xca, 0x03, 0xd1, 0x03, +0xd2, 0x03, 0xcf, 0x03, 0xd3, 0x03, 0xd4, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0xd5, 0x03, 0xa9, 0x03, 0xd6, 0x03, +0xd7, 0x03, 0xa5, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xc8, 0x03, 0xda, 0x03, 0xca, 0x03, 0xdb, 0x03, 0xdc, 0x03, 0xdd, 0x03, +0xde, 0x03, 0xdf, 0x03, 0xe0, 0x03, 0xcf, 0x03, 0xe1, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe5, 0x03, 0xe6, 0x03, +0xe7, 0x03, 0xe8, 0x03, 0xca, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xeb, 0x03, 0xec, 0x03, 0xed, 0x03, 0xcf, 0x03, 0xee, 0x03, +0xef, 0x03, 0xf0, 0x03, 0xf1, 0x03, 0xf2, 0x03, 0xf3, 0x03, 0xf4, 0x03, 0xf5, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, +0xf6, 0x03, 0xa9, 0x03, 0xf7, 0x03, 0x92, 0x03, 0xf8, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfb, 0x03, 0xfc, 0x03, 0xfd, 0x03, +0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0x09, 0x0e, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, +0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, +0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, +0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, +0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, +0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, +0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, +0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, +0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, +0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, +0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x85, 0x03, 0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, +0x02, 0x00, 0x8c, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x8e, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0xfe, 0x03, 0xff, 0x03, +0x00, 0x04, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, +0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x01, 0x04, 0x02, 0x00, 0x6c, 0x00, 0x2f, 0x03, 0xbd, 0x1f, 0x00, 0x00, 0xe8, 0x00, +0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, +0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, +0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, +0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, +0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, +0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, +0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, +0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, +0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, +0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, +0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xdd, 0x00, 0x02, 0x00, 0xad, 0x03, 0xae, 0x03, 0x05, 0x00, 0x2f, 0x03, +0xaf, 0x03, 0x02, 0x00, 0xb0, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb1, 0x03, 0x02, 0x00, 0xb2, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x02, 0x04, 0x2f, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb9, 0x03, +0xba, 0x03, 0xbb, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, +0x8a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0x05, 0x00, 0x2f, 0x03, +0xbe, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0x03, 0x04, 0xc0, 0x03, 0xa5, 0x03, 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, +0x07, 0x04, 0x08, 0x04, 0x09, 0x04, 0x0a, 0x04, 0xc8, 0x03, 0x0b, 0x04, 0xca, 0x03, 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, +0x0f, 0x04, 0xcf, 0x03, 0xd0, 0x03, 0xca, 0x03, 0x10, 0x04, 0x11, 0x04, 0xcf, 0x03, 0xd3, 0x03, 0x12, 0x04, 0xa9, 0x03, +0xaa, 0x03, 0xa5, 0x03, 0x13, 0x04, 0xa9, 0x03, 0x14, 0x04, 0xd7, 0x03, 0xa5, 0x03, 0x15, 0x04, 0xd9, 0x03, 0xc8, 0x03, +0xda, 0x03, 0xca, 0x03, 0x16, 0x04, 0x17, 0x04, 0x18, 0x04, 0x19, 0x04, 0x1a, 0x04, 0xe0, 0x03, 0xcf, 0x03, 0x1b, 0x04, +0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, 0x04, 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0xca, 0x03, 0x23, 0x04, 0x24, 0x04, +0x25, 0x04, 0x26, 0x04, 0xed, 0x03, 0xcf, 0x03, 0x27, 0x04, 0xef, 0x03, 0xf0, 0x03, 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, +0x2b, 0x04, 0x2c, 0x04, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0x2d, 0x04, 0xa9, 0x03, 0x2e, 0x04, 0x2f, 0x04, 0x30, 0x04, +0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0x0b, 0x19, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, +0x30, 0x03, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, +0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, +0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, +0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, +0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, +0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, +0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, +0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x9a, 0x03, +0x02, 0x00, 0x9b, 0x03, 0x9c, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x31, 0x04, 0x32, 0x04, 0x33, 0x04, 0x34, 0x04, 0x35, 0x04, +0x36, 0x04, 0x37, 0x04, 0x38, 0x04, 0x39, 0x04, 0x3a, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3d, 0x04, 0x3e, 0x04, 0x3f, 0x04, +0x05, 0x00, 0x2f, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0xa0, 0x03, +0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x86, 0x03, 0x89, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x40, 0x04, 0x02, 0x00, +0x8f, 0x03, 0x41, 0x04, 0x42, 0x04, 0xa4, 0x03, 0xa5, 0x03, 0x43, 0x04, 0x44, 0x04, 0x45, 0x04, 0xa9, 0x03, 0xaa, 0x03, +0xa5, 0x03, 0x46, 0x04, 0xa9, 0x03, 0x47, 0x04, 0x48, 0x04, 0x49, 0x04, 0x4a, 0x04, 0xa5, 0x03, 0x4b, 0x04, 0x4c, 0x04, +0xc8, 0x03, 0x4d, 0x04, 0xef, 0x03, 0xd3, 0x03, 0x4e, 0x04, 0x4f, 0x04, 0x50, 0x04, 0x51, 0x04, 0xc8, 0x03, 0x52, 0x04, +0xd3, 0x03, 0x53, 0x04, 0xc8, 0x03, 0x54, 0x04, 0xd3, 0x03, 0x55, 0x04, 0x56, 0x04, 0x57, 0x04, 0x58, 0x04, 0x59, 0x04, +0xc8, 0x03, 0x5a, 0x04, 0x5b, 0x04, 0xd3, 0x03, 0x53, 0x04, 0xc8, 0x03, 0x5c, 0x04, 0xd3, 0x03, 0x5d, 0x04, 0x5e, 0x04, +0x5f, 0x04, 0xc8, 0x03, 0x60, 0x04, 0xd3, 0x03, 0x53, 0x04, 0xc8, 0x03, 0x61, 0x04, 0xd3, 0x03, 0x62, 0x04, 0x63, 0x04, +0x64, 0x04, 0x65, 0x04, 0x66, 0x04, 0x67, 0x04, 0x68, 0x04, 0x69, 0x04, 0x6a, 0x04, 0x6b, 0x04, 0x99, 0x03, 0x6c, 0x00, +0x2f, 0x03, 0xbc, 0x03, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, +0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x05, 0x00, +0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, +0x2f, 0x03, 0x6c, 0x04, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0x6d, 0x04, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, +0x87, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x6e, 0x04, 0x02, 0x00, 0x8f, 0x03, 0x6f, 0x04, 0x70, 0x04, 0x99, 0x03, 0x6c, 0x00, +0x2f, 0x03, 0xec, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, +0x85, 0x03, 0x02, 0x00, 0xa0, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x71, 0x04, 0x02, 0x00, 0x8f, 0x03, 0x72, 0x04, 0x99, 0x03, +0x6c, 0x00, 0x2f, 0x03, 0xf3, 0x12, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, +0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, +0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, +0x05, 0x00, 0x2f, 0x03, 0x73, 0x04, 0x74, 0x04, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, +0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, +0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, +0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, +0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, +0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, +0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, +0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, +0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x75, 0x04, +0x76, 0x04, 0x77, 0x04, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, 0x8d, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x8e, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0x78, 0x04, 0x79, 0x04, 0x92, 0x03, 0x7a, 0x04, 0x7b, 0x04, 0x7c, 0x04, +0x7d, 0x04, 0x7e, 0x04, 0x7f, 0x04, 0x80, 0x04, 0x81, 0x04, 0x82, 0x04, 0x83, 0x04, 0x84, 0x04, 0x85, 0x04, 0x86, 0x04, +0x87, 0x04, 0x88, 0x04, 0x89, 0x04, 0x8a, 0x04, 0x8b, 0x04, 0x8c, 0x04, 0x8d, 0x04, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, +0x38, 0x24, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, +0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x73, 0x04, 0x74, 0x04, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, +0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, +0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, +0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, +0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, +0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, +0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, +0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, +0xdd, 0x00, 0x02, 0x00, 0xad, 0x03, 0xae, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xaf, 0x03, 0x02, 0x00, 0xb0, 0x03, 0x05, 0x00, +0x2f, 0x03, 0xb1, 0x03, 0x02, 0x00, 0xb2, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x8e, 0x04, 0x2f, 0x03, 0xb4, 0x03, 0xb5, 0x03, +0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x85, 0x03, 0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x75, 0x04, 0x76, 0x04, 0x77, 0x04, +0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, 0x8d, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0x05, 0x00, 0x2f, 0x03, +0xbe, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0x8f, 0x04, 0x90, 0x04, 0x91, 0x04, 0xa5, 0x03, 0x92, 0x04, 0x93, 0x04, +0x94, 0x04, 0x95, 0x04, 0x96, 0x04, 0x97, 0x04, 0x98, 0x04, 0xc8, 0x03, 0x99, 0x04, 0xca, 0x03, 0x9a, 0x04, 0x9b, 0x04, +0x9c, 0x04, 0x9d, 0x04, 0xcf, 0x03, 0xd0, 0x03, 0xca, 0x03, 0x9e, 0x04, 0x9f, 0x04, 0xcf, 0x03, 0xd3, 0x03, 0xa0, 0x04, +0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0xa1, 0x04, 0xa9, 0x03, 0xa2, 0x04, 0xa3, 0x04, 0xa5, 0x03, 0xa4, 0x04, 0xd9, 0x03, +0xc8, 0x03, 0xda, 0x03, 0xca, 0x03, 0xa5, 0x04, 0xa6, 0x04, 0xa7, 0x04, 0xa8, 0x04, 0xa9, 0x04, 0xe0, 0x03, 0xcf, 0x03, +0xaa, 0x04, 0xab, 0x04, 0xac, 0x04, 0xad, 0x04, 0xae, 0x04, 0xaf, 0x04, 0xb0, 0x04, 0xb1, 0x04, 0xca, 0x03, 0xb2, 0x04, +0xb3, 0x04, 0xb4, 0x04, 0xb5, 0x04, 0xed, 0x03, 0xcf, 0x03, 0xb6, 0x04, 0xef, 0x03, 0xf0, 0x03, 0xb7, 0x04, 0xb8, 0x04, +0xb9, 0x04, 0xba, 0x04, 0xbb, 0x04, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0xbc, 0x04, 0xa9, 0x03, 0xbd, 0x04, 0x92, 0x03, +0xbe, 0x04, 0xbf, 0x04, 0xc0, 0x04, 0xc1, 0x04, 0xc2, 0x04, 0xc3, 0x04, 0xc4, 0x04, 0xc5, 0x04, 0xc6, 0x04, 0xc7, 0x04, +0xc8, 0x04, 0xc9, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xce, 0x04, 0xcf, 0x04, 0x8c, 0x04, 0x8d, 0x04, +0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0xdf, 0x11, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, +0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, +0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, +0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x73, 0x04, 0x74, 0x04, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, +0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, +0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, +0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, +0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, +0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, +0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, +0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, +0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, +0x75, 0x04, 0x76, 0x04, 0x77, 0x04, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x8e, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0xd0, 0x04, 0xd1, 0x04, 0xd2, 0x04, 0xd3, 0x04, 0xd4, 0x04, 0xd5, 0x04, +0xd6, 0x04, 0xd7, 0x04, 0xd8, 0x04, 0xd9, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, 0x04, +0x8c, 0x04, 0x8d, 0x04, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0x3f, 0x23, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x2d, 0x03, +0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, +0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, +0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x73, 0x04, 0x74, 0x04, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, +0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, +0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, +0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, +0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, +0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, +0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, +0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, +0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xdd, 0x00, 0x02, 0x00, 0xad, 0x03, 0xae, 0x03, 0x05, 0x00, +0x2f, 0x03, 0xaf, 0x03, 0x02, 0x00, 0xb0, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb1, 0x03, 0x02, 0x00, 0xb2, 0x03, 0x05, 0x00, +0x2f, 0x03, 0xe0, 0x04, 0x2f, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0x05, 0x00, 0x2f, 0x03, +0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, +0x89, 0x03, 0x8a, 0x03, 0x75, 0x04, 0x76, 0x04, 0x77, 0x04, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, +0xbc, 0x03, 0xbd, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xbe, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0xe1, 0x04, 0xe2, 0x04, +0xe3, 0x04, 0xa5, 0x03, 0xe4, 0x04, 0xe5, 0x04, 0xe6, 0x04, 0xe7, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xc8, 0x03, +0xeb, 0x04, 0xca, 0x03, 0xec, 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xcf, 0x03, 0xd0, 0x03, 0xca, 0x03, 0xf0, 0x04, +0xf1, 0x04, 0xcf, 0x03, 0xd3, 0x03, 0xf2, 0x04, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0xf3, 0x04, 0xa9, 0x03, 0xf4, 0x04, +0xf5, 0x04, 0xa5, 0x03, 0xf6, 0x04, 0xd9, 0x03, 0xc8, 0x03, 0xda, 0x03, 0xca, 0x03, 0xf7, 0x04, 0xf8, 0x04, 0xf9, 0x04, +0xfa, 0x04, 0xfb, 0x04, 0xe0, 0x03, 0xcf, 0x03, 0xfc, 0x04, 0xfd, 0x04, 0xfe, 0x04, 0xff, 0x04, 0x00, 0x05, 0x01, 0x05, +0x02, 0x05, 0x03, 0x05, 0xca, 0x03, 0x04, 0x05, 0x05, 0x05, 0x06, 0x05, 0x07, 0x05, 0xed, 0x03, 0xcf, 0x03, 0x08, 0x05, +0xef, 0x03, 0xf0, 0x03, 0x09, 0x05, 0x0a, 0x05, 0x0b, 0x05, 0x0c, 0x05, 0x0d, 0x05, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, +0x0e, 0x05, 0xa9, 0x03, 0x0f, 0x05, 0x10, 0x05, 0x11, 0x05, 0x12, 0x05, 0x13, 0x05, 0x14, 0x05, 0x15, 0x05, 0x16, 0x05, +0x17, 0x05, 0x18, 0x05, 0x19, 0x05, 0x1a, 0x05, 0x1b, 0x05, 0x1c, 0x05, 0x1d, 0x05, 0x8c, 0x04, 0x8d, 0x04, 0x99, 0x03, +0x6c, 0x00, 0x2f, 0x03, 0x02, 0x0f, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, +0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, +0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, +0x05, 0x00, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, +0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, +0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, +0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, +0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, +0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, +0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, +0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, +0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, +0x8c, 0x03, 0x8d, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x8e, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0x1e, 0x05, 0x92, 0x03, +0x1f, 0x05, 0x20, 0x05, 0x21, 0x05, 0x22, 0x05, 0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0x55, 0x0c, +0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, +0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, +0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, +0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, +0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, +0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, +0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, +0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, +0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x9a, 0x03, 0x02, 0x00, 0x9b, 0x03, 0x9c, 0x03, 0x05, 0x00, +0x2f, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0xa0, 0x03, 0x05, 0x00, +0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x89, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xa1, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x23, 0x05, +0xa4, 0x03, 0xa5, 0x03, 0x24, 0x05, 0x25, 0x05, 0x26, 0x05, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0x27, 0x05, 0xa9, 0x03, +0x28, 0x05, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0xb6, 0x20, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, +0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, +0x36, 0x03, 0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, +0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, +0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, +0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, +0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, +0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, +0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, +0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, +0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, +0x2f, 0x03, 0xdd, 0x00, 0x02, 0x00, 0xad, 0x03, 0xae, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xaf, 0x03, 0x02, 0x00, 0xb0, 0x03, +0x05, 0x00, 0x2f, 0x03, 0xb1, 0x03, 0x02, 0x00, 0xb2, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x29, 0x05, 0x2f, 0x03, 0xb4, 0x03, +0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0x05, 0x00, +0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, 0x8d, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xbe, 0x03, 0x02, 0x00, +0x8f, 0x03, 0x90, 0x03, 0x2a, 0x05, 0xc0, 0x03, 0xa5, 0x03, 0x2b, 0x05, 0x2c, 0x05, 0x2d, 0x05, 0xd5, 0x03, 0x2e, 0x05, +0x2f, 0x05, 0x30, 0x05, 0xc8, 0x03, 0x31, 0x05, 0xca, 0x03, 0x32, 0x05, 0x33, 0x05, 0x34, 0x05, 0x35, 0x05, 0xcf, 0x03, +0xd0, 0x03, 0xca, 0x03, 0x36, 0x05, 0x37, 0x05, 0xcf, 0x03, 0xd3, 0x03, 0x38, 0x05, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, +0x39, 0x05, 0xa9, 0x03, 0x3a, 0x05, 0xd7, 0x03, 0xa5, 0x03, 0x3b, 0x05, 0xd9, 0x03, 0xc8, 0x03, 0xda, 0x03, 0xca, 0x03, +0x3c, 0x05, 0x3d, 0x05, 0x3e, 0x05, 0x3f, 0x05, 0x40, 0x05, 0xe0, 0x03, 0xcf, 0x03, 0x41, 0x05, 0x42, 0x05, 0x43, 0x05, +0x44, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, 0x05, 0x48, 0x05, 0xca, 0x03, 0x49, 0x05, 0x4a, 0x05, 0x4b, 0x05, 0x4c, 0x05, +0xed, 0x03, 0xcf, 0x03, 0x4d, 0x05, 0xef, 0x03, 0xf0, 0x03, 0x08, 0x04, 0x4e, 0x05, 0x4f, 0x05, 0x50, 0x05, 0x51, 0x05, +0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0x52, 0x05, 0xa9, 0x03, 0x53, 0x05, 0x92, 0x03, 0x54, 0x05, 0x55, 0x05, 0x56, 0x05, +0x57, 0x05, 0xfc, 0x03, 0xfd, 0x03, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0xbd, 0x1f, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, +0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, +0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, +0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, +0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, +0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, +0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, +0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, +0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, +0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, +0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, +0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xdd, 0x00, 0x02, 0x00, 0xad, 0x03, 0xae, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xaf, 0x03, +0x02, 0x00, 0xb0, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb1, 0x03, 0x02, 0x00, 0xb2, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x58, 0x05, +0x2f, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb9, 0x03, 0xba, 0x03, +0xbb, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, +0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xbe, 0x03, +0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0x59, 0x05, 0xc0, 0x03, 0xa5, 0x03, 0x5a, 0x05, 0x5b, 0x05, 0x5c, 0x05, 0x13, 0x04, +0x5d, 0x05, 0x5e, 0x05, 0x5f, 0x05, 0xc8, 0x03, 0x60, 0x05, 0xca, 0x03, 0x61, 0x05, 0x62, 0x05, 0x63, 0x05, 0x64, 0x05, +0xcf, 0x03, 0xd0, 0x03, 0xca, 0x03, 0x65, 0x05, 0x66, 0x05, 0xcf, 0x03, 0xd3, 0x03, 0x67, 0x05, 0xa9, 0x03, 0xaa, 0x03, +0xa5, 0x03, 0x68, 0x05, 0xa9, 0x03, 0x69, 0x05, 0xd7, 0x03, 0xa5, 0x03, 0x6a, 0x05, 0xd9, 0x03, 0xc8, 0x03, 0xda, 0x03, +0xca, 0x03, 0x6b, 0x05, 0x6c, 0x05, 0x6d, 0x05, 0x6e, 0x05, 0x6f, 0x05, 0xe0, 0x03, 0xcf, 0x03, 0x70, 0x05, 0x71, 0x05, +0x72, 0x05, 0x73, 0x05, 0x74, 0x05, 0x75, 0x05, 0x76, 0x05, 0x77, 0x05, 0xca, 0x03, 0x78, 0x05, 0x79, 0x05, 0x7a, 0x05, +0x7b, 0x05, 0xed, 0x03, 0xcf, 0x03, 0x7c, 0x05, 0xef, 0x03, 0xf0, 0x03, 0x7d, 0x05, 0x7e, 0x05, 0x7f, 0x05, 0x80, 0x05, +0x81, 0x05, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0x82, 0x05, 0xa9, 0x03, 0x83, 0x05, 0x2f, 0x04, 0x30, 0x04, 0x99, 0x03, +0x6c, 0x00, 0x2f, 0x03, 0x7a, 0x18, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, +0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, +0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, +0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, +0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, +0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, +0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, +0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, +0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x9a, 0x03, 0x02, 0x00, +0x9b, 0x03, 0x9c, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x31, 0x04, 0x32, 0x04, 0x33, 0x04, 0x34, 0x04, 0x35, 0x04, 0x36, 0x04, +0x37, 0x04, 0x38, 0x04, 0x39, 0x04, 0x3a, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3d, 0x04, 0x3e, 0x04, 0x3f, 0x04, 0x05, 0x00, +0x2f, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0xa0, 0x03, 0x05, 0x00, +0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x86, 0x03, 0x89, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x40, 0x04, 0x02, 0x00, 0x8f, 0x03, +0x84, 0x05, 0xa4, 0x03, 0xa5, 0x03, 0x85, 0x05, 0x86, 0x05, 0x87, 0x05, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0x88, 0x05, +0xa9, 0x03, 0x89, 0x05, 0x48, 0x04, 0x8a, 0x05, 0x8b, 0x05, 0x4a, 0x04, 0xa5, 0x03, 0x4b, 0x04, 0x4c, 0x04, 0xc8, 0x03, +0x8c, 0x05, 0xef, 0x03, 0xd3, 0x03, 0x4e, 0x04, 0x4f, 0x04, 0x50, 0x04, 0x51, 0x04, 0xc8, 0x03, 0x52, 0x04, 0xd3, 0x03, +0x53, 0x04, 0xc8, 0x03, 0x54, 0x04, 0xd3, 0x03, 0x8d, 0x05, 0x8e, 0x05, 0x59, 0x04, 0xc8, 0x03, 0x8f, 0x05, 0x90, 0x05, +0xd3, 0x03, 0x53, 0x04, 0xc8, 0x03, 0x91, 0x05, 0xd3, 0x03, 0x92, 0x05, 0x93, 0x05, 0x5f, 0x04, 0xc8, 0x03, 0x94, 0x05, +0xd3, 0x03, 0x53, 0x04, 0xc8, 0x03, 0x61, 0x04, 0xd3, 0x03, 0x95, 0x05, 0x96, 0x05, 0x65, 0x04, 0x66, 0x04, 0x67, 0x04, +0x68, 0x04, 0x69, 0x04, 0x6a, 0x04, 0x97, 0x05, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0xfe, 0x12, 0x00, 0x00, 0x9a, 0x00, +0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, +0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, +0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x73, 0x04, 0x74, 0x04, 0x2f, 0x03, +0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, +0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, +0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, +0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, +0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, +0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, +0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, +0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0x86, 0x03, +0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x75, 0x04, 0x76, 0x04, 0x77, 0x04, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, +0x02, 0x00, 0x8c, 0x03, 0x8d, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x8e, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0x98, 0x05, +0x99, 0x05, 0x92, 0x03, 0x9a, 0x05, 0x9b, 0x05, 0x9c, 0x05, 0x9d, 0x05, 0x9e, 0x05, 0x9f, 0x05, 0xa0, 0x05, 0xa1, 0x05, +0xa2, 0x05, 0xa3, 0x05, 0xa4, 0x05, 0xa5, 0x05, 0xa6, 0x05, 0xa7, 0x05, 0xa8, 0x05, 0xa9, 0x05, 0xaa, 0x05, 0xab, 0x05, +0x8c, 0x04, 0x8d, 0x04, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0x98, 0x24, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x2d, 0x03, +0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, +0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, +0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x73, 0x04, 0x74, 0x04, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, +0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, +0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, +0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, +0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, +0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, +0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, +0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, +0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xdd, 0x00, 0x02, 0x00, 0xad, 0x03, 0xae, 0x03, 0x05, 0x00, +0x2f, 0x03, 0xaf, 0x03, 0x02, 0x00, 0xb0, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb1, 0x03, 0x02, 0x00, 0xb2, 0x03, 0x05, 0x00, +0x2f, 0x03, 0xac, 0x05, 0x2f, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0x05, 0x00, 0x2f, 0x03, +0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, +0x89, 0x03, 0x8a, 0x03, 0x75, 0x04, 0x76, 0x04, 0x77, 0x04, 0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, +0x8d, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xbe, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0xad, 0x05, +0xae, 0x05, 0xaf, 0x05, 0xa5, 0x03, 0xb0, 0x05, 0xb1, 0x05, 0xb2, 0x05, 0xb3, 0x05, 0xb4, 0x05, 0xb5, 0x05, 0xb6, 0x05, +0xc8, 0x03, 0xb7, 0x05, 0xca, 0x03, 0xb8, 0x05, 0xb9, 0x05, 0xba, 0x05, 0xbb, 0x05, 0xcf, 0x03, 0xd0, 0x03, 0xca, 0x03, +0xbc, 0x05, 0xbd, 0x05, 0xcf, 0x03, 0xd3, 0x03, 0xbe, 0x05, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0xbf, 0x05, 0xa9, 0x03, +0xc0, 0x05, 0xc1, 0x05, 0xa5, 0x03, 0xc2, 0x05, 0xd9, 0x03, 0xc8, 0x03, 0xda, 0x03, 0xca, 0x03, 0xc3, 0x05, 0xc4, 0x05, +0xc5, 0x05, 0xc6, 0x05, 0xc7, 0x05, 0xe0, 0x03, 0xcf, 0x03, 0xc8, 0x05, 0xc9, 0x05, 0xca, 0x05, 0xcb, 0x05, 0xcc, 0x05, +0xcd, 0x05, 0xce, 0x05, 0xcf, 0x05, 0xca, 0x03, 0xd0, 0x05, 0xd1, 0x05, 0xd2, 0x05, 0xd3, 0x05, 0xed, 0x03, 0xcf, 0x03, +0xd4, 0x05, 0xef, 0x03, 0xf0, 0x03, 0xd5, 0x05, 0xd6, 0x05, 0xd7, 0x05, 0xd8, 0x05, 0xd9, 0x05, 0xa9, 0x03, 0xaa, 0x03, +0xa5, 0x03, 0xda, 0x05, 0xa9, 0x03, 0xdb, 0x05, 0x92, 0x03, 0xdc, 0x05, 0xdd, 0x05, 0xde, 0x05, 0xdf, 0x05, 0xe0, 0x05, +0xe1, 0x05, 0xe2, 0x05, 0xe3, 0x05, 0xe4, 0x05, 0xe5, 0x05, 0xe6, 0x05, 0xe7, 0x05, 0xe8, 0x05, 0xe9, 0x05, 0xea, 0x05, +0xeb, 0x05, 0xec, 0x05, 0xed, 0x05, 0x8c, 0x04, 0x8d, 0x04, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, 0x05, 0x12, 0x00, 0x00, +0x94, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, 0x02, 0x00, 0x31, 0x03, +0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x0e, 0x00, 0x0f, 0x00, +0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x73, 0x04, 0x74, 0x04, +0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, +0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, +0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, +0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, +0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, +0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, +0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, +0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x85, 0x03, 0x02, 0x00, +0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x75, 0x04, 0x76, 0x04, 0x77, 0x04, 0x05, 0x00, 0x2f, 0x03, +0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, 0x05, 0x00, 0x2f, 0x03, 0x8e, 0x03, 0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0x98, 0x05, +0xee, 0x05, 0xef, 0x05, 0xf0, 0x05, 0xf1, 0x05, 0xf2, 0x05, 0xf3, 0x05, 0xf4, 0x05, 0xf5, 0x05, 0xf6, 0x05, 0xf7, 0x05, +0xf8, 0x05, 0xf9, 0x05, 0xfa, 0x05, 0xfb, 0x05, 0xab, 0x05, 0x8c, 0x04, 0x8d, 0x04, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, +0x9a, 0x23, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x2f, 0x03, 0x06, 0x00, +0x02, 0x00, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x38, 0x03, 0x2f, 0x03, 0x39, 0x03, 0x02, 0x00, 0x3a, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x73, 0x04, 0x74, 0x04, 0x2f, 0x03, 0x3b, 0x03, 0x02, 0x00, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, +0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, +0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, +0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, +0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, +0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, +0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, +0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x05, 0x00, 0x2f, 0x03, +0xdd, 0x00, 0x02, 0x00, 0xad, 0x03, 0xae, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xaf, 0x03, 0x02, 0x00, 0xb0, 0x03, 0x05, 0x00, +0x2f, 0x03, 0xb1, 0x03, 0x02, 0x00, 0xb2, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xfc, 0x05, 0x2f, 0x03, 0xb4, 0x03, 0xb5, 0x03, +0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0x05, 0x00, 0x2f, 0x03, +0x85, 0x03, 0x02, 0x00, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x75, 0x04, 0x76, 0x04, 0x77, 0x04, +0x05, 0x00, 0x2f, 0x03, 0x8b, 0x03, 0x02, 0x00, 0x8c, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0x05, 0x00, 0x2f, 0x03, 0xbe, 0x03, +0x02, 0x00, 0x8f, 0x03, 0x90, 0x03, 0xad, 0x05, 0xfd, 0x05, 0xaf, 0x05, 0xa5, 0x03, 0xfe, 0x05, 0xff, 0x05, 0x00, 0x06, +0x01, 0x06, 0x02, 0x06, 0x03, 0x06, 0x04, 0x06, 0xc8, 0x03, 0x05, 0x06, 0xca, 0x03, 0x06, 0x06, 0x07, 0x06, 0x08, 0x06, +0x09, 0x06, 0xcf, 0x03, 0xd0, 0x03, 0xca, 0x03, 0x0a, 0x06, 0x0b, 0x06, 0xcf, 0x03, 0xd3, 0x03, 0x0c, 0x06, 0xa9, 0x03, +0xaa, 0x03, 0xa5, 0x03, 0x0d, 0x06, 0xa9, 0x03, 0x0e, 0x06, 0xc1, 0x05, 0xa5, 0x03, 0x0f, 0x06, 0xd9, 0x03, 0xc8, 0x03, +0xda, 0x03, 0xca, 0x03, 0x10, 0x06, 0x11, 0x06, 0x12, 0x06, 0x13, 0x06, 0x14, 0x06, 0xe0, 0x03, 0xcf, 0x03, 0x15, 0x06, +0x16, 0x06, 0x17, 0x06, 0x18, 0x06, 0x19, 0x06, 0x1a, 0x06, 0x1b, 0x06, 0x1c, 0x06, 0xca, 0x03, 0x1d, 0x06, 0x1e, 0x06, +0x1f, 0x06, 0x20, 0x06, 0xed, 0x03, 0xcf, 0x03, 0x21, 0x06, 0xef, 0x03, 0xf0, 0x03, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, +0x25, 0x06, 0x26, 0x06, 0xa9, 0x03, 0xaa, 0x03, 0xa5, 0x03, 0x27, 0x06, 0xa9, 0x03, 0x28, 0x06, 0x29, 0x06, 0x2a, 0x06, +0x2b, 0x06, 0x2c, 0x06, 0x2d, 0x06, 0x2e, 0x06, 0x2f, 0x06, 0x30, 0x06, 0x31, 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, 0x06, +0x35, 0x06, 0xed, 0x05, 0x8c, 0x04, 0x8d, 0x04, 0x99, 0x03, 0x6c, 0x00, 0x2f, 0x03, }; int UNLIT_UNLIT_OFFSET = 0; -int UNLIT_UNLIT_SIZE = 63643; +int UNLIT_UNLIT_SIZE = 101394; From f6a136643d4e974eb7194e0952add7a9fa99c19d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:04:43 +0800 Subject: [PATCH 202/232] remove image.mat from LFS --- materials/image.mat | 55 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/materials/image.mat b/materials/image.mat index 0775f048..132a8de2 100644 --- a/materials/image.mat +++ b/materials/image.mat @@ -1,3 +1,52 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:273059c97f96c6848807914d937583864445b51d8e0f1cd98c3e4e0e4bd9f411 -size 1451 +material { + name : Image, + parameters : [ + { + type : sampler2d, + name : image + }, + { + type : mat4, + name : transform, + precision : high + }, + { + type : float4, + name : backgroundColor + }, + { + type : int, + name : showImage + } + ], + variables : [ + imageUV + ], + vertexDomain : device, + depthWrite : false, + shadingModel : unlit, + variantFilter : [ skinning, shadowReceiver, vsm ], + culling: none +} + +vertex { + void materialVertex(inout MaterialVertexInputs material) { + material.imageUV.st = getPosition().st * 0.5 + 0.5; + } +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + highp vec2 uv = (materialParams.transform * vec4(saturate(variable_imageUV.st), 1.0, 1.0)).st; + if (materialParams.showImage == 0 || uv.s > 1.0 || uv.s < 0.0 || uv.t < 0.0 || uv.t > 1.0) { + material.baseColor = materialParams.backgroundColor; + } else { + uv.t = 1.0 - uv.t; + vec4 color = max(texture(materialParams_image, uv.st), 0.0); + color.rgb *= color.a; + // Manual, pre-multiplied srcOver with opaque destination optimization + material.baseColor.rgb = color.rgb + materialParams.backgroundColor.rgb * (1.0 - color.a); + } + } +} From b421df5e2f0f387f411a54b2ce39a6c69e32ec99 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:04:59 +0800 Subject: [PATCH 203/232] remove image.mat from LFS --- .../native/include/material/image.bin | Bin 37409 -> 37409 bytes thermion_dart/native/include/material/image.c | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/thermion_dart/native/include/material/image.bin b/thermion_dart/native/include/material/image.bin index 72fb882e50400426b178c53f5d28cdc12e53c723..5291f70dbf6711503735d2023c50f64bd2a5fe23 100644 GIT binary patch delta 23 fcmZ3uglXXtrVaJX9CsF_mAszzZ_?&==2?9JgjNfe delta 23 fcmZ3uglXXtrVaJX9EA#9BKzK|rEP9!p4A5caLx&o diff --git a/thermion_dart/native/include/material/image.c b/thermion_dart/native/include/material/image.c index 81f2f959..19501f9e 100644 --- a/thermion_dart/native/include/material/image.c +++ b/thermion_dart/native/include/material/image.c @@ -47,8 +47,8 @@ const uint8_t IMAGE_PACKAGE[] = { 0x00, 0x00, 0x00, 0x00, 0x53, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x43, 0x32, 0x41, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4d, 0x55, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4f, 0x52, 0x50, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x44, 0x49, 0x55, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x71, 0x20, 0x8a, 0x14, 0xbe, -0xed, 0x26, 0x66, 0x44, 0x41, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, +0x00, 0x00, 0x00, 0x44, 0x49, 0x55, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0xdc, 0xa2, 0x66, 0x74, 0xeb, +0x96, 0xfe, 0x92, 0x44, 0x41, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d, 0x48, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x54, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x49, 0x43, 0x5f, 0x54, 0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x41, 0x51, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x4d, 0x04, 0x00, 0x00, 0x00, From 0816286696441a3819b0ed10732cf1fcf234da1f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:05:14 +0800 Subject: [PATCH 204/232] export geometry from thermion_dart --- thermion_dart/lib/thermion_dart.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/thermion_dart/lib/thermion_dart.dart b/thermion_dart/lib/thermion_dart.dart index 9dfc2f26..de91b2e7 100644 --- a/thermion_dart/lib/thermion_dart.dart +++ b/thermion_dart/lib/thermion_dart.dart @@ -2,3 +2,4 @@ library filament_dart; export 'thermion_dart/thermion_viewer.dart'; export 'thermion_dart/entities/entity_transform_controller.dart'; +export 'thermion_dart/utils/geometry.dart'; From f816274fb94f2a75eb3f7dc7d2f44ca8aedaa00d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:06:42 +0800 Subject: [PATCH 205/232] replace some async methods with futures, fix setMaterialProperty4, update unproject, setMaterialPropertyInt, createUnlitMaterialInstance --- .../viewer/ffi/thermion_viewer_ffi.dart | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index c52c9129..cd2109f2 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -1147,8 +1147,8 @@ class ThermionViewerFFI extends ThermionViewer { set_main_camera(_viewer!); } - Future getMainCamera() async { - return get_main_camera(_viewer!); + Future getMainCamera() { + return Future.value(get_main_camera(_viewer!)); } /// @@ -1290,7 +1290,7 @@ class ThermionViewerFFI extends ThermionViewer { Future setCameraPosition(double x, double y, double z) async { var modelMatrix = await getCameraModelMatrix(); modelMatrix.setTranslation(Vector3(x, y, z)); - await setCameraModelMatrix4(modelMatrix); + return setCameraModelMatrix4(modelMatrix); } /// @@ -1965,22 +1965,22 @@ class ThermionViewerFFI extends ThermionViewer { Future setMaterialPropertyFloat4(ThermionEntity entity, String propertyName, int materialIndex, double f1, double f2, double f3, double f4) async { final ptr = propertyName.toNativeUtf8(allocator: allocator); - var struct = Struct.create(); + var struct = Struct.create(); struct.x = f1; struct.y = f2; struct.z = f3; - struct.w = f3; + struct.w = f4; set_material_property_float4( _sceneManager!, entity, materialIndex, ptr.cast(), struct); allocator.free(ptr); } - Future unproject( - ThermionEntity entity, Uint8List input, int inputWidth, int inputHeight, int outWidth, int outHeight) async { + Future unproject(ThermionEntity entity, Uint8List input, + int inputWidth, int inputHeight, int outWidth, int outHeight) async { final outPtr = Uint8List(outWidth * outHeight * 4); await withVoidCallback((callback) { - unproject_texture_ffi( - _viewer!, entity, input.address, inputWidth, inputHeight, outPtr.address, outWidth, outHeight, callback); + unproject_texture_ffi(_viewer!, entity, input.address, inputWidth, + inputHeight, outPtr.address, outWidth, outHeight, callback); }); return outPtr.buffer.asUint8List(); @@ -2098,6 +2098,24 @@ class ThermionViewerFFI extends ThermionViewer { ThermionFFIMaterialInstance materialInstance) async { destroy_material_instance(_sceneManager!, materialInstance._pointer); } + + Future createUnlitMaterialInstance() async { + var instance = create_unlit_material_instance(_sceneManager!); + if (instance == nullptr) { + throw Exception("Failed to create material instance"); + } + return ThermionFFIMaterialInstance(instance); + } + + @override + Future setMaterialPropertyInt(ThermionEntity entity, String propertyName, + int materialIndex, int value) { + final ptr = propertyName.toNativeUtf8(allocator: allocator); + set_material_property_int( + _sceneManager!, entity, materialIndex, ptr.cast(), value); + allocator.free(ptr); + return Future.value(); + } } class ThermionFFITexture extends ThermionTexture { From 6d862ef36a57abafe75949c6a5b73c09d09298be Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:07:37 +0800 Subject: [PATCH 206/232] update bindings --- .../viewer/ffi/thermion_dart.g.dart | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart index 33742218..f6438ff3 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart @@ -432,6 +432,12 @@ external ffi.Pointer create_material_instance( TMaterialKey materialConfig, ); +@ffi.Native Function(ffi.Pointer)>( + isLeaf: true) +external ffi.Pointer create_unlit_material_instance( + ffi.Pointer sceneManager, +); + @ffi.Native< ffi.Void Function( ffi.Pointer, ffi.Pointer)>(isLeaf: true) @@ -1210,13 +1216,24 @@ external void set_material_property_float( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, - ffi.Pointer, float4)>(isLeaf: true) + ffi.Pointer, ffi.Int)>(isLeaf: true) +external void set_material_property_int( + ffi.Pointer sceneManager, + int entity, + int materialIndex, + ffi.Pointer property, + int value, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, + ffi.Pointer, double4)>(isLeaf: true) external void set_material_property_float4( ffi.Pointer sceneManager, int entity, int materialIndex, ffi.Pointer property, - float4 value, + double4 value, ); @ffi.Native< @@ -1922,17 +1939,17 @@ final class UnnamedStruct2 extends ffi.Struct { external int specularGlossinessUV; } -final class float4 extends ffi.Struct { - @ffi.Float() +final class double4 extends ffi.Struct { + @ffi.Double() external double x; - @ffi.Float() + @ffi.Double() external double y; - @ffi.Float() + @ffi.Double() external double z; - @ffi.Float() + @ffi.Double() external double w; } From 033c3f632d83640917e328c9cfa30f3a6e4e3392 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:08:16 +0800 Subject: [PATCH 207/232] add createUnlitMaterialInstance, setMaterialPropertyInt methods to viewer interface --- .../viewer/thermion_viewer_base.dart | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart index bdac6c24..d0419f58 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart @@ -1,4 +1,5 @@ import 'package:thermion_dart/thermion_dart/viewer/events.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart'; import 'shared_types/shared_types.dart'; export 'shared_types/shared_types.dart'; @@ -189,7 +190,10 @@ abstract class ThermionViewer { /// If [keepData] is false, the source glTF data will be released and [createInstance] will throw an exception. /// Future loadGlbFromBuffer(Uint8List data, - {int numInstances = 1, bool keepData = false, int priority=4, int layer=0}); + {int numInstances = 1, + bool keepData = false, + int priority = 4, + int layer = 0}); /// /// Create a new instance of [entity]. @@ -588,6 +592,13 @@ abstract class ThermionViewer { Future setMaterialPropertyFloat(ThermionEntity entity, String propertyName, int materialIndex, double value); + /// + /// Sets the material property [propertyName] under material [materialIndex] for [entity] to [value]. + /// [entity] must have a Renderable attached. + /// + Future setMaterialPropertyInt(ThermionEntity entity, String propertyName, + int materialIndex, int value); + /// /// Scale [entity] to fit within the unit cube. /// @@ -786,7 +797,8 @@ abstract class ThermionViewer { /// Creates a (renderable) entity with the specified geometry and adds to the scene. /// If [keepData] is true, the source data will not be released. /// - Future createGeometry(Geometry geometry, {MaterialInstance? materialInstance, bool keepData = false}); + Future createGeometry(Geometry geometry, + {MaterialInstance? materialInstance, bool keepData = false}); /// /// Gets the parent entity of [entity]. Returns null if the entity has no parent. @@ -915,4 +927,9 @@ abstract class ThermionViewer { /// /// Future destroyMaterialInstance(covariant MaterialInstance materialInstance); + + /// + /// + /// + Future createUnlitMaterialInstance(); } From 51f52bb71b07121365ec5271c3089428ff23b680 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:08:26 +0800 Subject: [PATCH 208/232] update stub --- .../viewer/thermion_viewer_stub.dart | 65 +++++++++++++++---- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart index f30e22a1..b9465660 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart @@ -785,11 +785,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future loadGlbFromBuffer(Uint8List data, {int numInstances = 1, bool keepData = false}) { - // TODO: implement loadGlbFromBuffer - throw UnimplementedError(); - } @override Future queuePositionUpdateFromViewportCoords(ThermionEntity entity, double x, double y) { @@ -870,12 +865,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future createGeometry(Geometry geometry, {bool keepData=false}) { - // TODO: implement createGeometry - throw UnimplementedError(); - } - @override // TODO: implement sceneUpdated Stream get sceneUpdated => throw UnimplementedError(); @@ -885,6 +874,60 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement addDirectLight throw UnimplementedError(); } + + @override + Future applyTexture(covariant ThermionTexture texture, ThermionEntity entity, {int materialIndex = 0, String parameterName = "baseColorMap"}) { + // TODO: implement applyTexture + throw UnimplementedError(); + } + + @override + Future createTexture(Uint8List data) { + // TODO: implement createTexture + throw UnimplementedError(); + } + + @override + Future createUbershaderMaterialInstance({bool doubleSided = false, bool unlit = false, bool hasVertexColors = false, bool hasBaseColorTexture = false, bool hasNormalTexture = false, bool hasOcclusionTexture = false, bool hasEmissiveTexture = false, bool useSpecularGlossiness = false, AlphaMode alphaMode = AlphaMode.OPAQUE, bool enableDiagnostics = false, bool hasMetallicRoughnessTexture = false, int metallicRoughnessUV = 0, int baseColorUV = 0, bool hasClearCoatTexture = false, int clearCoatUV = 0, bool hasClearCoatRoughnessTexture = false, int clearCoatRoughnessUV = 0, bool hasClearCoatNormalTexture = false, int clearCoatNormalUV = 0, bool hasClearCoat = false, bool hasTransmission = false, bool hasTextureTransforms = false, int emissiveUV = 0, int aoUV = 0, int normalUV = 0, bool hasTransmissionTexture = false, int transmissionUV = 0, bool hasSheenColorTexture = false, int sheenColorUV = 0, bool hasSheenRoughnessTexture = false, int sheenRoughnessUV = 0, bool hasVolumeThicknessTexture = false, int volumeThicknessUV = 0, bool hasSheen = false, bool hasIOR = false, bool hasVolume = false}) { + // TODO: implement createUbershaderMaterialInstance + throw UnimplementedError(); + } + + @override + Future createUnlitMaterialInstance() { + // TODO: implement createUnlitMaterialInstance + throw UnimplementedError(); + } + + @override + Future destroyMaterialInstance(covariant MaterialInstance materialInstance) { + // TODO: implement destroyMaterialInstance + throw UnimplementedError(); + } + + @override + Future destroyTexture(covariant ThermionTexture texture) { + // TODO: implement destroyTexture + throw UnimplementedError(); + } + + @override + Future createGeometry(Geometry geometry, {MaterialInstance? materialInstance, bool keepData = false}) { + // TODO: implement createGeometry + throw UnimplementedError(); + } + + @override + Future loadGlbFromBuffer(Uint8List data, {int numInstances = 1, bool keepData = false, int priority = 4, int layer = 0}) { + // TODO: implement loadGlbFromBuffer + throw UnimplementedError(); + } + + @override + Future setMaterialPropertyInt(ThermionEntity entity, String propertyName, int materialIndex, int value) { + // TODO: implement setMaterialPropertyInt + throw UnimplementedError(); + } } From fc3ca3d6b310792119c067b7b1f8cb30d3504cf7 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:08:47 +0800 Subject: [PATCH 209/232] update tests --- thermion_dart/test/integration_test.dart | 89 ++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 7 deletions(-) diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index d1a0b0ba..0feb5bef 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -24,6 +24,7 @@ void main() async { outDir.createSync(); Future _capture(ThermionViewer viewer, String outputFilename) async { + await Future.delayed(Duration(milliseconds: 10)); var outPath = p.join(outDir.path, "$outputFilename.bmp"); var pixelBuffer = await viewer.capture(); await savePixelBufferToBmp( @@ -335,7 +336,8 @@ void main() async { await _capture(viewer, "geometry_cube_with_normals"); }); - test('create cube with custom material instance', () async { + test('create cube with custom ubershader material instance (color)', + () async { var viewer = await createViewer(); await viewer.addLight(LightType.SUN, 6500, 1000000, 0, 0, 0, 0, 0, -1); await viewer.setCameraPosition(0, 2, 6); @@ -350,11 +352,84 @@ void main() async { materialInstance: materialInstance); await viewer.setMaterialPropertyFloat4( cube, "baseColorFactor", 0, 0.0, 1.0, 0.0, 0.0); - await _capture(viewer, "geometry_cube_with_custom_material"); + await _capture(viewer, "geometry_cube_with_custom_material_ubershader"); await viewer.removeEntity(cube); await viewer.destroyMaterialInstance(materialInstance); }); + test('create cube with custom ubershader material instance (texture)', + () async { + var viewer = await createViewer(); + await viewer.addLight(LightType.SUN, 6500, 1000000, 0, 0, 0, 0, 0, -1); + await viewer.setCameraPosition(0, 2, 6); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); + await viewer.setBackgroundColor(1.0, 0.0, 0.0, 1.0); + + var materialInstance = await viewer.createUbershaderMaterialInstance(); + final cube = await viewer.createGeometry( + GeometryHelper.cube(uvs: true, normals: true), + materialInstance: materialInstance); + var textureData = + File("$testDir/cube_texture_512x512.png").readAsBytesSync(); + var texture = await viewer.createTexture(textureData); + await viewer.applyTexture(texture as ThermionFFITexture, cube); + await _capture( + viewer, "geometry_cube_with_custom_material_ubershader_texture"); + await viewer.removeEntity(cube); + await viewer.destroyMaterialInstance(materialInstance); + await viewer.destroyTexture(texture); + }); + + test('create cube with custom material instance (unlit)', () async { + var viewer = await createViewer(); + await viewer.setCameraPosition(0, 2, 6); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); + await viewer.setBackgroundColor(1.0, 0.0, 0.0, 1.0); + await viewer.setPostProcessing(true); + await viewer.setToneMapping(ToneMapper.LINEAR); + + var materialInstance = await viewer.createUnlitMaterialInstance(); + var cube = await viewer.createGeometry(GeometryHelper.cube(), + materialInstance: materialInstance); + + var textureData = + File("$testDir/cube_texture_512x512.png").readAsBytesSync(); + var texture = await viewer.createTexture(textureData); + await viewer.applyTexture(texture, cube); + await _capture( + viewer, "geometry_cube_with_custom_material_unlit_texture_only"); + await viewer.removeEntity(cube); + + cube = await viewer.createGeometry(GeometryHelper.cube(), + materialInstance: materialInstance); + // reusing same material instance, so set baseColorIndex to -1 to disable the texture + await viewer.setMaterialPropertyInt(cube, "baseColorIndex", 0, -1); + await viewer.setMaterialPropertyFloat4( + cube, "baseColorFactor", 0, 0.0, 1.0, 0.0, 1.0); + await _capture( + viewer, "geometry_cube_with_custom_material_unlit_color_only"); + await viewer.removeEntity(cube); + + cube = await viewer.createGeometry(GeometryHelper.cube(), + materialInstance: materialInstance); + // now set baseColorIndex to 0 to enable the texture and the base color + await viewer.setMaterialPropertyInt(cube, "baseColorIndex", 0, 0); + await viewer.setMaterialPropertyFloat4( + cube, "baseColorFactor", 0, 0.0, 1.0, 0.0, 0.5); + await viewer.applyTexture(texture, cube); + + await _capture( + viewer, "geometry_cube_with_custom_material_unlit_color_and_texture"); + + await viewer.removeEntity(cube); + + await viewer.destroyTexture(texture); + await viewer.destroyMaterialInstance(materialInstance); + await viewer.dispose(); + }); + test('create sphere (no normals)', () async { var viewer = await createViewer(); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); @@ -732,6 +807,7 @@ void main() async { var textureData = File("$testDir/cube_texture_512x512.png").readAsBytesSync(); + var texture = await viewer.createTexture(textureData); await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0); await viewer.addDirectLight( @@ -751,8 +827,8 @@ void main() async { var cube = await viewer.createGeometry(GeometryHelper.cube(), materialInstance: materialInstance); - await viewer.setPostProcessing(false); - //await viewer.setToneMapping(ToneMapper.LINEAR); + await viewer.setPostProcessing(true); + await viewer.setToneMapping(ToneMapper.LINEAR); await viewer.applyTexture(texture, cube, materialIndex: 0, parameterName: "baseColorMap"); @@ -863,11 +939,10 @@ void main() async { File("${outDir.path}/unproject_texture.png") .writeAsBytesSync(pixelBufferPng); - await viewer.clearLights(); await viewer.setPostProcessing(true); - await viewer.setToneMapping(ToneMapper.ACES); + await viewer.setToneMapping(ToneMapper.LINEAR); - final unlit = await viewer.createUbershaderMaterialInstance(unlit: true); + final unlit = await viewer.createUnlitMaterialInstance(); await viewer.removeEntity(cube); cube = await viewer.createGeometry(GeometryHelper.cube(), materialInstance: unlit); From 43e5fd77667db4fab8f1b749b87b38b22d741dde Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:53:06 +0800 Subject: [PATCH 210/232] add setMaterialDepthWrite method --- thermion_dart/native/include/SceneManager.hpp | 1 + .../native/include/ThermionDartApi.h | 1 + thermion_dart/native/src/SceneManager.cpp | 16 ++++++++- thermion_dart/native/src/ThermionDartApi.cpp | 4 +++ thermion_dart/test/integration_test.dart | 33 +++++++++++++++++++ 5 files changed, 54 insertions(+), 1 deletion(-) diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 9eea41e9..ae1eef93 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -287,6 +287,7 @@ namespace thermion_filament void setMaterialProperty(EntityId entity, int materialIndex, const char* property, float value); void setMaterialProperty(EntityId entity, int materialIndex, const char* property, int32_t value); void setMaterialProperty(EntityId entityId, int materialIndex, const char* property, filament::math::float4& value); + void setMaterialDepthWrite(EntityId entityId, int materialIndex, bool enabled); MaterialInstance* createUbershaderMaterialInstance(MaterialKey key); void destroy(MaterialInstance* materialInstance); diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 9c33462f..93314125 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -277,6 +277,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float value); EMSCRIPTEN_KEEPALIVE void set_material_property_int(void *const sceneManager, EntityId entity, int materialIndex, const char *property, int value); EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, double4 value); + EMSCRIPTEN_KEEPALIVE void set_material_depth_write(void *const sceneManager, EntityId entity, int materialIndex, bool enabled); EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const sceneManager, EntityId entity,uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight); EMSCRIPTEN_KEEPALIVE void *const create_texture(void *const sceneManager, uint8_t *data, size_t length); EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void *const texture); diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 109510b4..25c3b3d7 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -2610,6 +2610,20 @@ EntityId SceneManager::createGeometry( return instance; } - + void SceneManager::setMaterialDepthWrite(EntityId entityId, int materialIndex, bool enabled) { + auto entity = Entity::import(entityId); + const auto &rm = _engine->getRenderableManager(); + auto renderableInstance = rm.getInstance(entity); + if (!renderableInstance.isValid()) + { + Log("Error setting material property for entity %d: no renderable"); + return; + } + auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); + + materialInstance->setDepthWrite(enabled); + } + + } // namespace thermion_filament diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 2eb7cb25..fd7beb6a 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -978,6 +978,10 @@ extern "C" ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, filamentValue); } + EMSCRIPTEN_KEEPALIVE void set_material_depth_write(void *const sceneManager, EntityId entity, int materialIndex, bool enabled) { + ((SceneManager *)sceneManager)->setMaterialDepthWrite(entity, materialIndex, enabled); + } + EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const viewer, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight) { ((FilamentViewer *)viewer)->unprojectTexture(entity, input, inputWidth, inputHeight, out, outWidth, outHeight); diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index 0feb5bef..e76a7bb3 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -547,6 +547,39 @@ void main() async { await viewer.setMaterialPropertyFloat(cube, "roughnessFactor", 0, 0.0); await _capture(viewer, "set_material_roughness_post"); }); + + test('enable/disable depth write for custom geometry', () async { + var viewer = await createViewer(); + + await viewer.setCameraPosition(0, 0, 6); + await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); + var light = + await viewer.addLight(LightType.SUN, 6500, 100000, 0, 0, 0, 0, 0, -1); + + final cube1 = await viewer.createGeometry(GeometryHelper.cube()); + await viewer.setMaterialPropertyFloat4( + cube1, "baseColorFactor", 0, 1.0, 1.0, 1.0, 1); + final cube2 = await viewer.createGeometry(GeometryHelper.cube()); + await viewer.setPosition(cube2, 1.0, 0.0, -1.0); + await viewer.setMaterialPropertyFloat4( + cube2, "baseColorFactor", 0, 1.0, 0, 0, 1); + + // with depth write enabled on both materials, the red cube will render behind the white cube + await viewer.setMaterialDepthWrite(cube1, 0, true); + await viewer.setMaterialDepthWrite(cube2, 0, true); + await _capture(viewer, "geometry_enable_depth_write"); + + // with depth write disabled on both materials, the red cube will render in front of the white cube + // (relying on insertion order) + await viewer.setMaterialDepthWrite(cube1, 0, false); + await viewer.setMaterialDepthWrite(cube2, 0, false); + + await _capture(viewer, "geometry_disable_depth_write_insertion_order"); + + // if we set priority for the black cube to 7 (render) last, red cube will render behind the white cube + await viewer.setPriority(cube1, 7); + await _capture(viewer, "geometry_disable_depth_write_priority"); + }); }); group("transforms & parenting", () { From 77147cbafd958a5791af5b508e6152626ef2f935 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:53:16 +0800 Subject: [PATCH 211/232] add setMaterialDepthWrite method --- .../lib/thermion_dart/viewer/thermion_viewer_base.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart index d0419f58..388d91eb 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart @@ -599,6 +599,12 @@ abstract class ThermionViewer { Future setMaterialPropertyInt(ThermionEntity entity, String propertyName, int materialIndex, int value); + /// + /// Sets the depthWrite material instance at [materialIndex] for [entity] to [enabled]. + /// [entity] must have a Renderable attached. + /// + Future setMaterialDepthWrite(ThermionEntity entity, int materialIndex, bool enabled); + /// /// Scale [entity] to fit within the unit cube. /// From 0e3db2635f4e49602405aecf1e551478554a6fcf Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:53:34 +0800 Subject: [PATCH 212/232] update bindings --- .../thermion_dart/viewer/ffi/thermion_dart.g.dart | 10 ++++++++++ .../viewer/ffi/thermion_viewer_ffi.dart | 15 +++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart index f6438ff3..09dc272e 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart @@ -1236,6 +1236,16 @@ external void set_material_property_float4( double4 value, ); +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Int, ffi.Bool)>(isLeaf: true) +external void set_material_depth_write( + ffi.Pointer sceneManager, + int entity, + int materialIndex, + bool enabled, +); + @ffi.Native< ffi.Void Function( ffi.Pointer, diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index cd2109f2..b32206e2 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -1947,8 +1947,7 @@ class ThermionViewerFFI extends ThermionViewer { } /// - /// Sets the material property [propertyName] under material [materialIndex] for [entity] to [value]. - /// [entity] must have a Renderable attached. + /// /// Future setMaterialPropertyFloat(ThermionEntity entity, String propertyName, int materialIndex, double value) async { @@ -1959,8 +1958,7 @@ class ThermionViewerFFI extends ThermionViewer { } /// - /// Sets the material property [propertyName] under material [materialIndex] for [entity] to {f1,f2,f3,f4}. - /// [entity] must have a Renderable attached. + /// /// Future setMaterialPropertyFloat4(ThermionEntity entity, String propertyName, int materialIndex, double f1, double f2, double f3, double f4) async { @@ -1975,6 +1973,15 @@ class ThermionViewerFFI extends ThermionViewer { allocator.free(ptr); } + /// + /// + /// + Future setMaterialDepthWrite( + ThermionEntity entity, int materialIndex, bool enabled) { + set_material_depth_write(_sceneManager!, entity, materialIndex, enabled); + return Future.value(); + } + Future unproject(ThermionEntity entity, Uint8List input, int inputWidth, int inputHeight, int outWidth, int outHeight) async { final outPtr = Uint8List(outWidth * outHeight * 4); From 378dede02d3fe70b57328aa5d77d5543f7baf4bf Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:53:48 +0800 Subject: [PATCH 213/232] add ThermionPickResult typedef --- .../lib/thermion_dart/viewer/shared_types/pick_result.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/pick_result.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/pick_result.dart index a3d9ac31..3daa74de 100644 --- a/thermion_dart/lib/thermion_dart/viewer/shared_types/pick_result.dart +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/pick_result.dart @@ -1,4 +1,5 @@ // "picking" means clicking/tapping on the viewport, and unprojecting the X/Y coordinate to determine whether any renderable entities were present at those coordinates. import 'package:thermion_dart/thermion_dart/viewer/shared_types/shared_types.dart'; -typedef FilamentPickResult = ({ThermionEntity entity, double x, double y}); \ No newline at end of file +typedef FilamentPickResult = ({ThermionEntity entity, double x, double y}); +typedef ThermionPickResult = FilamentPickResult; From 412d333525652b45be0334a1fff84c1186d368e5 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 14:54:18 +0800 Subject: [PATCH 214/232] add PickDelegate --- .../camera/gestures/v2/default_pick_delegate.dart | 15 +++++++++++++++ .../widgets/camera/gestures/v2/delegates.dart | 5 +++++ 2 files changed, 20 insertions(+) create mode 100644 thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pick_delegate.dart diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pick_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pick_delegate.dart new file mode 100644 index 00000000..6d3ab24c --- /dev/null +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/default_pick_delegate.dart @@ -0,0 +1,15 @@ +import 'dart:ui'; + +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; + +class DefaultPickDelegate extends PickDelegate { + final ThermionViewer _viewer; + + const DefaultPickDelegate(this._viewer); + + @override + void pick(Offset location) { + _viewer.pick(location.dx.toInt(), location.dy.toInt()); + } +} diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart index e7bf15ec..e90eedb7 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegates.dart @@ -23,3 +23,8 @@ abstract class VelocityDelegate { stopDeceleration(); } } + +abstract class PickDelegate { + const PickDelegate(); + void pick(Offset location); +} From f6c91294aa7a7929aa731d442b1b307fee7d1bd3 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 17:34:17 +0800 Subject: [PATCH 215/232] rename setLayerEnabled to setLayerVisibility, add setVisibilityLayer method --- .../viewer/ffi/thermion_dart.g.dart | 21 +++++++++-- .../viewer/ffi/thermion_viewer_ffi.dart | 13 +++++-- .../viewer/thermion_viewer_base.dart | 16 ++++++--- thermion_dart/native/include/SceneManager.hpp | 10 +++--- .../native/include/ThermionDartApi.h | 4 ++- thermion_dart/native/src/FilamentViewer.cpp | 7 +++- thermion_dart/native/src/SceneManager.cpp | 27 ++++++++++++-- thermion_dart/native/src/ThermionDartApi.cpp | 15 ++++++-- thermion_dart/test/integration_test.dart | 36 ++++++++++++++++--- 9 files changed, 124 insertions(+), 25 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart index 09dc272e..e87ac730 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart @@ -1155,10 +1155,18 @@ external void get_bounding_box_to_out( @ffi.Native, ffi.Int, ffi.Bool)>( isLeaf: true) -external void set_layer_enabled( +external void set_layer_visibility( ffi.Pointer sceneManager, int layer, - bool enabled, + bool visible, +); + +@ffi.Native, EntityId, ffi.Int)>( + isLeaf: true) +external void set_visibility_layer( + ffi.Pointer sceneManager, + int entity, + int layer, ); @ffi.Native< @@ -1203,6 +1211,15 @@ external void remove_stencil_highlight( int entity, ); +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, EntityId, ffi.Int)>(isLeaf: true) +external ffi.Pointer get_material_instance_at( + ffi.Pointer sceneManager, + int entity, + int materialIndex, +); + @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Pointer, ffi.Float)>(isLeaf: true) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index b32206e2..f015ecad 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -1920,8 +1920,17 @@ class ThermionViewerFFI extends ThermionViewer { /// /// /// - Future setLayerEnabled(int layer, bool enabled) async { - set_layer_enabled(_sceneManager!, layer, enabled); + Future setLayerVisibility(int layer, bool visible) { + set_layer_visibility(_sceneManager!, layer, visible); + return Future.value(); + } + + /// + /// + /// + Future setVisibilityLayer(ThermionEntity entity, int layer) { + set_visibility_layer(_sceneManager!, entity, layer); + return Future.value(); } /// diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart index 388d91eb..f0081542 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart @@ -545,7 +545,7 @@ abstract class ThermionViewer { Future moveCameraToAsset(ThermionEntity entity); /// - /// Enables/disables frustum culling. Currently we don't expose a method for manipulating the camera projection/culling matrices so this is your only option to deal with unwanted near/far clipping. + /// Enables/disables frustum culling. /// Future setViewFrustumCulling(bool enabled); @@ -596,14 +596,15 @@ abstract class ThermionViewer { /// Sets the material property [propertyName] under material [materialIndex] for [entity] to [value]. /// [entity] must have a Renderable attached. /// - Future setMaterialPropertyInt(ThermionEntity entity, String propertyName, - int materialIndex, int value); + Future setMaterialPropertyInt( + ThermionEntity entity, String propertyName, int materialIndex, int value); /// /// Sets the depthWrite material instance at [materialIndex] for [entity] to [enabled]. /// [entity] must have a Renderable attached. /// - Future setMaterialDepthWrite(ThermionEntity entity, int materialIndex, bool enabled); + Future setMaterialDepthWrite( + ThermionEntity entity, int materialIndex, bool enabled); /// /// Scale [entity] to fit within the unit cube. @@ -853,7 +854,12 @@ abstract class ThermionViewer { /// We place all scene assets in layer 0 (enabled by default), gizmos in layer 1 (enabled by default), world grid in layer 2 (disabled by default). /// Use this method to toggle visibility of the respective layer. /// - Future setLayerEnabled(int layer, bool enabled); + Future setLayerVisibility(int layer, bool visible); + + /// + /// Assigns [entity] to visibility layer [layer]. + /// + Future setVisibilityLayer(ThermionEntity entity, int layer); /// /// Show/hide the translation gizmo. diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index ae1eef93..95052bfe 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -55,6 +55,7 @@ namespace thermion_filament enum LAYERS { DEFAULT_ASSETS = 0, + BACKGROUND = 6, OVERLAY = 7, }; @@ -229,11 +230,8 @@ namespace thermion_filament /// /// Toggles the visibility of the given layer. - /// Layer 0 - regular scene assets - /// Layer 1 - unused - /// Layer 2 - grid /// - void setLayerEnabled(int layer, bool enabled); + void setLayerVisibility(SceneManager::LAYERS layer, bool enabled); /// /// Creates an entity with the specified geometry/material/normals and adds to the scene. @@ -284,6 +282,8 @@ namespace thermion_filament return _assetLoader->createInstance(asset); } + MaterialInstance* getMaterialInstanceAt(EntityId entityId, int materialIndex); + void setMaterialProperty(EntityId entity, int materialIndex, const char* property, float value); void setMaterialProperty(EntityId entity, int materialIndex, const char* property, int32_t value); void setMaterialProperty(EntityId entityId, int materialIndex, const char* property, filament::math::float4& value); @@ -298,6 +298,8 @@ namespace thermion_filament MaterialInstance* createUnlitMaterialInstance(); + void setVisibilityLayer(EntityId entityId, int layer); + private: gltfio::AssetLoader *_assetLoader = nullptr; const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 93314125..7d98deaf 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -269,11 +269,13 @@ extern "C" EMSCRIPTEN_KEEPALIVE void get_gizmo(void *const sceneManager, EntityId *out); EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float *minX, float *minY, float *maxX, float *maxY); - EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled); + EMSCRIPTEN_KEEPALIVE void set_layer_visibility(void *const sceneManager, int layer, bool visible); + EMSCRIPTEN_KEEPALIVE void set_visibility_layer(void *const sceneManager, EntityId entity, int layer); EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)); EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible); EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entity, float r, float g, float b); EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entity); + EMSCRIPTEN_KEEPALIVE TMaterialInstance* get_material_instance_at(void *const sceneManager, EntityId entity, int materialIndex); EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float value); EMSCRIPTEN_KEEPALIVE void set_material_property_int(void *const sceneManager, EntityId entity, int materialIndex, const char *property, int value); EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, double4 value); diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 2dd12708..73333c0f 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -584,6 +584,7 @@ namespace thermion_filament .material(0, _imageMaterial->getDefaultInstance()) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, _imageVb, _imageIb, 0, 3) + .layerMask(0xFF, 1u << SceneManager::LAYERS::BACKGROUND) .culling(false) .build(*_engine, _imageEntity); _scene->addEntity(_imageEntity); @@ -969,7 +970,11 @@ namespace thermion_filament delete vec; }, callbackData); _skybox = - filament::Skybox::Builder().environment(_skyboxTexture).build(*_engine); + filament::Skybox::Builder() + .environment(_skyboxTexture) + .build(*_engine); + + _skybox->setLayerMask(0xFF, 1u << SceneManager::LAYERS::BACKGROUND); _scene->setSkybox(_skybox); } diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 25c3b3d7..b1134a50 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -104,6 +104,7 @@ namespace thermion_filament _scene->addEntity(_gridOverlay->grid()); _view->setLayerEnabled(SceneManager::LAYERS::DEFAULT_ASSETS, true); + _view->setLayerEnabled(SceneManager::LAYERS::BACKGROUND, true); // skybox + image _view->setLayerEnabled(SceneManager::LAYERS::OVERLAY, false); // world grid + gizmo } @@ -238,6 +239,17 @@ namespace thermion_filament return eid; } + void SceneManager::setVisibilityLayer(EntityId entityId, int layer) { + auto& rm = _engine->getRenderableManager(); + auto renderable = rm.getInstance(utils::Entity::import(entityId)); + if(!renderable.isValid()) { + Log("Warning: no renderable found"); + } + + rm.setLayerMask(renderable, 0xFF, 1u << layer); + + } + EntityId SceneManager::loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances, bool keepData, int priority, int layer) { @@ -2393,7 +2405,7 @@ namespace thermion_filament return Aabb2{minX, minY, maxX, maxY}; } - void SceneManager::setLayerEnabled(int layer, bool enabled) + void SceneManager::setLayerVisibility(LAYERS layer, bool enabled) { _view->setLayerEnabled(layer, enabled); } @@ -2528,6 +2540,18 @@ EntityId SceneManager::createGeometry( return entityId; } + MaterialInstance* SceneManager::getMaterialInstanceAt(EntityId entityId, int materialIndex) { + auto entity = Entity::import(entityId); + const auto &rm = _engine->getRenderableManager(); + auto renderableInstance = rm.getInstance(entity); + if (!renderableInstance.isValid()) + { + Log("Error retrieving material instance: no renderable found for entity %d"); + return std::nullptr_t(); + } + return rm.getMaterialInstanceAt(renderableInstance, materialIndex); + } + void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char *property, float value) { auto entity = Entity::import(entityId); @@ -2620,7 +2644,6 @@ EntityId SceneManager::createGeometry( return; } auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); - materialInstance->setDepthWrite(enabled); } diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index fd7beb6a..1022102a 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -927,9 +927,14 @@ extern "C" *maxY = box.maxY; } - EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled) + EMSCRIPTEN_KEEPALIVE void set_visibility_layer(void *const sceneManager, EntityId entity, int layer) { + ((SceneManager*)sceneManager)->setVisibilityLayer(entity, layer); + } + + + EMSCRIPTEN_KEEPALIVE void set_layer_visibility(void *const sceneManager, int layer, bool visible) { - ((SceneManager *)sceneManager)->setLayerEnabled(layer, enabled); + ((SceneManager *)sceneManager)->setLayerVisibility((SceneManager::LAYERS)layer, visible); } EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr) @@ -962,9 +967,13 @@ extern "C" ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value); } + EMSCRIPTEN_KEEPALIVE TMaterialInstance* get_material_instance_at(void *const sceneManager, EntityId entity, int materialIndex) { + auto instance = ((SceneManager *)sceneManager)->getMaterialInstanceAt(entity, materialIndex); + return reinterpret_cast(instance); + } + EMSCRIPTEN_KEEPALIVE void set_material_property_int(void *const sceneManager, EntityId entity, int materialIndex, const char *property, int32_t value) { - ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value); } diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index e76a7bb3..891986e5 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -569,10 +569,9 @@ void main() async { await viewer.setMaterialDepthWrite(cube2, 0, true); await _capture(viewer, "geometry_enable_depth_write"); - // with depth write disabled on both materials, the red cube will render in front of the white cube + // with depth write disabled on the first material, the red cube will render in front of the white cube // (relying on insertion order) await viewer.setMaterialDepthWrite(cube1, 0, false); - await viewer.setMaterialDepthWrite(cube2, 0, false); await _capture(viewer, "geometry_disable_depth_write_insertion_order"); @@ -649,9 +648,9 @@ void main() async { .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8)); await viewer.setCameraPosition(0, 2, 0); await _capture(viewer, "grid_overlay_default"); - await viewer.setLayerEnabled(7, true); + await viewer.setLayerVisibility(7, true); await _capture(viewer, "grid_overlay_enabled"); - await viewer.setLayerEnabled(7, false); + await viewer.setLayerVisibility(7, false); await _capture(viewer, "grid_overlay_disabled"); }); @@ -666,9 +665,36 @@ void main() async { var buffer = File("$testDir/cube.glb").readAsBytesSync(); var model = await viewer.loadGlbFromBuffer(buffer, layer: 1); await _capture(viewer, "load_glb_from_buffer_with_layer_disabled"); - await viewer.setLayerEnabled(1, true); + await viewer.setLayerVisibility(1, true); await _capture(viewer, "load_glb_from_buffer_with_layer_enabled"); }); + + test('change layer visibility at runtime', () async { + var viewer = await createViewer(); + + await viewer.setBackgroundColor(1, 0, 1, 1); + await viewer.setCameraPosition(0, 2, 5); + await viewer + .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + + var cube = await viewer.createGeometry(GeometryHelper.cube()); + await _capture(viewer, "change_layer_visibility_at_runtime_default"); + + // all entities set to layer 0 by default, so this should now be invisible + await viewer.setLayerVisibility(0, false); + await _capture( + viewer, "change_layer_visibility_at_runtime_layer0_invisible"); + + // now change the visibility layer to 5, should be invisible + await viewer.setVisibilityLayer(cube, 5); + await _capture( + viewer, "change_layer_visibility_at_runtime_layer5_invisible"); + + // now toggle layer 5 visibility, cube should now be visible + await viewer.setLayerVisibility(5, true); + await _capture( + viewer, "change_layer_visibility_at_runtime_layer5_visible"); + }); }); // test('point light', () async { From 7cb308059643d35be95fcec73618e067bf869f95 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 18:18:08 +0800 Subject: [PATCH 216/232] move MaterialInstance methods to own class --- .../viewer/ffi/thermion_dart.g.dart | 32 ++++++--- .../viewer/ffi/thermion_viewer_ffi.dart | 31 ++++++--- .../viewer/shared_types/material.dart | 9 +-- .../viewer/thermion_viewer_base.dart | 15 ++--- .../viewer/thermion_viewer_stub.dart | 24 +++++++ .../viewer/web/thermion_viewer_wasm.dart | 2 +- thermion_dart/native/include/SceneManager.hpp | 1 - .../native/include/ThermionDartApi.h | 7 +- thermion_dart/native/src/SceneManager.cpp | 16 +---- thermion_dart/native/src/ThermionDartApi.cpp | 11 ++-- thermion_dart/test/integration_test.dart | 66 ++++++++++--------- 11 files changed, 128 insertions(+), 86 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart index e87ac730..faee88ce 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart @@ -1211,15 +1211,6 @@ external void remove_stencil_highlight( int entity, ); -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer, EntityId, ffi.Int)>(isLeaf: true) -external ffi.Pointer get_material_instance_at( - ffi.Pointer sceneManager, - int entity, - int materialIndex, -); - @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Pointer, ffi.Float)>(isLeaf: true) @@ -1311,6 +1302,29 @@ external void apply_texture_to_material( int materialIndex, ); +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, EntityId, ffi.Int)>(isLeaf: true) +external ffi.Pointer get_material_instance_at( + ffi.Pointer sceneManager, + int entity, + int materialIndex, +); + +@ffi.Native, ffi.Bool)>( + isLeaf: true) +external void MaterialInstance_setDepthWrite( + ffi.Pointer materialInstance, + bool enabled, +); + +@ffi.Native, ffi.Bool)>( + isLeaf: true) +external void MaterialInstance_setDepthCulling( + ffi.Pointer materialInstance, + bool enabled, +); + @ffi.Native< ffi.Void Function( ffi.Pointer, diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index f015ecad..e82a6a8c 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -1982,15 +1982,6 @@ class ThermionViewerFFI extends ThermionViewer { allocator.free(ptr); } - /// - /// - /// - Future setMaterialDepthWrite( - ThermionEntity entity, int materialIndex, bool enabled) { - set_material_depth_write(_sceneManager!, entity, materialIndex, enabled); - return Future.value(); - } - Future unproject(ThermionEntity entity, Uint8List input, int inputWidth, int inputHeight, int outWidth, int outHeight) async { final outPtr = Uint8List(outWidth * outHeight * 4); @@ -2132,6 +2123,18 @@ class ThermionViewerFFI extends ThermionViewer { allocator.free(ptr); return Future.value(); } + + /// + /// + /// + Future getMaterialInstanceAt( + ThermionEntity entity, int index) async { + final instance = get_material_instance_at(_sceneManager!, entity, index); + if (instance == nullptr) { + return null; + } + return ThermionFFIMaterialInstance(instance); + } } class ThermionFFITexture extends ThermionTexture { @@ -2144,4 +2147,14 @@ class ThermionFFIMaterialInstance extends MaterialInstance { final Pointer _pointer; ThermionFFIMaterialInstance(this._pointer); + + @override + Future setDepthCullingEnabled(bool enabled) async { + MaterialInstance_setDepthCulling(this._pointer, enabled); + } + + @override + Future setDepthWriteEnabled(bool enabled) async { + MaterialInstance_setDepthWrite(this._pointer, enabled); + } } diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/material.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/material.dart index fad70382..8fad022a 100644 --- a/thermion_dart/lib/thermion_dart/viewer/shared_types/material.dart +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/material.dart @@ -1,9 +1,6 @@ abstract class MaterialInstance { - + Future setDepthWriteEnabled(bool enabled); + Future setDepthCullingEnabled(bool enabled); } -enum AlphaMode { - OPAQUE, - MASK, - BLEND -} \ No newline at end of file +enum AlphaMode { OPAQUE, MASK, BLEND } diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart index f0081542..a67dee2c 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart @@ -599,13 +599,6 @@ abstract class ThermionViewer { Future setMaterialPropertyInt( ThermionEntity entity, String propertyName, int materialIndex, int value); - /// - /// Sets the depthWrite material instance at [materialIndex] for [entity] to [enabled]. - /// [entity] must have a Renderable attached. - /// - Future setMaterialDepthWrite( - ThermionEntity entity, int materialIndex, bool enabled); - /// /// Scale [entity] to fit within the unit cube. /// @@ -858,7 +851,7 @@ abstract class ThermionViewer { /// /// Assigns [entity] to visibility layer [layer]. - /// + /// Future setVisibilityLayer(ThermionEntity entity, int layer); /// @@ -944,4 +937,10 @@ abstract class ThermionViewer { /// /// Future createUnlitMaterialInstance(); + + /// + /// + /// + Future getMaterialInstanceAt( + ThermionEntity entity, int index); } diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart index b9465660..7d32a6af 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart @@ -928,6 +928,30 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement setMaterialPropertyInt throw UnimplementedError(); } + + @override + Future getMaterialInstanceAt(ThermionEntity entity, int index) { + // TODO: implement getMaterialInstanceAt + throw UnimplementedError(); + } + + @override + Future setLayerVisibility(int layer, bool visible) { + // TODO: implement setLayerVisibility + throw UnimplementedError(); + } + + @override + Future setMaterialDepthWrite(ThermionEntity entity, int materialIndex, bool enabled) { + // TODO: implement setMaterialDepthWrite + throw UnimplementedError(); + } + + @override + Future setVisibilityLayer(ThermionEntity entity, int layer) { + // TODO: implement setVisibilityLayer + throw UnimplementedError(); + } } diff --git a/thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_wasm.dart b/thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_wasm.dart index 0ebb0399..8b42765d 100644 --- a/thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_wasm.dart +++ b/thermion_dart/lib/thermion_dart/viewer/web/thermion_viewer_wasm.dart @@ -2186,7 +2186,7 @@ class ThermionViewerWasm implements ThermionViewer { @override Future setLayerEnabled(int layer, bool enabled) async { _module!.ccall( - "set_layer_enabled", + "set_layer_visibility", "void", [ "void*".toJS, diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 95052bfe..c5b58b93 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -287,7 +287,6 @@ namespace thermion_filament void setMaterialProperty(EntityId entity, int materialIndex, const char* property, float value); void setMaterialProperty(EntityId entity, int materialIndex, const char* property, int32_t value); void setMaterialProperty(EntityId entityId, int materialIndex, const char* property, filament::math::float4& value); - void setMaterialDepthWrite(EntityId entityId, int materialIndex, bool enabled); MaterialInstance* createUbershaderMaterialInstance(MaterialKey key); void destroy(MaterialInstance* materialInstance); diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 7d98deaf..38ea24f4 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -275,7 +275,6 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible); EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entity, float r, float g, float b); EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entity); - EMSCRIPTEN_KEEPALIVE TMaterialInstance* get_material_instance_at(void *const sceneManager, EntityId entity, int materialIndex); EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float value); EMSCRIPTEN_KEEPALIVE void set_material_property_int(void *const sceneManager, EntityId entity, int materialIndex, const char *property, int value); EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, double4 value); @@ -285,6 +284,12 @@ extern "C" EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void *const texture); EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(void *const sceneManager, EntityId entity, void *const texture, const char *parameterName, int materialIndex); + EMSCRIPTEN_KEEPALIVE TMaterialInstance* get_material_instance_at(void *const sceneManager, EntityId entity, int materialIndex); + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance* materialInstance, bool enabled); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance* materialInstance, bool enabled); + + #ifdef __cplusplus } #endif diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index b1134a50..1b659679 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -2633,20 +2633,6 @@ EntityId SceneManager::createGeometry( auto instance = _unlitMaterialProvider->createMaterialInstance(nullptr, &uvmap); return instance; } - - void SceneManager::setMaterialDepthWrite(EntityId entityId, int materialIndex, bool enabled) { - auto entity = Entity::import(entityId); - const auto &rm = _engine->getRenderableManager(); - auto renderableInstance = rm.getInstance(entity); - if (!renderableInstance.isValid()) - { - Log("Error setting material property for entity %d: no renderable"); - return; - } - auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex); - materialInstance->setDepthWrite(enabled); - } - - + } // namespace thermion_filament diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 1022102a..b3b96b8b 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -987,10 +987,6 @@ extern "C" ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, filamentValue); } - EMSCRIPTEN_KEEPALIVE void set_material_depth_write(void *const sceneManager, EntityId entity, int materialIndex, bool enabled) { - ((SceneManager *)sceneManager)->setMaterialDepthWrite(entity, materialIndex, enabled); - } - EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const viewer, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight) { ((FilamentViewer *)viewer)->unprojectTexture(entity, input, inputWidth, inputHeight, out, outWidth, outHeight); @@ -1054,4 +1050,11 @@ EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_unlit_material_instance(void *con EMSCRIPTEN_KEEPALIVE void destroy_material_instance(void *const sceneManager, TMaterialInstance *instance) { ((SceneManager *)sceneManager)->destroy(reinterpret_cast(instance)); } + +EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance* materialInstance, bool enabled) { + reinterpret_cast(materialInstance)->setDepthWrite(enabled); +} +EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance* materialInstance, bool enabled) { + reinterpret_cast(materialInstance)->setDepthCulling(enabled); +} } diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index 891986e5..22d130ef 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -440,6 +440,40 @@ void main() async { }); }); + group("MaterialInstance", () { + test('disable depth write', () async { + var viewer = await createViewer(); + await viewer.setBackgroundColor(1.0, 0.0, 0.0, 1.0); + await viewer.setCameraPosition(0, 0, 6); + await viewer.addDirectLight( + DirectLight.sun(direction: Vector3(0, 0, -1)..normalize())); + + final cube1 = await viewer.createGeometry(GeometryHelper.cube()); + var materialInstance = await viewer.getMaterialInstanceAt(cube1, 0); + + final cube2 = await viewer.createGeometry(GeometryHelper.cube()); + await viewer.setMaterialPropertyFloat4( + cube2, "baseColorFactor", 0, 0, 1, 0, 1); + await viewer.setPosition(cube2, 1.0, 0.0, -1.0); + + expect(materialInstance, isNotNull); + + // with depth write enabled on both materials, cube2 renders behind the white cube + await _capture(viewer, "material_instance_depth_write_enabled"); + + // if we disable depth write on cube1, then cube2 will always appear in front + // (relying on insertion order) + materialInstance!.setDepthWriteEnabled(false); + await _capture(viewer, "material_instance_depth_write_disabled"); + + // set priority for the cube1 cube to 7 (render) last, cube1 renders in front + await viewer.setPriority(cube1, 7); + await _capture(viewer, "material_instance_depth_write_disabled_with_priority"); + }); + }); + + + // test('create instance from glb when keepData is true', () async { // var model = await viewer.loadGlb("$testDir/cube.glb", keepData: true); // await viewer.transformToUnitCube(model); @@ -547,38 +581,6 @@ void main() async { await viewer.setMaterialPropertyFloat(cube, "roughnessFactor", 0, 0.0); await _capture(viewer, "set_material_roughness_post"); }); - - test('enable/disable depth write for custom geometry', () async { - var viewer = await createViewer(); - - await viewer.setCameraPosition(0, 0, 6); - await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); - var light = - await viewer.addLight(LightType.SUN, 6500, 100000, 0, 0, 0, 0, 0, -1); - - final cube1 = await viewer.createGeometry(GeometryHelper.cube()); - await viewer.setMaterialPropertyFloat4( - cube1, "baseColorFactor", 0, 1.0, 1.0, 1.0, 1); - final cube2 = await viewer.createGeometry(GeometryHelper.cube()); - await viewer.setPosition(cube2, 1.0, 0.0, -1.0); - await viewer.setMaterialPropertyFloat4( - cube2, "baseColorFactor", 0, 1.0, 0, 0, 1); - - // with depth write enabled on both materials, the red cube will render behind the white cube - await viewer.setMaterialDepthWrite(cube1, 0, true); - await viewer.setMaterialDepthWrite(cube2, 0, true); - await _capture(viewer, "geometry_enable_depth_write"); - - // with depth write disabled on the first material, the red cube will render in front of the white cube - // (relying on insertion order) - await viewer.setMaterialDepthWrite(cube1, 0, false); - - await _capture(viewer, "geometry_disable_depth_write_insertion_order"); - - // if we set priority for the black cube to 7 (render) last, red cube will render behind the white cube - await viewer.setPriority(cube1, 7); - await _capture(viewer, "geometry_disable_depth_write_priority"); - }); }); group("transforms & parenting", () { From ddbb4ec5c6e218ac4d7c3d6ac00d1524799b020e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 20 Sep 2024 18:31:20 +0800 Subject: [PATCH 217/232] rename CameraPtr to TCamera and use named arguments for setCameraLensProjection --- .../viewer/ffi/thermion_dart.g.dart | 66 +++++++++---------- .../viewer/ffi/thermion_viewer_ffi.dart | 9 +-- .../viewer/thermion_viewer_base.dart | 9 ++- .../native/include/APIBoundaryTypes.h | 2 +- .../native/include/ThermionDartApi.h | 32 ++++----- thermion_dart/native/src/ThermionDartApi.cpp | 34 +++++----- thermion_dart/test/integration_test.dart | 2 +- 7 files changed, 77 insertions(+), 77 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart index faee88ce..55dddb20 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart @@ -766,73 +766,73 @@ external void set_scale( @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void set_camera_exposure( - ffi.Pointer camera, + ffi.Pointer camera, double aperture, double shutterSpeed, double sensitivity, ); -@ffi.Native, double4x4)>(isLeaf: true) +@ffi.Native, double4x4)>(isLeaf: true) external void set_camera_model_matrix( - ffi.Pointer camera, + ffi.Pointer camera, double4x4 matrix, ); -@ffi.Native Function(ffi.Pointer, EntityId)>( +@ffi.Native Function(ffi.Pointer, EntityId)>( isLeaf: true) -external ffi.Pointer get_camera( +external ffi.Pointer get_camera( ffi.Pointer viewer, int entity, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external double get_camera_focal_length( - ffi.Pointer camera, + ffi.Pointer camera, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external double4x4 get_camera_model_matrix( - ffi.Pointer camera, + ffi.Pointer camera, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external double4x4 get_camera_view_matrix( - ffi.Pointer camera, + ffi.Pointer camera, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external double4x4 get_camera_projection_matrix( - ffi.Pointer camera, + ffi.Pointer camera, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external double4x4 get_camera_culling_projection_matrix( - ffi.Pointer camera, + ffi.Pointer camera, ); -@ffi.Native Function(ffi.Pointer)>( +@ffi.Native Function(ffi.Pointer)>( isLeaf: true) external ffi.Pointer get_camera_frustum( - ffi.Pointer camera, + ffi.Pointer camera, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, double4x4, ffi.Double, + ffi.Void Function(ffi.Pointer, double4x4, ffi.Double, ffi.Double)>(isLeaf: true) external void set_camera_projection_matrix( - ffi.Pointer camera, + ffi.Pointer camera, double4x4 matrix, double near, double far, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, + ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, ffi.Double, ffi.Bool)>(isLeaf: true) external void set_camera_projection_from_fov( - ffi.Pointer camera, + ffi.Pointer camera, double fovInDegrees, double aspect, double near, @@ -840,36 +840,36 @@ external void set_camera_projection_from_fov( bool horizontal, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external double get_camera_near( - ffi.Pointer camera, + ffi.Pointer camera, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external double get_camera_culling_far( - ffi.Pointer camera, + ffi.Pointer camera, ); -@ffi.Native, ffi.Bool)>(isLeaf: true) +@ffi.Native, ffi.Bool)>(isLeaf: true) external double get_camera_fov( - ffi.Pointer camera, + ffi.Pointer camera, bool horizontal, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, + ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, ffi.Double)>(isLeaf: true) external void set_camera_lens_projection( - ffi.Pointer camera, + ffi.Pointer camera, double near, double far, double aspect, double focalLength, ); -@ffi.Native, ffi.Float)>(isLeaf: true) +@ffi.Native, ffi.Float)>(isLeaf: true) external void set_camera_focus_distance( - ffi.Pointer camera, + ffi.Pointer camera, double focusDistance, ); @@ -1848,7 +1848,7 @@ external void unproject_texture_ffi( ffi.Pointer> callback, ); -final class CameraPtr extends ffi.Opaque {} +final class TCamera extends ffi.Opaque {} final class TMaterialInstance extends ffi.Opaque {} diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index e82a6a8c..5b100b5c 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -18,10 +18,6 @@ const ThermionEntity _FILAMENT_ASSET_ERROR = 0; typedef RenderCallback = Pointer)>>; -double kNear = 0.05; -double kFar = 1000.0; -double kFocalLength = 28.0; - class ThermionViewerFFI extends ThermionViewer { final _logger = Logger("ThermionViewerFFI"); @@ -1354,8 +1350,9 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future setCameraLensProjection( - double near, double far, double aspect, double focalLength) async { + Future setCameraLensProjection({double near = kNear, double far = kFar, double? aspect, + double focalLength = kFocalLength}) async { + aspect ??= viewportDimensions.$1 / viewportDimensions.$2; var mainCamera = get_camera(_viewer!, get_main_camera(_viewer!)); set_camera_lens_projection(mainCamera, near, far, aspect, focalLength); } diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart index a67dee2c..105b9897 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart @@ -1,5 +1,4 @@ import 'package:thermion_dart/thermion_dart/viewer/events.dart'; -import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart'; import 'shared_types/shared_types.dart'; export 'shared_types/shared_types.dart'; @@ -11,6 +10,10 @@ import 'package:vector_math/vector_math_64.dart'; import 'dart:async'; import 'package:animation_tools_dart/animation_tools_dart.dart'; +const double kNear = 0.05; +const double kFar = 1000.0; +const double kFocalLength = 28.0; + abstract class ThermionViewer { /// /// A Future that resolves when the underlying rendering context has been successfully created. @@ -490,8 +493,8 @@ abstract class ThermionViewer { /// /// /// - Future setCameraLensProjection( - double near, double far, double aspect, double focalLength); + Future setCameraLensProjection({double near = kNear, double far = kFar, double? aspect, + double focalLength = kFocalLength}); /// /// Sets the focus distance for the camera. diff --git a/thermion_dart/native/include/APIBoundaryTypes.h b/thermion_dart/native/include/APIBoundaryTypes.h index b811c330..e4f7d730 100644 --- a/thermion_dart/native/include/APIBoundaryTypes.h +++ b/thermion_dart/native/include/APIBoundaryTypes.h @@ -9,7 +9,7 @@ extern "C" typedef int32_t EntityId; typedef int32_t _ManipulatorMode; - typedef struct CameraPtr CameraPtr; + typedef struct TCamera TCamera; typedef struct TMaterialInstance TMaterialInstance; struct TMaterialKey { diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 38ea24f4..a9108025 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -208,22 +208,22 @@ extern "C" // Camera methods EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(const void *const viewer, bool enabled); - EMSCRIPTEN_KEEPALIVE void set_camera_exposure(CameraPtr *camera, float aperture, float shutterSpeed, float sensitivity); - EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(CameraPtr *camera, double4x4 matrix); - EMSCRIPTEN_KEEPALIVE CameraPtr *get_camera(const void *const viewer, EntityId entity); - EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(CameraPtr *const camera); - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_model_matrix(CameraPtr *const camera); - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_view_matrix(CameraPtr *const camera); - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_projection_matrix(CameraPtr *const camera); - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_culling_projection_matrix(CameraPtr *const camera); - EMSCRIPTEN_KEEPALIVE const double *const get_camera_frustum(CameraPtr *const camera); - EMSCRIPTEN_KEEPALIVE void set_camera_projection_matrix(CameraPtr *camera, double4x4 matrix, double near, double far); - EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(CameraPtr *camera, double fovInDegrees, double aspect, double near, double far, bool horizontal); - EMSCRIPTEN_KEEPALIVE double get_camera_near(CameraPtr *camera); - EMSCRIPTEN_KEEPALIVE double get_camera_culling_far(CameraPtr *camera); - EMSCRIPTEN_KEEPALIVE float get_camera_fov(CameraPtr *camera, bool horizontal); - EMSCRIPTEN_KEEPALIVE void set_camera_lens_projection(CameraPtr *camera, double near, double far, double aspect, double focalLength); - EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(CameraPtr *camera, float focusDistance); + EMSCRIPTEN_KEEPALIVE void set_camera_exposure(TCamera *camera, float aperture, float shutterSpeed, float sensitivity); + EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(TCamera *camera, double4x4 matrix); + EMSCRIPTEN_KEEPALIVE TCamera *get_camera(const void *const viewer, EntityId entity); + EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(TCamera *const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_model_matrix(TCamera *const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_view_matrix(TCamera *const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_projection_matrix(TCamera *const camera); + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_culling_projection_matrix(TCamera *const camera); + EMSCRIPTEN_KEEPALIVE const double *const get_camera_frustum(TCamera *const camera); + EMSCRIPTEN_KEEPALIVE void set_camera_projection_matrix(TCamera *camera, double4x4 matrix, double near, double far); + EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(TCamera *camera, double fovInDegrees, double aspect, double near, double far, bool horizontal); + EMSCRIPTEN_KEEPALIVE double get_camera_near(TCamera *camera); + EMSCRIPTEN_KEEPALIVE double get_camera_culling_far(TCamera *camera); + EMSCRIPTEN_KEEPALIVE float get_camera_fov(TCamera *camera, bool horizontal); + EMSCRIPTEN_KEEPALIVE void set_camera_lens_projection(TCamera *camera, double near, double far, double aspect, double focalLength); + EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(TCamera *camera, float focusDistance); EMSCRIPTEN_KEEPALIVE void set_camera_manipulator_options(const void *const viewer, _ManipulatorMode mode, double orbitSpeedX, double orbitSpeedY, double zoomSpeed); EMSCRIPTEN_KEEPALIVE int hide_mesh(void *sceneManager, EntityId entity, const char *meshName); diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index b3b96b8b..770ec434 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -217,80 +217,80 @@ extern "C" return ((FilamentViewer *)viewer)->setCamera(asset, nodeName); } - EMSCRIPTEN_KEEPALIVE float get_camera_fov(CameraPtr *camera, bool horizontal) + EMSCRIPTEN_KEEPALIVE float get_camera_fov(TCamera *camera, bool horizontal) { auto cam = reinterpret_cast(camera); return cam->getFieldOfViewInDegrees(horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); } - EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(CameraPtr *const camera) + EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(TCamera *const camera) { auto cam = reinterpret_cast(camera); return cam->getFocalLength(); } - EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(CameraPtr *camera, double fovInDegrees, double aspect, double near, double far, bool horizontal) + EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(TCamera *camera, double fovInDegrees, double aspect, double near, double far, bool horizontal) { auto cam = reinterpret_cast(camera); cam->setProjection(fovInDegrees, aspect, near, far, horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); } - EMSCRIPTEN_KEEPALIVE CameraPtr *get_camera(const void *const viewer, EntityId entity) + EMSCRIPTEN_KEEPALIVE TCamera *get_camera(const void *const viewer, EntityId entity) { auto filamentCamera = ((FilamentViewer *)viewer)->getCamera(entity); - return reinterpret_cast(filamentCamera); + return reinterpret_cast(filamentCamera); } - double4x4 get_camera_model_matrix(CameraPtr *camera) + double4x4 get_camera_model_matrix(TCamera *camera) { const auto &mat = reinterpret_cast(camera)->getModelMatrix(); return convert_mat4_to_double4x4(mat); } - double4x4 get_camera_view_matrix(CameraPtr *camera) + double4x4 get_camera_view_matrix(TCamera *camera) { const auto &mat = reinterpret_cast(camera)->getViewMatrix(); return convert_mat4_to_double4x4(mat); } - double4x4 get_camera_projection_matrix(CameraPtr *camera) + double4x4 get_camera_projection_matrix(TCamera *camera) { const auto &mat = reinterpret_cast(camera)->getProjectionMatrix(); return convert_mat4_to_double4x4(mat); } - double4x4 get_camera_culling_projection_matrix(CameraPtr *camera) + double4x4 get_camera_culling_projection_matrix(TCamera *camera) { const auto &mat = reinterpret_cast(camera)->getCullingProjectionMatrix(); return convert_mat4_to_double4x4(mat); } - void set_camera_projection_matrix(CameraPtr *camera, double4x4 matrix, double near, double far) + void set_camera_projection_matrix(TCamera *camera, double4x4 matrix, double near, double far) { auto cam = reinterpret_cast(camera); const auto &mat = convert_double4x4_to_mat4(matrix); cam->setCustomProjection(mat, near, far); } - void set_camera_lens_projection(CameraPtr *camera, double near, double far, double aspect, double focalLength) + void set_camera_lens_projection(TCamera *camera, double near, double far, double aspect, double focalLength) { auto cam = reinterpret_cast(camera); cam->setLensProjection(focalLength, aspect, near, far); } - double get_camera_near(CameraPtr *camera) + double get_camera_near(TCamera *camera) { auto cam = reinterpret_cast(camera); return cam->getNear(); } - double get_camera_culling_far(CameraPtr *camera) + double get_camera_culling_far(TCamera *camera) { auto cam = reinterpret_cast(camera); return cam->getCullingFar(); } - const double *const get_camera_frustum(CameraPtr *camera) + const double *const get_camera_frustum(TCamera *camera) { const auto frustum = reinterpret_cast(camera)->getFrustum(); @@ -319,19 +319,19 @@ extern "C" ((FilamentViewer *)viewer)->setViewFrustumCulling(enabled); } - EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(CameraPtr *camera, float distance) + EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(TCamera *camera, float distance) { auto *cam = reinterpret_cast(camera); cam->setFocusDistance(distance); } - EMSCRIPTEN_KEEPALIVE void set_camera_exposure(CameraPtr *camera, float aperture, float shutterSpeed, float sensitivity) + EMSCRIPTEN_KEEPALIVE void set_camera_exposure(TCamera *camera, float aperture, float shutterSpeed, float sensitivity) { auto *cam = reinterpret_cast(camera); cam->setExposure(aperture, shutterSpeed, sensitivity); } - EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(CameraPtr *camera, double4x4 matrix) + EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(TCamera *camera, double4x4 matrix) { auto *cam = reinterpret_cast(camera); const filament::math::mat4 &mat = convert_double4x4_to_mat4(matrix); diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index 22d130ef..d940f47e 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -92,7 +92,7 @@ void main() async { print(frustum.plane5.normal); print(frustum.plane5.constant); - await viewer.setCameraLensProjection(10.0, 1000.0, 1.0, 28.0); + await viewer.setCameraLensProjection(near:10.0, far:1000.0, aspect:1.0, focalLength:28.0); frustum = await viewer.getCameraFrustum(); print(frustum.plane5.normal); print(frustum.plane5.constant); From b5a79967695b5617ca96b266e2c1ba119734aa5e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 21 Sep 2024 10:18:36 +0800 Subject: [PATCH 218/232] add Dart Camera type --- .../lib/thermion_dart/viewer/shared_types/camera.dart | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart new file mode 100644 index 00000000..5854c732 --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart @@ -0,0 +1,6 @@ +// abstract class Camera { +// Future setProjectionMatrixWithCulling(Matrix4 projectionMatrix, Matrix4 projectionMatrixForCUlling); +// Future setDepthCullingEnabled(bool enabled); +// } + +enum AlphaMode { OPAQUE, MASK, BLEND } From 57872d2e40883ac36eeda1ef837595e886e7fcfa Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 21 Sep 2024 10:21:46 +0800 Subject: [PATCH 219/232] rename from *FFI to *RenderThread, return bool from render() to check frame timings, update render loop to wait on condition variable, add requestFrame() method --- thermion_dart/ffigen/native.yaml | 4 +- .../viewer/ffi/thermion_dart.g.dart | 114 ++- .../viewer/ffi/thermion_viewer_ffi.dart | 150 +-- .../viewer/thermion_viewer_base.dart | 9 +- .../viewer/thermion_viewer_stub.dart | 16 +- .../native/include/FilamentViewer.hpp | 2 +- .../native/include/ThermionDartApi.h | 4 +- .../native/include/ThermionDartFFIApi.h | 125 --- .../include/ThermionDartRenderThreadApi.h | 126 +++ thermion_dart/native/src/FilamentViewer.cpp | 5 +- thermion_dart/native/src/ThermionDartApi.cpp | 8 +- .../native/src/ThermionDartFFIApi.cpp | 875 ------------------ .../src/ThermionDartRenderThreadApi.cpp | 847 +++++++++++++++++ thermion_dart/test/integration_test.dart | 20 +- 14 files changed, 1170 insertions(+), 1135 deletions(-) delete mode 100644 thermion_dart/native/include/ThermionDartFFIApi.h create mode 100644 thermion_dart/native/include/ThermionDartRenderThreadApi.h delete mode 100644 thermion_dart/native/src/ThermionDartFFIApi.cpp create mode 100644 thermion_dart/native/src/ThermionDartRenderThreadApi.cpp diff --git a/thermion_dart/ffigen/native.yaml b/thermion_dart/ffigen/native.yaml index 2062f1ab..67ed918f 100644 --- a/thermion_dart/ffigen/native.yaml +++ b/thermion_dart/ffigen/native.yaml @@ -1,11 +1,11 @@ output: '../lib/thermion_dart/viewer/ffi/thermion_dart.g.dart' headers: entry-points: - - '../native/include/ThermionDartFFIApi.h' + - '../native/include/ThermionDartRenderThreadApi.h' - '../native/include/ThermionDartApi.h' - '../native/include/ResourceBuffer.h' include-directives: - - '../native/include/ThermionDartFFIApi.h' + - '../native/include/ThermionDartRenderThreadApi.h' - '../native/include/ThermionDartApi.h' - '../native/include/ResourceBuffer.h' - '../native/include/APIBoundaryTypes.h' diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart index 55dddb20..11d59ae3 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart @@ -819,8 +819,8 @@ external ffi.Pointer get_camera_frustum( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, double4x4, ffi.Double, - ffi.Double)>(isLeaf: true) + ffi.Void Function( + ffi.Pointer, double4x4, ffi.Double, ffi.Double)>(isLeaf: true) external void set_camera_projection_matrix( ffi.Pointer camera, double4x4 matrix, @@ -829,8 +829,8 @@ external void set_camera_projection_matrix( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, - ffi.Double, ffi.Double, ffi.Bool)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, + ffi.Double, ffi.Bool)>(isLeaf: true) external void set_camera_projection_from_fov( ffi.Pointer camera, double fovInDegrees, @@ -857,8 +857,8 @@ external double get_camera_fov( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, - ffi.Double, ffi.Double)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, + ffi.Double)>(isLeaf: true) external void set_camera_lens_projection( ffi.Pointer camera, double near, @@ -884,6 +884,17 @@ external void set_camera_manipulator_options( double zoomSpeed, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, double4x4, double4x4, ffi.Double, + ffi.Double)>(isLeaf: true) +external void Camera_setCustomProjectionWithCulling( + ffi.Pointer camera, + double4x4 projectionMatrix, + double4x4 projectionMatrixForCulling, + double near, + double far, +); + @ffi.Native< ffi.Int Function( ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) @@ -1339,7 +1350,7 @@ external void MaterialInstance_setDepthCulling( ffi.NativeFunction< ffi.Void Function( ffi.Pointer viewer)>>)>(isLeaf: true) -external void create_filament_viewer_ffi( +external void create_filament_viewer_render_thread( ffi.Pointer context, ffi.Pointer platform, ffi.Pointer uberArchivePath, @@ -1361,7 +1372,7 @@ external void create_filament_viewer_ffi( ffi.Uint32, ffi.Uint32, ffi.Pointer>)>(isLeaf: true) -external void create_swap_chain_ffi( +external void create_swap_chain_render_thread( ffi.Pointer viewer, ffi.Pointer surface, int width, @@ -1372,7 +1383,7 @@ external void create_swap_chain_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer>)>(isLeaf: true) -external void destroy_swap_chain_ffi( +external void destroy_swap_chain_render_thread( ffi.Pointer viewer, ffi.Pointer> onComplete, ); @@ -1380,7 +1391,7 @@ external void destroy_swap_chain_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32, ffi.Pointer>)>(isLeaf: true) -external void create_render_target_ffi( +external void create_render_target_render_thread( ffi.Pointer viewer, int nativeTextureId, int width, @@ -1389,19 +1400,19 @@ external void create_render_target_ffi( ); @ffi.Native)>(isLeaf: true) -external void destroy_filament_viewer_ffi( +external void destroy_filament_viewer_render_thread( ffi.Pointer viewer, ); @ffi.Native)>(isLeaf: true) -external void render_ffi( +external void render_render_thread( ffi.Pointer viewer, ); @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Pointer>)>(isLeaf: true) -external void capture_ffi( +external void capture_render_thread( ffi.Pointer viewer, ffi.Pointer out, ffi.Pointer> onComplete, @@ -1416,14 +1427,19 @@ external FilamentRenderCallback make_render_callback_fn_pointer( @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Bool, ffi.Pointer>)>(isLeaf: true) -external void set_rendering_ffi( +external void set_rendering_render_thread( ffi.Pointer viewer, bool rendering, ffi.Pointer> onComplete, ); +@ffi.Native)>(isLeaf: true) +external void request_frame_render_thread( + ffi.Pointer viewer, +); + @ffi.Native, ffi.Float)>(isLeaf: true) -external void set_frame_interval_ffi( +external void set_frame_interval_render_thread( ffi.Pointer viewer, double frameInterval, ); @@ -1431,7 +1447,7 @@ external void set_frame_interval_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) -external void set_background_color_ffi( +external void set_background_color_render_thread( ffi.Pointer viewer, double r, double g, @@ -1440,14 +1456,14 @@ external void set_background_color_ffi( ); @ffi.Native)>(isLeaf: true) -external void clear_background_image_ffi( +external void clear_background_image_render_thread( ffi.Pointer viewer, ); @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Bool, ffi.Pointer>)>(isLeaf: true) -external void set_background_image_ffi( +external void set_background_image_render_thread( ffi.Pointer viewer, ffi.Pointer path, bool fillHeight, @@ -1457,7 +1473,7 @@ external void set_background_image_ffi( @ffi.Native< ffi.Void Function( ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) -external void set_background_image_position_ffi( +external void set_background_image_position_render_thread( ffi.Pointer viewer, double x, double y, @@ -1465,13 +1481,13 @@ external void set_background_image_position_ffi( ); @ffi.Native, ffi.Int)>(isLeaf: true) -external void set_tone_mapping_ffi( +external void set_tone_mapping_render_thread( ffi.Pointer viewer, int toneMapping, ); @ffi.Native, ffi.Float)>(isLeaf: true) -external void set_bloom_ffi( +external void set_bloom_render_thread( ffi.Pointer viewer, double strength, ); @@ -1479,7 +1495,7 @@ external void set_bloom_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Pointer>)>(isLeaf: true) -external void load_skybox_ffi( +external void load_skybox_render_thread( ffi.Pointer viewer, ffi.Pointer skyboxPath, ffi.Pointer> onComplete, @@ -1488,19 +1504,19 @@ external void load_skybox_ffi( @ffi.Native< ffi.Void Function( ffi.Pointer, ffi.Pointer, ffi.Float)>(isLeaf: true) -external void load_ibl_ffi( +external void load_ibl_render_thread( ffi.Pointer viewer, ffi.Pointer iblPath, double intensity, ); @ffi.Native)>(isLeaf: true) -external void remove_skybox_ffi( +external void remove_skybox_render_thread( ffi.Pointer viewer, ); @ffi.Native)>(isLeaf: true) -external void remove_ibl_ffi( +external void remove_ibl_render_thread( ffi.Pointer viewer, ); @@ -1525,7 +1541,7 @@ external void remove_ibl_ffi( ffi.Bool, ffi.Pointer>)>( isLeaf: true) -external void add_light_ffi( +external void add_light_render_thread( ffi.Pointer viewer, int type, double colour, @@ -1547,13 +1563,13 @@ external void add_light_ffi( ); @ffi.Native, EntityId)>(isLeaf: true) -external void remove_light_ffi( +external void remove_light_render_thread( ffi.Pointer viewer, int entityId, ); @ffi.Native)>(isLeaf: true) -external void clear_lights_ffi( +external void clear_lights_render_thread( ffi.Pointer viewer, ); @@ -1565,7 +1581,7 @@ external void clear_lights_ffi( ffi.Bool, ffi.Pointer>)>( isLeaf: true) -external void load_glb_ffi( +external void load_glb_render_thread( ffi.Pointer sceneManager, ffi.Pointer assetPath, int numInstances, @@ -1584,7 +1600,7 @@ external void load_glb_ffi( ffi.Int, ffi.Pointer>)>( isLeaf: true) -external void load_glb_from_buffer_ffi( +external void load_glb_from_buffer_render_thread( ffi.Pointer sceneManager, ffi.Pointer data, int length, @@ -1603,7 +1619,7 @@ external void load_glb_from_buffer_ffi( ffi.Bool, ffi.Pointer>)>( isLeaf: true) -external void load_gltf_ffi( +external void load_gltf_render_thread( ffi.Pointer sceneManager, ffi.Pointer assetPath, ffi.Pointer relativePath, @@ -1615,7 +1631,7 @@ external void load_gltf_ffi( ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>)>( isLeaf: true) -external void create_instance_ffi( +external void create_instance_render_thread( ffi.Pointer sceneManager, int entityId, ffi.Pointer> callback, @@ -1624,7 +1640,7 @@ external void create_instance_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>)>(isLeaf: true) -external void remove_entity_ffi( +external void remove_entity_render_thread( ffi.Pointer viewer, int asset, ffi.Pointer> callback, @@ -1633,7 +1649,7 @@ external void remove_entity_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer>)>(isLeaf: true) -external void clear_entities_ffi( +external void clear_entities_render_thread( ffi.Pointer viewer, ffi.Pointer> callback, ); @@ -1645,7 +1661,7 @@ external void clear_entities_ffi( ffi.Pointer, ffi.Pointer>)>( isLeaf: true) -external void set_camera_ffi( +external void set_camera_render_thread( ffi.Pointer viewer, int asset, ffi.Pointer nodeName, @@ -1655,7 +1671,7 @@ external void set_camera_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, ffi.Pointer, ffi.Int)>(isLeaf: true) -external void apply_weights_ffi( +external void apply_weights_render_thread( ffi.Pointer sceneManager, int asset, ffi.Pointer entityName, @@ -1666,7 +1682,7 @@ external void apply_weights_ffi( @ffi.Native< ffi.Void Function( ffi.Pointer, EntityId, ffi.Int, ffi.Int)>(isLeaf: true) -external void set_animation_frame_ffi( +external void set_animation_frame_render_thread( ffi.Pointer sceneManager, int asset, int animationIndex, @@ -1675,7 +1691,7 @@ external void set_animation_frame_ffi( @ffi.Native, EntityId, ffi.Int)>( isLeaf: true) -external void stop_animation_ffi( +external void stop_animation_render_thread( ffi.Pointer sceneManager, int asset, int index, @@ -1685,7 +1701,7 @@ external void stop_animation_ffi( ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>)>( isLeaf: true) -external void get_animation_count_ffi( +external void get_animation_count_render_thread( ffi.Pointer sceneManager, int asset, ffi.Pointer> callback, @@ -1698,7 +1714,7 @@ external void get_animation_count_ffi( ffi.Pointer, ffi.Int, ffi.Pointer>)>(isLeaf: true) -external void get_animation_name_ffi( +external void get_animation_name_render_thread( ffi.Pointer sceneManager, int asset, ffi.Pointer outPtr, @@ -1714,7 +1730,7 @@ external void get_animation_name_ffi( ffi.Pointer, ffi.Int, ffi.Pointer>)>(isLeaf: true) -external void get_morph_target_name_ffi( +external void get_morph_target_name_render_thread( ffi.Pointer sceneManager, int assetEntity, int childEntity, @@ -1727,7 +1743,7 @@ external void get_morph_target_name_ffi( ffi.Void Function(ffi.Pointer, EntityId, EntityId, ffi.Pointer>)>( isLeaf: true) -external void get_morph_target_name_count_ffi( +external void get_morph_target_name_count_render_thread( ffi.Pointer sceneManager, int asset, int childEntity, @@ -1742,7 +1758,7 @@ external void get_morph_target_name_count_ffi( ffi.Int, ffi.Pointer>)>( isLeaf: true) -external void set_morph_target_weights_ffi( +external void set_morph_target_weights_render_thread( ffi.Pointer sceneManager, int asset, ffi.Pointer morphData, @@ -1754,7 +1770,7 @@ external void set_morph_target_weights_ffi( ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>)>( isLeaf: true) -external void update_bone_matrices_ffi( +external void update_bone_matrices_render_thread( ffi.Pointer sceneManager, int asset, ffi.Pointer> callback, @@ -1769,7 +1785,7 @@ external void update_bone_matrices_ffi( ffi.Pointer, ffi.Pointer>)>( isLeaf: true) -external void set_bone_transform_ffi( +external void set_bone_transform_render_thread( ffi.Pointer sceneManager, int asset, int skinIndex, @@ -1779,7 +1795,7 @@ external void set_bone_transform_ffi( ); @ffi.Native, ffi.Bool)>(isLeaf: true) -external void set_post_processing_ffi( +external void set_post_processing_render_thread( ffi.Pointer viewer, bool enabled, ); @@ -1787,7 +1803,7 @@ external void set_post_processing_ffi( @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>)>(isLeaf: true) -external void reset_to_rest_pose_ffi( +external void reset_to_rest_pose_render_thread( ffi.Pointer sceneManager, int entityId, ffi.Pointer> callback, @@ -1809,7 +1825,7 @@ external void reset_to_rest_pose_ffi( ffi.Bool, ffi.Pointer>)>( isLeaf: true) -external void create_geometry_ffi( +external void create_geometry_render_thread( ffi.Pointer sceneManager, ffi.Pointer vertices, int numVertices, @@ -1836,7 +1852,7 @@ external void create_geometry_ffi( ffi.Uint32, ffi.Uint32, ffi.Pointer>)>(isLeaf: true) -external void unproject_texture_ffi( +external void unproject_texture_render_thread( ffi.Pointer sceneManager, int entity, ffi.Pointer input, diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index 5b100b5c..0afbf003 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -95,7 +95,7 @@ class ThermionViewerFFI extends ThermionViewer { Future createRenderTarget( double width, double height, int textureHandle) async { - await withVoidCallback((callback) => create_render_target_ffi( + await withVoidCallback((callback) => create_render_target_render_thread( _viewer!, textureHandle, width.toInt(), height.toInt(), callback)); } @@ -123,14 +123,14 @@ class ThermionViewerFFI extends ThermionViewer { Future createSwapChain(double width, double height, {Pointer? surface}) async { await withVoidCallback((callback) { - create_swap_chain_ffi(_viewer!, surface ?? nullptr, width.toInt(), - height.toInt(), callback); + create_swap_chain_render_thread(_viewer!, surface ?? nullptr, + width.toInt(), height.toInt(), callback); }); } Future destroySwapChain() async { await withVoidCallback((callback) { - destroy_swap_chain_ffi(_viewer!, callback); + destroy_swap_chain_render_thread(_viewer!, callback); }); } @@ -143,8 +143,14 @@ class ThermionViewerFFI extends ThermionViewer { nullptr; var viewer = await withVoidPointerCallback( (Pointer)>> callback) { - create_filament_viewer_ffi(_sharedContext, _driver, uberarchivePtr, - resourceLoader, _renderCallback, _renderCallbackOwner, callback); + create_filament_viewer_render_thread( + _sharedContext, + _driver, + uberarchivePtr, + resourceLoader, + _renderCallback, + _renderCallbackOwner, + callback); }); _viewer = Pointer.fromAddress(viewer); allocator.free(uberarchivePtr); @@ -178,9 +184,9 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setRendering(bool render) async { _rendering = render; - await withVoidCallback((cb) { - set_rendering_ffi(_viewer!, render, cb); - }); + // await withVoidCallback((cb) { + // set_rendering_render_thread(_viewer!, render, cb); + // }); } /// @@ -188,7 +194,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future render() async { - render_ffi(_viewer!); + render_render_thread(_viewer!); } /// @@ -201,7 +207,7 @@ class ThermionViewerFFI extends ThermionViewer { 4; final out = allocator(length); await withVoidCallback((cb) { - capture_ffi(_viewer!, out, cb); + capture_render_thread(_viewer!, out, cb); }); final data = Uint8List.fromList(out.asTypedList(length)); allocator.free(out); @@ -214,7 +220,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setFrameRate(int framerate) async { final interval = 1000.0 / framerate; - set_frame_interval_ffi(_viewer!, interval); + set_frame_interval_render_thread(_viewer!, interval); } final _onDispose = []; @@ -231,9 +237,9 @@ class ThermionViewerFFI extends ThermionViewer { await setRendering(false); await clearEntities(); await clearLights(); - - destroy_filament_viewer_ffi(_viewer!); - + print("DESTROYING"); + destroy_filament_viewer_render_thread(_viewer!); + print("DESTROYED"); _sceneManager = null; _viewer = null; await _pickResultController.close(); @@ -244,6 +250,7 @@ class ThermionViewerFFI extends ThermionViewer { await callback.call(); } _onDispose.clear(); + print("DONE"); } /// @@ -258,7 +265,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future clearBackgroundImage() async { - clear_background_image_ffi(_viewer!); + clear_background_image_render_thread(_viewer!); } /// @@ -268,7 +275,7 @@ class ThermionViewerFFI extends ThermionViewer { Future setBackgroundImage(String path, {bool fillHeight = false}) async { final pathPtr = path.toNativeUtf8(allocator: allocator).cast(); await withVoidCallback((cb) { - set_background_image_ffi(_viewer!, pathPtr, fillHeight, cb); + set_background_image_render_thread(_viewer!, pathPtr, fillHeight, cb); }); allocator.free(pathPtr); @@ -279,7 +286,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setBackgroundColor(double r, double g, double b, double a) async { - set_background_color_ffi(_viewer!, r, g, b, a); + set_background_color_render_thread(_viewer!, r, g, b, a); } /// @@ -288,7 +295,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setBackgroundImagePosition(double x, double y, {bool clamp = false}) async { - set_background_image_position_ffi(_viewer!, x, y, clamp); + set_background_image_position_render_thread(_viewer!, x, y, clamp); } /// @@ -299,7 +306,7 @@ class ThermionViewerFFI extends ThermionViewer { final pathPtr = skyboxPath.toNativeUtf8(allocator: allocator).cast(); await withVoidCallback((cb) { - load_skybox_ffi(_viewer!, pathPtr, cb); + load_skybox_render_thread(_viewer!, pathPtr, cb); }); allocator.free(pathPtr); @@ -320,7 +327,7 @@ class ThermionViewerFFI extends ThermionViewer { Future loadIbl(String lightingPath, {double intensity = 30000}) async { final pathPtr = lightingPath.toNativeUtf8(allocator: allocator).cast(); - load_ibl_ffi(_viewer!, pathPtr, intensity); + load_ibl_render_thread(_viewer!, pathPtr, intensity); } /// @@ -341,7 +348,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future removeSkybox() async { - remove_skybox_ffi(_viewer!); + remove_skybox_render_thread(_viewer!); } /// @@ -349,7 +356,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future removeIbl() async { - remove_ibl_ffi(_viewer!); + remove_ibl_render_thread(_viewer!); } @override @@ -392,7 +399,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future addDirectLight(DirectLight directLight) async { - var entity = await withIntCallback((callback) => add_light_ffi( + var entity = await withIntCallback((callback) => add_light_render_thread( _viewer!, directLight.type.index, directLight.color, @@ -424,7 +431,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future removeLight(ThermionEntity entity) async { - remove_light_ffi(_viewer!, entity); + remove_light_render_thread(_viewer!, entity); _sceneUpdateEventController.add(SceneUpdateEvent.remove(entity)); } @@ -433,7 +440,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future clearLights() async { - clear_lights_ffi(_viewer!); + clear_lights_render_thread(_viewer!); _sceneUpdateEventController.add(SceneUpdateEvent.clearLights()); } @@ -484,7 +491,7 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("Not yet implemented"); } final pathPtr = path.toNativeUtf8(allocator: allocator).cast(); - var entity = await withIntCallback((callback) => load_glb_ffi( + var entity = await withIntCallback((callback) => load_glb_render_thread( _sceneManager!, pathPtr, numInstances, keepData, callback)); allocator.free(pathPtr); if (entity == _FILAMENT_ASSET_ERROR) { @@ -515,15 +522,9 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("Layer must be between 0 and 6"); } - var entity = await withIntCallback((callback) => load_glb_from_buffer_ffi( - _sceneManager!, - data.address, - data.length, - numInstances, - keepData, - priority, - layer, - callback)); + var entity = await withIntCallback((callback) => + load_glb_from_buffer_render_thread(_sceneManager!, data.address, + data.length, numInstances, keepData, priority, layer, callback)); if (entity == _FILAMENT_ASSET_ERROR) { throw Exception("An error occurred loading GLB from buffer"); @@ -540,7 +541,7 @@ class ThermionViewerFFI extends ThermionViewer { final pathPtr = path.toNativeUtf8(allocator: allocator).cast(); final relativeResourcePathPtr = relativeResourcePath.toNativeUtf8(allocator: allocator).cast(); - var entity = await withIntCallback((callback) => load_gltf_ffi( + var entity = await withIntCallback((callback) => load_gltf_render_thread( _sceneManager!, pathPtr, relativeResourcePathPtr, keepData, callback)); allocator.free(pathPtr); allocator.free(relativeResourcePathPtr); @@ -614,7 +615,7 @@ class ThermionViewerFFI extends ThermionViewer { weightsPtr[i] = weights[i]; } var success = await withBoolCallback((cb) { - set_morph_target_weights_ffi( + set_morph_target_weights_render_thread( _sceneManager!, entity, weightsPtr, weights.length, cb); }); allocator.free(weightsPtr); @@ -634,7 +635,7 @@ class ThermionViewerFFI extends ThermionViewer { var names = []; var count = await withIntCallback((callback) => - get_morph_target_name_count_ffi( + get_morph_target_name_count_render_thread( _sceneManager!, entity, childEntity, callback)); var outPtr = allocator(255); for (int i = 0; i < count; i++) { @@ -944,7 +945,7 @@ class ThermionViewerFFI extends ThermionViewer { /// Future updateBoneMatrices(ThermionEntity entity) async { var result = await withBoolCallback((cb) { - update_bone_matrices_ffi(_sceneManager!, entity, cb); + update_bone_matrices_render_thread(_sceneManager!, entity, cb); }); if (!result) { throw Exception("Failed to update bone matrices"); @@ -993,7 +994,7 @@ class ThermionViewerFFI extends ThermionViewer { ptr[i] = transform.storage[i]; } var result = await withBoolCallback((cb) { - set_bone_transform_ffi( + set_bone_transform_render_thread( _sceneManager!, entity, skinIndex, boneIndex, ptr, cb); }); @@ -1015,7 +1016,7 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("No viewer available, ignoring"); } await withVoidCallback((cb) { - reset_to_rest_pose_ffi(_sceneManager!, entity, cb); + reset_to_rest_pose_render_thread(_sceneManager!, entity, cb); }); } @@ -1028,7 +1029,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future removeEntity(ThermionEntity entity) async { await withVoidCallback( - (callback) => remove_entity_ffi(_viewer!, entity, callback)); + (callback) => remove_entity_render_thread(_viewer!, entity, callback)); _sceneUpdateEventController.add(SceneUpdateEvent.remove(entity)); } @@ -1041,7 +1042,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future clearEntities() async { await withVoidCallback((callback) { - clear_entities_ffi(_viewer!, callback); + clear_entities_render_thread(_viewer!, callback); }); } @@ -1166,7 +1167,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setToneMapping(ToneMapper mapper) async { - set_tone_mapping_ffi(_viewer!, mapper.index); + set_tone_mapping_render_thread(_viewer!, mapper.index); } /// @@ -1174,7 +1175,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setPostProcessing(bool enabled) async { - set_post_processing_ffi(_viewer!, enabled); + set_post_processing_render_thread(_viewer!, enabled); } /// @@ -1213,7 +1214,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setBloom(double bloom) async { - set_bloom_ffi(_viewer!, bloom); + set_bloom_render_thread(_viewer!, bloom); } /// @@ -1350,7 +1351,10 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future setCameraLensProjection({double near = kNear, double far = kFar, double? aspect, + Future setCameraLensProjection( + {double near = kNear, + double far = kFar, + double? aspect, double focalLength = kFocalLength}) async { aspect ??= viewportDimensions.$1 / viewportDimensions.$2; var mainCamera = get_camera(_viewer!, get_main_camera(_viewer!)); @@ -1820,22 +1824,23 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("Viewer must not be null"); } - var entity = await withIntCallback((callback) => create_geometry_ffi( - _sceneManager!, - geometry.vertices.address, - geometry.vertices.length, - geometry.normals.address, - geometry.normals.length, - geometry.uvs.address, - geometry.uvs.length, - geometry.indices.address, - geometry.indices.length, - geometry.primitiveType.index, - materialInstance == null - ? nullptr - : (materialInstance as ThermionFFIMaterialInstance)._pointer, - keepData, - callback)); + var entity = await withIntCallback((callback) => + create_geometry_render_thread( + _sceneManager!, + geometry.vertices.address, + geometry.vertices.length, + geometry.normals.address, + geometry.normals.length, + geometry.uvs.address, + geometry.uvs.length, + geometry.indices.address, + geometry.indices.length, + geometry.primitiveType.index, + materialInstance == null + ? nullptr + : (materialInstance as ThermionFFIMaterialInstance)._pointer, + keepData, + callback)); if (entity == _FILAMENT_ASSET_ERROR) { throw Exception("Failed to create geometry"); } @@ -1983,8 +1988,16 @@ class ThermionViewerFFI extends ThermionViewer { int inputWidth, int inputHeight, int outWidth, int outHeight) async { final outPtr = Uint8List(outWidth * outHeight * 4); await withVoidCallback((callback) { - unproject_texture_ffi(_viewer!, entity, input.address, inputWidth, - inputHeight, outPtr.address, outWidth, outHeight, callback); + unproject_texture_render_thread( + _viewer!, + entity, + input.address, + inputWidth, + inputHeight, + outPtr.address, + outWidth, + outHeight, + callback); }); return outPtr.buffer.asUint8List(); @@ -2132,6 +2145,11 @@ class ThermionViewerFFI extends ThermionViewer { } return ThermionFFIMaterialInstance(instance); } + + @override + void requestFrame() { + request_frame_render_thread(_viewer!); + } } class ThermionFFITexture extends ThermionTexture { diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart index 105b9897..5faecd12 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart @@ -58,12 +58,17 @@ abstract class ThermionViewer { Future setRendering(bool render); /// - /// Render a single frame. + /// Render a single frame immediately. /// Future render(); /// - /// Render a single frame to the viewport and copy the pixel buffer to [out]. + /// Requests a single frame to be rendered. This is only intended to be used internally. + /// + void requestFrame(); + + /// + /// Render a single frame and copy the pixel buffer to [out]. /// Future capture(); diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart index 7d32a6af..273809e0 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart @@ -828,11 +828,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future setCameraLensProjection(double near, double far, double aspect, double focalLength) { - // TODO: implement setCameraLensProjection - throw UnimplementedError(); - } @override Future setCameraModelMatrix4(Matrix4 matrix) { @@ -952,6 +947,17 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement setVisibilityLayer throw UnimplementedError(); } + + @override + void requestFrame() { + // TODO: implement requestFrame + } + + @override + Future setCameraLensProjection({double near = kNear, double far = kFar, double? aspect, double focalLength = kFocalLength}) { + // TODO: implement setCameraLensProjection + throw UnimplementedError(); + } } diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index 4fb91590..a98e99f9 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -75,7 +75,7 @@ namespace thermion_filament void clearEntities(); void updateViewport(uint32_t width, uint32_t height); - void render( + bool render( uint64_t frameTimeInNanos, void *pixelBuffer, void (*callback)(void *buf, size_t size, void *data), diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index a9108025..19e33e33 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -102,7 +102,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE EntityId get_main_camera(const void *const viewer); EMSCRIPTEN_KEEPALIVE bool set_camera(const void *const viewer, EntityId entity, const char *nodeName); EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(const void *const viewer, bool enabled); - EMSCRIPTEN_KEEPALIVE void render( + EMSCRIPTEN_KEEPALIVE bool render( const void *const viewer, uint64_t frameTimeInNanos, void *pixelBuffer, @@ -225,6 +225,8 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_camera_lens_projection(TCamera *camera, double near, double far, double aspect, double focalLength); EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(TCamera *camera, float focusDistance); EMSCRIPTEN_KEEPALIVE void set_camera_manipulator_options(const void *const viewer, _ManipulatorMode mode, double orbitSpeedX, double orbitSpeedY, double zoomSpeed); + EMSCRIPTEN_KEEPALIVE void Camera_setCustomProjectionWithCulling(TCamera* camera, double4x4 projectionMatrix, double4x4 projectionMatrixForCulling, double near, double far); + EMSCRIPTEN_KEEPALIVE int hide_mesh(void *sceneManager, EntityId entity, const char *meshName); EMSCRIPTEN_KEEPALIVE int reveal_mesh(void *sceneManager, EntityId entity, const char *meshName); diff --git a/thermion_dart/native/include/ThermionDartFFIApi.h b/thermion_dart/native/include/ThermionDartFFIApi.h deleted file mode 100644 index 2a6dc3fd..00000000 --- a/thermion_dart/native/include/ThermionDartFFIApi.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef _DART_FILAMENT_FFI_API_H -#define _DART_FILAMENT_FFI_API_H - -#include "ThermionDartApi.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - /// - /// This header replicates most of the methods in ThermionDartApi.h. - /// It represents the interface for: - /// - invoking those methods that must be called on the main Filament engine thread - /// - setting up a render loop - /// - typedef int32_t EntityId; - typedef void (*FilamentRenderCallback)(void *const owner); - - EMSCRIPTEN_KEEPALIVE void create_filament_viewer_ffi( - void *const context, - void *const platform, - const char *uberArchivePath, - const void *const loader, - void (*renderCallback)(void *const renderCallbackOwner), - void *const renderCallbackOwner, - void (*callback)(void *const viewer)); - EMSCRIPTEN_KEEPALIVE void create_swap_chain_ffi(void *const viewer, void *const surface, uint32_t width, uint32_t height, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void destroy_swap_chain_ffi(void *const viewer, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void create_render_target_ffi(void *const viewer, intptr_t nativeTextureId, uint32_t width, uint32_t height, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer_ffi(void *const viewer); - EMSCRIPTEN_KEEPALIVE void render_ffi(void *const viewer); - EMSCRIPTEN_KEEPALIVE void capture_ffi(void *const viewer, uint8_t* out, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE FilamentRenderCallback make_render_callback_fn_pointer(FilamentRenderCallback); - EMSCRIPTEN_KEEPALIVE void set_rendering_ffi(void *const viewer, bool rendering, void(*onComplete)()); - EMSCRIPTEN_KEEPALIVE void set_frame_interval_ffi(void *const viewer, float frameInterval); - EMSCRIPTEN_KEEPALIVE void set_background_color_ffi(void *const viewer, const float r, const float g, const float b, const float a); - EMSCRIPTEN_KEEPALIVE void clear_background_image_ffi(void *const viewer); - EMSCRIPTEN_KEEPALIVE void set_background_image_ffi(void *const viewer, const char *path, bool fillHeight, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void set_background_image_position_ffi(void *const viewer, float x, float y, bool clamp); - EMSCRIPTEN_KEEPALIVE void set_tone_mapping_ffi(void *const viewer, int toneMapping); - EMSCRIPTEN_KEEPALIVE void set_bloom_ffi(void *const viewer, float strength); - EMSCRIPTEN_KEEPALIVE void load_skybox_ffi(void *const viewer, const char *skyboxPath, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void load_ibl_ffi(void *const viewer, const char *iblPath, float intensity); - EMSCRIPTEN_KEEPALIVE void remove_skybox_ffi(void *const viewer); - EMSCRIPTEN_KEEPALIVE void remove_ibl_ffi(void *const viewer); - EMSCRIPTEN_KEEPALIVE void add_light_ffi( - void *const viewer, - uint8_t type, - float colour, - float intensity, - float posX, - float posY, - float posZ, - float dirX, - float dirY, - float dirZ, - float falloffRadius, - float spotLightConeInner, - float spotLightConeOuter, - float sunAngularRadius, - float sunHaloSize, - float sunHaloFallof, - bool shadows, - void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void remove_light_ffi(void *const viewer, EntityId entityId); - EMSCRIPTEN_KEEPALIVE void clear_lights_ffi(void *const viewer); - EMSCRIPTEN_KEEPALIVE void load_glb_ffi(void *const sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, int priority, int layer, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void load_gltf_ffi(void *const sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void create_instance_ffi(void *const sceneManager, EntityId entityId, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void remove_entity_ffi(void *const viewer, EntityId asset, void (*callback)()); - EMSCRIPTEN_KEEPALIVE void clear_entities_ffi(void *const viewer, void (*callback)()); - EMSCRIPTEN_KEEPALIVE void set_camera_ffi(void *const viewer, EntityId asset, const char *nodeName, void (*callback)(bool)); - EMSCRIPTEN_KEEPALIVE void apply_weights_ffi( - void *const sceneManager, - EntityId asset, - const char *const entityName, - float *const weights, - int count); - EMSCRIPTEN_KEEPALIVE void set_animation_frame_ffi(void *const sceneManager, EntityId asset, int animationIndex, int animationFrame); - EMSCRIPTEN_KEEPALIVE void stop_animation_ffi(void *const sceneManager, EntityId asset, int index); - EMSCRIPTEN_KEEPALIVE void get_animation_count_ffi(void *const sceneManager, EntityId asset, void (*callback)(int)); - EMSCRIPTEN_KEEPALIVE void get_animation_name_ffi(void *const sceneManager, EntityId asset, char *const outPtr, int index, void (*callback)()); - EMSCRIPTEN_KEEPALIVE void get_morph_target_name_ffi(void *const sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index, void (*callback)()); - EMSCRIPTEN_KEEPALIVE void get_morph_target_name_count_ffi(void *const sceneManager, EntityId asset, EntityId childEntity, void (*callback)(int32_t)); - EMSCRIPTEN_KEEPALIVE void set_morph_target_weights_ffi(void *const sceneManager, - EntityId asset, - const float *const morphData, - int numWeights, - void (*callback)(bool)); - - EMSCRIPTEN_KEEPALIVE void update_bone_matrices_ffi(void *sceneManager, - EntityId asset, void(*callback)(bool)); - EMSCRIPTEN_KEEPALIVE void set_bone_transform_ffi( - void *sceneManager, - EntityId asset, - int skinIndex, - int boneIndex, - const float *const transform, - void (*callback)(bool)); - EMSCRIPTEN_KEEPALIVE void set_post_processing_ffi(void *const viewer, bool enabled); - EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_ffi(void *const sceneManager, EntityId entityId, void(*callback)()); - EMSCRIPTEN_KEEPALIVE void create_geometry_ffi( - void *const sceneManager, - float *vertices, - int numVertices, - float *normals, - int numNormals, - float *uvs, - int numUvs, - uint16_t *indices, - int numIndices, - int primitiveType, - TMaterialInstance *materialInstance, - bool keepData, - void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void unproject_texture_ffi(void *const sceneManager, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()); - - -#ifdef __cplusplus -} -#endif - -#endif // _DART_FILAMENT_FFI_API_H diff --git a/thermion_dart/native/include/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/ThermionDartRenderThreadApi.h new file mode 100644 index 00000000..33892b52 --- /dev/null +++ b/thermion_dart/native/include/ThermionDartRenderThreadApi.h @@ -0,0 +1,126 @@ +#ifndef _DART_FILAMENT_FFI_API_H +#define _DART_FILAMENT_FFI_API_H + +#include "ThermionDartApi.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + /// + /// This header replicates most of the methods in ThermionDartApi.h. + /// It represents the interface for: + /// - invoking those methods that must be called on the main Filament engine thread + /// - setting up a render loop + /// + typedef int32_t EntityId; + typedef void (*FilamentRenderCallback)(void *const owner); + + EMSCRIPTEN_KEEPALIVE void create_filament_viewer_render_thread( + void *const context, + void *const platform, + const char *uberArchivePath, + const void *const loader, + void (*renderCallback)(void *const renderCallbackOwner), + void *const renderCallbackOwner, + void (*callback)(void *const viewer)); + EMSCRIPTEN_KEEPALIVE void create_swap_chain_render_thread(void *const viewer, void *const surface, uint32_t width, uint32_t height, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void destroy_swap_chain_render_thread(void *const viewer, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void create_render_target_render_thread(void *const viewer, intptr_t nativeTextureId, uint32_t width, uint32_t height, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer_render_thread(void *const viewer); + EMSCRIPTEN_KEEPALIVE void render_render_thread(void *const viewer); + EMSCRIPTEN_KEEPALIVE void capture_render_thread(void *const viewer, uint8_t* out, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE FilamentRenderCallback make_render_callback_fn_pointer(FilamentRenderCallback); + EMSCRIPTEN_KEEPALIVE void set_rendering_render_thread(void *const viewer, bool rendering, void(*onComplete)()); + EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(void *const viewer); + EMSCRIPTEN_KEEPALIVE void set_frame_interval_render_thread(void *const viewer, float frameInterval); + EMSCRIPTEN_KEEPALIVE void set_background_color_render_thread(void *const viewer, const float r, const float g, const float b, const float a); + EMSCRIPTEN_KEEPALIVE void clear_background_image_render_thread(void *const viewer); + EMSCRIPTEN_KEEPALIVE void set_background_image_render_thread(void *const viewer, const char *path, bool fillHeight, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void set_background_image_position_render_thread(void *const viewer, float x, float y, bool clamp); + EMSCRIPTEN_KEEPALIVE void set_tone_mapping_render_thread(void *const viewer, int toneMapping); + EMSCRIPTEN_KEEPALIVE void set_bloom_render_thread(void *const viewer, float strength); + EMSCRIPTEN_KEEPALIVE void load_skybox_render_thread(void *const viewer, const char *skyboxPath, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void load_ibl_render_thread(void *const viewer, const char *iblPath, float intensity); + EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(void *const viewer); + EMSCRIPTEN_KEEPALIVE void remove_ibl_render_thread(void *const viewer); + EMSCRIPTEN_KEEPALIVE void add_light_render_thread( + void *const viewer, + uint8_t type, + float colour, + float intensity, + float posX, + float posY, + float posZ, + float dirX, + float dirY, + float dirZ, + float falloffRadius, + float spotLightConeInner, + float spotLightConeOuter, + float sunAngularRadius, + float sunHaloSize, + float sunHaloFallof, + bool shadows, + void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void remove_light_render_thread(void *const viewer, EntityId entityId); + EMSCRIPTEN_KEEPALIVE void clear_lights_render_thread(void *const viewer); + EMSCRIPTEN_KEEPALIVE void load_glb_render_thread(void *const sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_render_thread(void *const sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, int priority, int layer, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void load_gltf_render_thread(void *const sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void create_instance_render_thread(void *const sceneManager, EntityId entityId, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void remove_entity_render_thread(void *const viewer, EntityId asset, void (*callback)()); + EMSCRIPTEN_KEEPALIVE void clear_entities_render_thread(void *const viewer, void (*callback)()); + EMSCRIPTEN_KEEPALIVE void set_camera_render_thread(void *const viewer, EntityId asset, const char *nodeName, void (*callback)(bool)); + EMSCRIPTEN_KEEPALIVE void apply_weights_render_thread( + void *const sceneManager, + EntityId asset, + const char *const entityName, + float *const weights, + int count); + EMSCRIPTEN_KEEPALIVE void set_animation_frame_render_thread(void *const sceneManager, EntityId asset, int animationIndex, int animationFrame); + EMSCRIPTEN_KEEPALIVE void stop_animation_render_thread(void *const sceneManager, EntityId asset, int index); + EMSCRIPTEN_KEEPALIVE void get_animation_count_render_thread(void *const sceneManager, EntityId asset, void (*callback)(int)); + EMSCRIPTEN_KEEPALIVE void get_animation_name_render_thread(void *const sceneManager, EntityId asset, char *const outPtr, int index, void (*callback)()); + EMSCRIPTEN_KEEPALIVE void get_morph_target_name_render_thread(void *const sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index, void (*callback)()); + EMSCRIPTEN_KEEPALIVE void get_morph_target_name_count_render_thread(void *const sceneManager, EntityId asset, EntityId childEntity, void (*callback)(int32_t)); + EMSCRIPTEN_KEEPALIVE void set_morph_target_weights_render_thread(void *const sceneManager, + EntityId asset, + const float *const morphData, + int numWeights, + void (*callback)(bool)); + + EMSCRIPTEN_KEEPALIVE void update_bone_matrices_render_thread(void *sceneManager, + EntityId asset, void(*callback)(bool)); + EMSCRIPTEN_KEEPALIVE void set_bone_transform_render_thread( + void *sceneManager, + EntityId asset, + int skinIndex, + int boneIndex, + const float *const transform, + void (*callback)(bool)); + EMSCRIPTEN_KEEPALIVE void set_post_processing_render_thread(void *const viewer, bool enabled); + EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_render_thread(void *const sceneManager, EntityId entityId, void(*callback)()); + EMSCRIPTEN_KEEPALIVE void create_geometry_render_thread( + void *const sceneManager, + float *vertices, + int numVertices, + float *normals, + int numNormals, + float *uvs, + int numUvs, + uint16_t *indices, + int numIndices, + int primitiveType, + TMaterialInstance *materialInstance, + bool keepData, + void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void unproject_texture_render_thread(void *const sceneManager, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()); + + +#ifdef __cplusplus +} +#endif + +#endif // _DART_FILAMENT_FFI_API_H diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 73333c0f..83b3909e 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -1106,7 +1106,7 @@ namespace thermion_filament } } - void FilamentViewer::render( + bool FilamentViewer::render( uint64_t frameTimeInNanos, void *pixelBuffer, void (*callback)(void *buf, size_t size, void *data), @@ -1115,7 +1115,7 @@ namespace thermion_filament if (!_view || !_swapChain) { - return; + return false; } auto now = std::chrono::high_resolution_clock::now(); @@ -1191,6 +1191,7 @@ namespace thermion_filament #ifdef __EMSCRIPTEN__ _engine->execute(); #endif + return beginFrame; } class CaptureCallbackHandler : public filament::backend::CallbackHandler { diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 770ec434..0654a054 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -338,14 +338,14 @@ extern "C" cam->setModelMatrix(mat); } - EMSCRIPTEN_KEEPALIVE void render( + EMSCRIPTEN_KEEPALIVE bool render( const void *const viewer, uint64_t frameTimeInNanos, void *pixelBuffer, void (*callback)(void *buf, size_t size, void *data), void *data) { - ((FilamentViewer *)viewer)->render(frameTimeInNanos, pixelBuffer, callback, data); + return ((FilamentViewer *)viewer)->render(frameTimeInNanos, pixelBuffer, callback, data); } EMSCRIPTEN_KEEPALIVE void capture( @@ -1057,4 +1057,8 @@ EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance* mate EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance* materialInstance, bool enabled) { reinterpret_cast(materialInstance)->setDepthCulling(enabled); } + +EMSCRIPTEN_KEEPALIVE void Camera_setCustomProjectionWithCulling(TCamera* camera, double4x4 projectionMatrix, double4x4 projectionMatrixForCulling, double near, double far) { + reinterpret_cast(camera)->setCustomProjection(convert_double4x4_to_mat4(projectionMatrix), convert_double4x4_to_mat4(projectionMatrixForCulling), near, far); +} } diff --git a/thermion_dart/native/src/ThermionDartFFIApi.cpp b/thermion_dart/native/src/ThermionDartFFIApi.cpp deleted file mode 100644 index 366efca1..00000000 --- a/thermion_dart/native/src/ThermionDartFFIApi.cpp +++ /dev/null @@ -1,875 +0,0 @@ -#ifdef __EMSCRIPTEN__ -#define GL_GLEXT_PROTOTYPES -#include -#include - -#include -#include -#include -#include -#include - -extern "C" -{ - extern EMSCRIPTEN_KEEPALIVE EMSCRIPTEN_WEBGL_CONTEXT_HANDLE thermion_dart_web_create_gl_context(); -} -#endif - -#include "ThermionDartFFIApi.h" -#include "FilamentViewer.hpp" -#include "Log.hpp" -#include "ThreadPool.hpp" -#include "filament/LightManager.h" - -#include -#include -#include -#include - -using namespace thermion_filament; -using namespace std::chrono_literals; -#include - -class RenderLoop -{ -public: - explicit RenderLoop() - { - srand(time(NULL)); - #ifdef __EMSCRIPTEN__ - pthread_attr_t attr; - pthread_attr_init(&attr); - emscripten_pthread_attr_settransferredcanvases(&attr, "canvas"); - pthread_create(&t, &attr, &RenderLoop::startHelper, this); - #else - t = new std::thread([this]() { - start(); - }); - #endif - } - - ~RenderLoop() - { - _stop = true; - #ifdef __EMSCRIPTEN__ - pthread_join(t, NULL); - #else - t->join(); - #endif - Log("Render loop killed"); - } - - static void mainLoop(void* arg) { - ((RenderLoop*)arg)->iter(); - } - - static void *startHelper(void * parm) { - #ifdef __EMSCRIPTEN__ - emscripten_set_main_loop_arg(&RenderLoop::mainLoop, parm, 0, true); - #else - ((RenderLoop*)parm)->start(); - #endif - return nullptr; - } - - void start() { - while (!_stop) { - iter(); - } - } - - void iter() { - const auto frameStart = std::chrono::steady_clock::now(); - if (_rendering) { - doRender(); - } - - std::unique_lock lock(_access); - const auto frameEnd = frameStart + std::chrono::microseconds(_frameIntervalInMicroseconds); - - while (std::chrono::steady_clock::now() < frameEnd) { - if (!_tasks.empty()) { - auto task = std::move(_tasks.front()); - _tasks.pop_front(); - lock.unlock(); - task(); - lock.lock(); - } else { - _cond.wait_until(lock, frameEnd); - } - } - } - - void createViewer(void *const context, - void *const platform, - const char *uberArchivePath, - const ResourceLoaderWrapper *const loader, - void (*renderCallback)(void *), - void *const owner, - void (*callback)(void *const)) - { - _renderCallback = renderCallback; - _renderCallbackOwner = owner; - std::packaged_task lambda([=]() mutable - { -#ifdef __EMSCRIPTEN__ - _context = thermion_dart_web_create_gl_context(); - - auto success = emscripten_webgl_make_context_current((EMSCRIPTEN_WEBGL_CONTEXT_HANDLE)_context); - if(success != EMSCRIPTEN_RESULT_SUCCESS) { - std::cout << "Failed to make context current." << std::endl; - return; - } - glClearColor(0.0, 0.5, 0.5, 1.0); - glClear(GL_COLOR_BUFFER_BIT); - // emscripten_webgl_commit_frame(); - - _viewer = (FilamentViewer*) create_filament_viewer((void* const) _context, loader, platform, uberArchivePath); - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0, $1); - }, callback, _viewer); -#else - _viewer = (FilamentViewer*)create_filament_viewer(context, loader, platform, uberArchivePath); - callback(_viewer); -#endif - }); - auto fut = add_task(lambda); - } - - void destroyViewer(FilamentViewer* viewer) - { - std::packaged_task lambda([=]() mutable { - _rendering = false; - _viewer = nullptr; - destroy_filament_viewer(viewer); - }); - auto fut = add_task(lambda); - } - - void setRendering(bool rendering, void(*callback)()) - { - std::packaged_task lambda( - [=]() mutable - { - this->_rendering = rendering; - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, callback); - #else - callback(); - #endif - }); - auto fut = add_task(lambda); - } - - void doRender() - { - #ifdef __EMSCRIPTEN__ - if(emscripten_is_webgl_context_lost(_context) == EM_TRUE) { - Log("Context lost"); - auto sleepFor = std::chrono::seconds(1); - std::this_thread::sleep_for(sleepFor); - return; - } - #endif - render(_viewer, 0, nullptr, nullptr, nullptr); - if (_renderCallback) - { - _renderCallback(_renderCallbackOwner); - } -#ifdef __EMSCRIPTEN__ - // emscripten_webgl_commit_frame(); -#endif - } - - void setFrameIntervalInMilliseconds(float frameIntervalInMilliseconds) - { - _frameIntervalInMicroseconds = static_cast(1000.0f * frameIntervalInMilliseconds); - } - - template - auto add_task(std::packaged_task &pt) -> std::future - { - std::unique_lock lock(_access); - auto ret = pt.get_future(); - _tasks.push_back([pt = std::make_shared>( - std::move(pt))] - { (*pt)(); }); - _cond.notify_one(); - return ret; - } - - bool _stop = false; - bool _rendering = false; - int _frameIntervalInMicroseconds = 1000000.0 / 60.0; - std::mutex _access; - void (*_renderCallback)(void *const) = nullptr; - void *_renderCallbackOwner = nullptr; - - - std::condition_variable _cond; - std::deque> _tasks; - FilamentViewer* _viewer = nullptr; - #ifdef __EMSCRIPTEN__ - pthread_t t; - EMSCRIPTEN_WEBGL_CONTEXT_HANDLE _context; - int _frameNum = 0; - #else - std::thread *t = nullptr; - #endif -}; - -extern "C" -{ - - static RenderLoop *_rl; - - EMSCRIPTEN_KEEPALIVE void create_filament_viewer_ffi( - void *const context, void *const platform, const char *uberArchivePath, - const void *const loader, - void (*renderCallback)(void *const renderCallbackOwner), - void *const renderCallbackOwner, - void (*callback)(void *const)) - { - - if (!_rl) - { - _rl = new RenderLoop(); - } - _rl->createViewer(context, platform, uberArchivePath, (const ResourceLoaderWrapper *const)loader, - renderCallback, renderCallbackOwner, callback); - } - - EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer_ffi(void *const viewer) - { - _rl->destroyViewer((FilamentViewer*)viewer); - delete _rl; - _rl = nullptr; - } - - EMSCRIPTEN_KEEPALIVE void create_swap_chain_ffi(void *const viewer, - void *const surface, - uint32_t width, - uint32_t height, - void (*onComplete)()) - { - std::packaged_task lambda( - [=]() mutable - { - create_swap_chain(viewer, surface, width, height); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, onComplete); - #else - onComplete(); - #endif - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void destroy_swap_chain_ffi(void *const viewer, void (*onComplete)()) - { - Log("Destroying swapchain"); - std::packaged_task lambda( - [=]() mutable - { - destroy_swap_chain(viewer); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, onComplete); - #else - onComplete(); - #endif - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void create_render_target_ffi(void *const viewer, - intptr_t nativeTextureId, - uint32_t width, - uint32_t height, - void (*onComplete)()) - { - std::packaged_task lambda([=]() mutable - { - create_render_target(viewer, nativeTextureId, width, height); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, onComplete); - #else - onComplete(); - #endif - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void set_rendering_ffi(void *const viewer, - bool rendering, void (*callback)()) - { - if (!_rl) - { - Log("No render loop!"); // PANIC? - } - else - { - _rl->setRendering(rendering, callback); - if (rendering) - { - Log("Set rendering to true"); - } - else - { - Log("Set rendering to false"); - } - } - } - - EMSCRIPTEN_KEEPALIVE void - set_frame_interval_ffi(void* const viewer, float frameIntervalInMilliseconds) - { - _rl->setFrameIntervalInMilliseconds(frameIntervalInMilliseconds); - std::packaged_task lambda([=]() mutable - { ((FilamentViewer*)viewer)->setFrameInterval(frameIntervalInMilliseconds); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void render_ffi(void *const viewer) - { - std::packaged_task lambda([=]() mutable - { _rl->doRender(); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void capture_ffi(void *const viewer, uint8_t* pixelBuffer, void (*onComplete)()) { - std::packaged_task lambda([=]() mutable - { capture(viewer, pixelBuffer, onComplete); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void - set_background_color_ffi(void *const viewer, const float r, const float g, - const float b, const float a) - { - std::packaged_task lambda( - [=]() mutable - { set_background_color(viewer, r, g, b, a); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void load_gltf_ffi(void *const sceneManager, - const char *path, - const char *relativeResourcePath, - bool keepData, - void (*callback)(EntityId)) - { - std::packaged_task lambda([=]() mutable - { - auto entity = load_gltf(sceneManager, path, relativeResourcePath, keepData); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0, $1); - }, callback, entity); - #else - callback(entity); - #endif - return entity; }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void load_glb_ffi(void *const sceneManager, - const char *path, - int numInstances, - bool keepData, - void (*callback)(EntityId)) - { - std::packaged_task lambda( - [=]() mutable - { - auto entity = load_glb(sceneManager, path, numInstances, keepData); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0, $1); - }, callback, entity); - #else - callback(entity); - #endif - return entity; - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, - const uint8_t *const data, - size_t length, - int numInstances, - bool keepData, - int priority, - int layer, - void (*callback)(EntityId)) - { - std::packaged_task lambda( - [=]() mutable - { - auto entity = load_glb_from_buffer(sceneManager, data, length, keepData, priority, layer); - callback(entity); - return entity; - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void clear_background_image_ffi(void *const viewer) - { - std::packaged_task lambda([=] - { clear_background_image(viewer); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void set_background_image_ffi(void *const viewer, - const char *path, - bool fillHeight, void (*callback)()) - { - std::packaged_task lambda( - [=] - { - set_background_image(viewer, path, fillHeight); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, callback); - #else - callback(); - #endif - }); - auto fut = _rl->add_task(lambda); - } - EMSCRIPTEN_KEEPALIVE void set_background_image_position_ffi(void *const viewer, - float x, float y, - bool clamp) - { - std::packaged_task lambda( - [=] - { set_background_image_position(viewer, x, y, clamp); }); - auto fut = _rl->add_task(lambda); - } - EMSCRIPTEN_KEEPALIVE void set_tone_mapping_ffi(void *const viewer, - int toneMapping) - { - std::packaged_task lambda( - [=] - { set_tone_mapping(viewer, toneMapping); }); - auto fut = _rl->add_task(lambda); - } - EMSCRIPTEN_KEEPALIVE void set_bloom_ffi(void *const viewer, float strength) - { - std::packaged_task lambda([=] - { set_bloom(viewer, strength); }); - auto fut = _rl->add_task(lambda); - } - EMSCRIPTEN_KEEPALIVE void load_skybox_ffi(void *const viewer, - const char *skyboxPath, - void (*onComplete)()) - { - std::packaged_task lambda([=] - { - load_skybox(viewer, skyboxPath); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, onComplete); - #else - onComplete(); - #endif - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void load_ibl_ffi(void *const viewer, const char *iblPath, - float intensity) - { - std::packaged_task lambda( - [=] - { load_ibl(viewer, iblPath, intensity); }); - auto fut = _rl->add_task(lambda); - } - EMSCRIPTEN_KEEPALIVE void remove_skybox_ffi(void *const viewer) - { - std::packaged_task lambda([=] - { remove_skybox(viewer); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void remove_ibl_ffi(void *const viewer) - { - std::packaged_task lambda([=] - { remove_ibl(viewer); }); - auto fut = _rl->add_task(lambda); - } - - void add_light_ffi( - void *const viewer, - uint8_t type, - float colour, - float intensity, - float posX, - float posY, - float posZ, - float dirX, - float dirY, - float dirZ, - float falloffRadius, - float spotLightConeInner, - float spotLightConeOuter, - float sunAngularRadius, - float sunHaloSize, - float sunHaloFallof, - bool shadows, - void (*callback)(EntityId)) - { - std::packaged_task lambda([=] - { - auto entity = add_light( - viewer, - type, - colour, - intensity, - posX, - posY, - posZ, - dirX, - dirY, - dirZ, - falloffRadius, - spotLightConeInner, - spotLightConeOuter, - sunAngularRadius, - sunHaloSize, - sunHaloFallof, - shadows); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0, $1); - }, callback, entity); - #else - callback(entity); - #endif - - return entity; }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void remove_light_ffi(void *const viewer, - EntityId entityId) - { - std::packaged_task lambda([=] - { remove_light(viewer, entityId); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void clear_lights_ffi(void *const viewer) - { - std::packaged_task lambda([=] - { clear_lights(viewer); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void remove_entity_ffi(void *const viewer, - EntityId asset, void (*callback)()) - { - std::packaged_task lambda([=] - { - remove_entity(viewer, asset); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, callback); - #else - callback(); - #endif - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void clear_entities_ffi(void *const viewer, void (*callback)()) - { - std::packaged_task lambda([=] - { - clear_entities(viewer); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, callback); - #else - callback(); - #endif - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void set_camera_ffi(void *const viewer, EntityId asset, - const char *nodeName, void (*callback)(bool)) - { - std::packaged_task lambda( - [=] - { - auto success = set_camera(viewer, asset, nodeName); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0,$1); - }, callback, success); - #else - callback(success); - #endif - return success; - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void - get_morph_target_name_ffi(void *sceneManager, EntityId assetEntity, - EntityId childEntity, char *const outPtr, int index, void (*callback)()) - { - std::packaged_task lambda([=] - { - get_morph_target_name(sceneManager, assetEntity, childEntity, outPtr, index); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, callback); - #else - callback(); - #endif - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void - get_morph_target_name_count_ffi(void *sceneManager, EntityId assetEntity, - EntityId childEntity, void (*callback)(int)) - { - std::packaged_task lambda([=] - { - auto count = get_morph_target_name_count(sceneManager, assetEntity, childEntity); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0,$1); - }, callback, count); - #else - callback(count); - #endif - return count; }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void set_animation_frame_ffi(void *const sceneManager, - EntityId asset, - int animationIndex, - int animationFrame) - { - std::packaged_task lambda([=] - { set_animation_frame(sceneManager, asset, animationIndex, animationFrame); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void stop_animation_ffi(void *const sceneManager, - EntityId asset, int index) - { - std::packaged_task lambda( - [=] - { stop_animation(sceneManager, asset, index); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void get_animation_count_ffi(void *const sceneManager, - EntityId asset, - void (*callback)(int)) - { - std::packaged_task lambda( - [=] - { - auto count = get_animation_count(sceneManager, asset); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0,$1); - }, callback, count); - #else - callback(count); - #endif - return count; - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void get_animation_name_ffi(void *const sceneManager, - EntityId asset, - char *const outPtr, - int index, - void (*callback)()) - { - std::packaged_task lambda( - [=] - { - get_animation_name(sceneManager, asset, outPtr, index); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, callback); - #else - callback(); - #endif - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void set_post_processing_ffi(void *const viewer, - bool enabled) - { - std::packaged_task lambda( - [=] - { set_post_processing(viewer, enabled); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void - get_name_for_entity_ffi(void *const sceneManager, const EntityId entityId, void (*callback)(const char *)) - { - std::packaged_task lambda( - [=] - { - auto name = get_name_for_entity(sceneManager, entityId); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0,$1); - }, callback, name); - #else - callback(name); - #endif - return name; - }); - auto fut = _rl->add_task(lambda); - } - - void set_morph_target_weights_ffi(void *const sceneManager, - EntityId asset, - const float *const morphData, - int numWeights, - void (*callback)(bool)) - { - std::packaged_task lambda( - [=] - { - auto result = set_morph_target_weights(sceneManager, asset, morphData, numWeights); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0,$1); - }, callback, result); - #else - callback(result); - #endif - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void set_bone_transform_ffi( - void *sceneManager, - EntityId asset, - int skinIndex, - int boneIndex, - const float *const transform, - void (*callback)(bool)) - { - std::packaged_task lambda( - [=] - { - auto success = set_bone_transform(sceneManager, asset, skinIndex, boneIndex, transform); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0,$1); - }, callback, success); - #else - callback(success); - #endif - return success; - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void update_bone_matrices_ffi(void *sceneManager, - EntityId entity, void(*callback)(bool)) { - std::packaged_task lambda( - [=] - { - auto success = update_bone_matrices(sceneManager, entity); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, callback, success); - #else - callback(success); - #endif - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_ffi(void *const sceneManager, EntityId entityId, void(*callback)()) - { - std::packaged_task lambda( - [=] - { - reset_to_rest_pose(sceneManager, entityId); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0); - }, callback); - #else - callback(); - #endif - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void create_geometry_ffi( - void *const sceneManager, - float *vertices, - int numVertices, - float *normals, - int numNormals, - float *uvs, - int numUvs, - uint16_t *indices, - int numIndices, - int primitiveType, - TMaterialInstance * materialInstance, - bool keepData, - void (*callback)(EntityId)) - { - std::packaged_task lambda( - [=] - { - auto entity = create_geometry(sceneManager, vertices, numVertices, normals, numNormals, uvs, numUvs, indices, numIndices, primitiveType, materialInstance, keepData); - #ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0,$1); - }, callback, entity); - #else - callback(entity); - #endif - return entity; - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void unproject_texture_ffi(void *const viewer, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()) { - std::packaged_task lambda( - [=] - { - unproject_texture(viewer, entity, input, inputWidth, inputHeight, out, outWidth, outHeight); - callback(); - }); - auto fut = _rl->add_task(lambda); - } - -} diff --git a/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp b/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp new file mode 100644 index 00000000..ab509990 --- /dev/null +++ b/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp @@ -0,0 +1,847 @@ +#ifdef __EMSCRIPTEN__ +#define GL_GLEXT_PROTOTYPES +#include +#include + +#include +#include +#include +#include +#include + +extern "C" +{ + extern EMSCRIPTEN_KEEPALIVE EMSCRIPTEN_WEBGL_CONTEXT_HANDLE thermion_dart_web_create_gl_context(); +} +#endif + +#include "ThermionDartRenderThreadApi.h" +#include "FilamentViewer.hpp" +#include "Log.hpp" +#include "ThreadPool.hpp" +#include "filament/LightManager.h" + +#include +#include +#include +#include + +using namespace thermion_filament; +using namespace std::chrono_literals; +#include + +class RenderLoop +{ +public: + explicit RenderLoop() + { + srand(time(NULL)); +#ifdef __EMSCRIPTEN__ + pthread_attr_t attr; + pthread_attr_init(&attr); + emscripten_pthread_attr_settransferredcanvases(&attr, "canvas"); + pthread_create(&t, &attr, &RenderLoop::startHelper, this); +#else + t = new std::thread([this]() + { start(); }); +#endif + } + + ~RenderLoop() + { + _render = false; + _stop = true; + _cv.notify_one(); +#ifdef __EMSCRIPTEN__ + pthread_join(t, NULL); +#else + t->join(); +#endif + } + + static void mainLoop(void *arg) + { + ((RenderLoop *)arg)->iter(); + } + + static void *startHelper(void *parm) + { +#ifdef __EMSCRIPTEN__ + emscripten_set_main_loop_arg(&RenderLoop::mainLoop, parm, 0, true); +#else + ((RenderLoop *)parm)->start(); +#endif + return nullptr; + } + + void start() + { + while (!_stop) + { + iter(); + } + } + + void requestFrame() + { + this->_render = true; + } + + void iter() + { + std::unique_lock lock(_mutex); + if (_render) + { + doRender(); + _render = false; + + // Calculate and print FPS + auto currentTime = std::chrono::high_resolution_clock::now(); + float deltaTime = std::chrono::duration(currentTime - _lastFrameTime).count(); + _lastFrameTime = currentTime; + + _frameCount++; + _accumulatedTime += deltaTime; + + if (_accumulatedTime >= 1.0f) // Update FPS every second + { + _fps = _frameCount / _accumulatedTime; + std::cout << "FPS: " << _fps << std::endl; + _frameCount = 0; + _accumulatedTime = 0.0f; + } + } + if (!_tasks.empty()) + { + auto task = std::move(_tasks.front()); + _tasks.pop_front(); + lock.unlock(); + task(); + lock.lock(); + } + + _cv.wait_for(lock, std::chrono::microseconds(1000), [this] + { return !_tasks.empty() || _stop || _render; }); + + if (_stop) + return; + } + + void createViewer(void *const context, + void *const platform, + const char *uberArchivePath, + const ResourceLoaderWrapper *const loader, + void (*renderCallback)(void *), + void *const owner, + void (*callback)(void *const)) + { + _renderCallback = renderCallback; + _renderCallbackOwner = owner; + std::packaged_task lambda([=]() mutable + { +#ifdef __EMSCRIPTEN__ + _context = thermion_dart_web_create_gl_context(); + + auto success = emscripten_webgl_make_context_current((EMSCRIPTEN_WEBGL_CONTEXT_HANDLE)_context); + if (success != EMSCRIPTEN_RESULT_SUCCESS) + { + std::cout << "Failed to make context current." << std::endl; + return; + } + glClearColor(0.0, 0.5, 0.5, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + // emscripten_webgl_commit_frame(); + + _viewer = (FilamentViewer *)create_filament_viewer((void *const)_context, loader, platform, uberArchivePath); + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0, $1); }, callback, _viewer); +#else + _viewer = (FilamentViewer *)create_filament_viewer(context, loader, platform, uberArchivePath); + callback(_viewer); +#endif + }); + auto fut = add_task(lambda); + } + + void destroyViewer(FilamentViewer *viewer) + { + std::packaged_task lambda([=]() mutable + { + _render = false; + _viewer = nullptr; + destroy_filament_viewer(viewer); }); + auto fut = add_task(lambda); + fut.wait(); + } + + bool doRender() + { +#ifdef __EMSCRIPTEN__ + if (emscripten_is_webgl_context_lost(_context) == EM_TRUE) + { + Log("Context lost"); + auto sleepFor = std::chrono::seconds(1); + std::this_thread::sleep_for(sleepFor); + return; + } +#endif + auto rendered = render(_viewer, 0, nullptr, nullptr, nullptr); + if (_renderCallback) + { + _renderCallback(_renderCallbackOwner); + } + return rendered; +#ifdef __EMSCRIPTEN__ + // emscripten_webgl_commit_frame(); +#endif + } + + void setFrameIntervalInMilliseconds(float frameIntervalInMilliseconds) + { + std::unique_lock lock(_mutex); + _frameIntervalInMicroseconds = static_cast(1000.0f * frameIntervalInMilliseconds); + } + + template + auto add_task(std::packaged_task &pt) -> std::future + { + std::unique_lock lock(_mutex); + auto ret = pt.get_future(); + _tasks.push_back([pt = std::make_shared>( + std::move(pt))] + { (*pt)(); }); + _cv.notify_one(); + return ret; + } + +private: + bool _stop = false; + bool _render = false; + int _frameIntervalInMicroseconds = 1000000 / 60; + std::mutex _mutex; + std::condition_variable _cv; + void (*_renderCallback)(void *const) = nullptr; + void *_renderCallbackOwner = nullptr; + std::deque> _tasks; + FilamentViewer *_viewer = nullptr; + std::chrono::high_resolution_clock::time_point _lastFrameTime; + int _frameCount = 0; + float _accumulatedTime = 0.0f; + float _fps = 0.0f; + +#ifdef __EMSCRIPTEN__ + pthread_t t; + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE _context; +#else + std::thread *t = nullptr; +#endif +}; + +extern "C" +{ + + static RenderLoop *_rl; + + EMSCRIPTEN_KEEPALIVE void create_filament_viewer_render_thread( + void *const context, void *const platform, const char *uberArchivePath, + const void *const loader, + void (*renderCallback)(void *const renderCallbackOwner), + void *const renderCallbackOwner, + void (*callback)(void *const)) + { + + if (!_rl) + { + _rl = new RenderLoop(); + } + _rl->createViewer(context, platform, uberArchivePath, (const ResourceLoaderWrapper *const)loader, + renderCallback, renderCallbackOwner, callback); + } + + EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer_render_thread(void *const viewer) + { + _rl->destroyViewer((FilamentViewer *)viewer); + delete _rl; + _rl = nullptr; + } + + EMSCRIPTEN_KEEPALIVE void create_swap_chain_render_thread(void *const viewer, + void *const surface, + uint32_t width, + uint32_t height, + void (*onComplete)()) + { + std::packaged_task lambda( + [=]() mutable + { + create_swap_chain(viewer, surface, width, height); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0); }, onComplete); +#else + onComplete(); +#endif + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void destroy_swap_chain_render_thread(void *const viewer, void (*onComplete)()) + { + std::packaged_task lambda( + [=]() mutable + { + destroy_swap_chain(viewer); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0); }, onComplete); +#else + onComplete(); +#endif + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void create_render_target_render_thread(void *const viewer, + intptr_t nativeTextureId, + uint32_t width, + uint32_t height, + void (*onComplete)()) + { + std::packaged_task lambda([=]() mutable + { + create_render_target(viewer, nativeTextureId, width, height); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0); }, onComplete); +#else + onComplete(); +#endif + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(void *const viewer) + { + if (!_rl) + { + Log("No render loop!"); // PANIC? + } + else + { + _rl->requestFrame(); + } + } + + EMSCRIPTEN_KEEPALIVE void + set_frame_interval_render_thread(void *const viewer, float frameIntervalInMilliseconds) + { + _rl->setFrameIntervalInMilliseconds(frameIntervalInMilliseconds); + std::packaged_task lambda([=]() mutable + { ((FilamentViewer *)viewer)->setFrameInterval(frameIntervalInMilliseconds); }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void render_render_thread(void *const viewer) + { + std::packaged_task lambda([=]() mutable + { _rl->doRender(); }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void capture_render_thread(void *const viewer, uint8_t *pixelBuffer, void (*onComplete)()) + { + std::packaged_task lambda([=]() mutable + { capture(viewer, pixelBuffer, onComplete); }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void + set_background_color_render_thread(void *const viewer, const float r, const float g, + const float b, const float a) + { + std::packaged_task lambda( + [=]() mutable + { set_background_color(viewer, r, g, b, a); }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void load_gltf_render_thread(void *const sceneManager, + const char *path, + const char *relativeResourcePath, + bool keepData, + void (*callback)(EntityId)) + { + std::packaged_task lambda([=]() mutable + { + auto entity = load_gltf(sceneManager, path, relativeResourcePath, keepData); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ + moduleArg.dartFilamentResolveCallback($0, $1); + }, callback, entity); +#else + callback(entity); +#endif + return entity; }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void load_glb_render_thread(void *const sceneManager, + const char *path, + int numInstances, + bool keepData, + void (*callback)(EntityId)) + { + std::packaged_task lambda( + [=]() mutable + { + auto entity = load_glb(sceneManager, path, numInstances, keepData); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0, $1); }, callback, entity); +#else + callback(entity); +#endif + return entity; + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_render_thread(void *const sceneManager, + const uint8_t *const data, + size_t length, + int numInstances, + bool keepData, + int priority, + int layer, + void (*callback)(EntityId)) + { + std::packaged_task lambda( + [=]() mutable + { + auto entity = load_glb_from_buffer(sceneManager, data, length, keepData, priority, layer); + callback(entity); + return entity; + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void clear_background_image_render_thread(void *const viewer) + { + std::packaged_task lambda([=] + { clear_background_image(viewer); }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void set_background_image_render_thread(void *const viewer, + const char *path, + bool fillHeight, void (*callback)()) + { + std::packaged_task lambda( + [=] + { + set_background_image(viewer, path, fillHeight); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0); }, callback); +#else + callback(); +#endif + }); + auto fut = _rl->add_task(lambda); + } + EMSCRIPTEN_KEEPALIVE void set_background_image_position_render_thread(void *const viewer, + float x, float y, + bool clamp) + { + std::packaged_task lambda( + [=] + { set_background_image_position(viewer, x, y, clamp); }); + auto fut = _rl->add_task(lambda); + } + EMSCRIPTEN_KEEPALIVE void set_tone_mapping_render_thread(void *const viewer, + int toneMapping) + { + std::packaged_task lambda( + [=] + { set_tone_mapping(viewer, toneMapping); }); + auto fut = _rl->add_task(lambda); + } + EMSCRIPTEN_KEEPALIVE void set_bloom_render_thread(void *const viewer, float strength) + { + std::packaged_task lambda([=] + { set_bloom(viewer, strength); }); + auto fut = _rl->add_task(lambda); + } + EMSCRIPTEN_KEEPALIVE void load_skybox_render_thread(void *const viewer, + const char *skyboxPath, + void (*onComplete)()) + { + std::packaged_task lambda([=] + { + load_skybox(viewer, skyboxPath); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0); }, onComplete); +#else + onComplete(); +#endif + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void load_ibl_render_thread(void *const viewer, const char *iblPath, + float intensity) + { + std::packaged_task lambda( + [=] + { load_ibl(viewer, iblPath, intensity); }); + auto fut = _rl->add_task(lambda); + } + EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(void *const viewer) + { + std::packaged_task lambda([=] + { remove_skybox(viewer); }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void remove_ibl_render_thread(void *const viewer) + { + std::packaged_task lambda([=] + { remove_ibl(viewer); }); + auto fut = _rl->add_task(lambda); + } + + void add_light_render_thread( + void *const viewer, + uint8_t type, + float colour, + float intensity, + float posX, + float posY, + float posZ, + float dirX, + float dirY, + float dirZ, + float falloffRadius, + float spotLightConeInner, + float spotLightConeOuter, + float sunAngularRadius, + float sunHaloSize, + float sunHaloFallof, + bool shadows, + void (*callback)(EntityId)) + { + std::packaged_task lambda([=] + { + auto entity = add_light( + viewer, + type, + colour, + intensity, + posX, + posY, + posZ, + dirX, + dirY, + dirZ, + falloffRadius, + spotLightConeInner, + spotLightConeOuter, + sunAngularRadius, + sunHaloSize, + sunHaloFallof, + shadows); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ + moduleArg.dartFilamentResolveCallback($0, $1); + }, callback, entity); +#else + callback(entity); +#endif + + return entity; }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void remove_light_render_thread(void *const viewer, + EntityId entityId) + { + std::packaged_task lambda([=] + { remove_light(viewer, entityId); }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void clear_lights_render_thread(void *const viewer) + { + std::packaged_task lambda([=] + { clear_lights(viewer); }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void remove_entity_render_thread(void *const viewer, + EntityId asset, void (*callback)()) + { + std::packaged_task lambda([=] + { + remove_entity(viewer, asset); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0); }, callback); +#else + callback(); +#endif + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void clear_entities_render_thread(void *const viewer, void (*callback)()) + { + std::packaged_task lambda([=] + { + clear_entities(viewer); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0); }, callback); +#else + callback(); +#endif + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void set_camera_render_thread(void *const viewer, EntityId asset, + const char *nodeName, void (*callback)(bool)) + { + std::packaged_task lambda( + [=] + { + auto success = set_camera(viewer, asset, nodeName); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0, $1); }, callback, success); +#else + callback(success); +#endif + return success; + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void + get_morph_target_name_render_thread(void *sceneManager, EntityId assetEntity, + EntityId childEntity, char *const outPtr, int index, void (*callback)()) + { + std::packaged_task lambda([=] + { + get_morph_target_name(sceneManager, assetEntity, childEntity, outPtr, index); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0); }, callback); +#else + callback(); +#endif + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void + get_morph_target_name_count_render_thread(void *sceneManager, EntityId assetEntity, + EntityId childEntity, void (*callback)(int)) + { + std::packaged_task lambda([=] + { + auto count = get_morph_target_name_count(sceneManager, assetEntity, childEntity); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ + moduleArg.dartFilamentResolveCallback($0,$1); + }, callback, count); +#else + callback(count); +#endif + return count; }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void set_animation_frame_render_thread(void *const sceneManager, + EntityId asset, + int animationIndex, + int animationFrame) + { + std::packaged_task lambda([=] + { set_animation_frame(sceneManager, asset, animationIndex, animationFrame); }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void stop_animation_render_thread(void *const sceneManager, + EntityId asset, int index) + { + std::packaged_task lambda( + [=] + { stop_animation(sceneManager, asset, index); }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void get_animation_count_render_thread(void *const sceneManager, + EntityId asset, + void (*callback)(int)) + { + std::packaged_task lambda( + [=] + { + auto count = get_animation_count(sceneManager, asset); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0, $1); }, callback, count); +#else + callback(count); +#endif + return count; + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void get_animation_name_render_thread(void *const sceneManager, + EntityId asset, + char *const outPtr, + int index, + void (*callback)()) + { + std::packaged_task lambda( + [=] + { + get_animation_name(sceneManager, asset, outPtr, index); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0); }, callback); +#else + callback(); +#endif + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void set_post_processing_render_thread(void *const viewer, + bool enabled) + { + std::packaged_task lambda( + [=] + { set_post_processing(viewer, enabled); }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void + get_name_for_entity_render_thread(void *const sceneManager, const EntityId entityId, void (*callback)(const char *)) + { + std::packaged_task lambda( + [=] + { + auto name = get_name_for_entity(sceneManager, entityId); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0, $1); }, callback, name); +#else + callback(name); +#endif + return name; + }); + auto fut = _rl->add_task(lambda); + } + + void set_morph_target_weights_render_thread(void *const sceneManager, + EntityId asset, + const float *const morphData, + int numWeights, + void (*callback)(bool)) + { + std::packaged_task lambda( + [=] + { + auto result = set_morph_target_weights(sceneManager, asset, morphData, numWeights); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0, $1); }, callback, result); +#else + callback(result); +#endif + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void set_bone_transform_render_thread( + void *sceneManager, + EntityId asset, + int skinIndex, + int boneIndex, + const float *const transform, + void (*callback)(bool)) + { + std::packaged_task lambda( + [=] + { + auto success = set_bone_transform(sceneManager, asset, skinIndex, boneIndex, transform); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0, $1); }, callback, success); +#else + callback(success); +#endif + return success; + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void update_bone_matrices_render_thread(void *sceneManager, + EntityId entity, void (*callback)(bool)) + { + std::packaged_task lambda( + [=] + { + auto success = update_bone_matrices(sceneManager, entity); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0); }, callback, success); +#else + callback(success); +#endif + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_render_thread(void *const sceneManager, EntityId entityId, void (*callback)()) + { + std::packaged_task lambda( + [=] + { + reset_to_rest_pose(sceneManager, entityId); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0); }, callback); +#else + callback(); +#endif + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void create_geometry_render_thread( + void *const sceneManager, + float *vertices, + int numVertices, + float *normals, + int numNormals, + float *uvs, + int numUvs, + uint16_t *indices, + int numIndices, + int primitiveType, + TMaterialInstance *materialInstance, + bool keepData, + void (*callback)(EntityId)) + { + std::packaged_task lambda( + [=] + { + auto entity = create_geometry(sceneManager, vertices, numVertices, normals, numNormals, uvs, numUvs, indices, numIndices, primitiveType, materialInstance, keepData); +#ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0, $1); }, callback, entity); +#else + callback(entity); +#endif + return entity; + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void unproject_texture_render_thread(void *const viewer, EntityId entity, uint8_t *input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight, void (*callback)()) + { + std::packaged_task lambda( + [=] + { + unproject_texture(viewer, entity, input, inputWidth, inputHeight, out, outWidth, outHeight); + callback(); + }); + auto fut = _rl->add_task(lambda); + } +} diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index d940f47e..83985a5a 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -92,7 +92,8 @@ void main() async { print(frustum.plane5.normal); print(frustum.plane5.constant); - await viewer.setCameraLensProjection(near:10.0, far:1000.0, aspect:1.0, focalLength:28.0); + await viewer.setCameraLensProjection( + near: 10.0, far: 1000.0, aspect: 1.0, focalLength: 28.0); frustum = await viewer.getCameraFrustum(); print(frustum.plane5.normal); print(frustum.plane5.constant); @@ -459,7 +460,7 @@ void main() async { expect(materialInstance, isNotNull); // with depth write enabled on both materials, cube2 renders behind the white cube - await _capture(viewer, "material_instance_depth_write_enabled"); + await _capture(viewer, "material_instance_depth_write_enabled"); // if we disable depth write on cube1, then cube2 will always appear in front // (relying on insertion order) @@ -468,12 +469,11 @@ void main() async { // set priority for the cube1 cube to 7 (render) last, cube1 renders in front await viewer.setPriority(cube1, 7); - await _capture(viewer, "material_instance_depth_write_disabled_with_priority"); + await _capture( + viewer, "material_instance_depth_write_disabled_with_priority"); }); }); - - // test('create instance from glb when keepData is true', () async { // var model = await viewer.loadGlb("$testDir/cube.glb", keepData: true); // await viewer.transformToUnitCube(model); @@ -901,6 +901,16 @@ void main() async { }); }); + group("render thread", () { + test("request frame on render thread", () async { + var viewer = await createViewer(); + viewer.requestFrame(); + + await Future.delayed(Duration(milliseconds: 20)); + await viewer.dispose(); + }); + }); + group("unproject", () { test("unproject", () async { final dimensions = (width: 1280, height: 768); From 835338ef636798f4c8eeed86583bc9b5a1f0929c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 21 Sep 2024 10:22:49 +0800 Subject: [PATCH 220/232] (flutter) use scheduleFrameCallback to invoke requestFrame to match Flutter/vsync --- .../lib/thermion/widgets/thermion_widget.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart index d0a6bf94..c0d0eff4 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart @@ -56,10 +56,19 @@ class _ThermionWidgetState extends State { if (mounted) { setState(() {}); } + + _requestFrame(); }); super.initState(); } + void _requestFrame() { + WidgetsBinding.instance.scheduleFrameCallback((d) { + widget.viewer.requestFrame(); + _requestFrame(); + }); + } + bool _resizing = false; Timer? _resizeTimer; From e83193ba0df6f6121ffd4e3eccfdf9a421534b7f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 21 Sep 2024 11:36:41 +0800 Subject: [PATCH 221/232] introduce stronger native typing, camera projection/culling methods, update tests --- .../lib/thermion_dart/utils/matrix.dart | 9 +- .../thermion_dart/viewer/ffi/callbacks.dart | 12 +- .../thermion_dart/viewer/ffi/camera_ffi.dart | 22 ++ .../viewer/ffi/thermion_dart.g.dart | 350 +++++++++--------- .../viewer/ffi/thermion_viewer_ffi.dart | 84 +++-- .../viewer/shared_types/camera.dart | 12 +- .../viewer/thermion_viewer_base.dart | 15 +- .../viewer/thermion_viewer_stub.dart | 19 +- .../native/include/APIBoundaryTypes.h | 2 + .../native/include/FilamentViewer.hpp | 3 + .../native/include/ThermionDartApi.h | 111 +++--- .../include/ThermionDartRenderThreadApi.h | 56 +-- thermion_dart/native/src/ThermionDartApi.cpp | 122 +++--- .../src/ThermionDartRenderThreadApi.cpp | 63 ++-- thermion_dart/test/helpers.dart | 308 ++++++++++++++- thermion_dart/test/integration_test.dart | 25 ++ 16 files changed, 814 insertions(+), 399 deletions(-) create mode 100644 thermion_dart/lib/thermion_dart/viewer/ffi/camera_ffi.dart diff --git a/thermion_dart/lib/thermion_dart/utils/matrix.dart b/thermion_dart/lib/thermion_dart/utils/matrix.dart index 42c5647a..6b8ae389 100644 --- a/thermion_dart/lib/thermion_dart/utils/matrix.dart +++ b/thermion_dart/lib/thermion_dart/utils/matrix.dart @@ -24,14 +24,15 @@ Matrix4 double4x4ToMatrix4(double4x4 mat) { ]); } -double4x4 matrix4ToDouble4x4(Matrix4 mat, double4x4 out) { - +double4x4 matrix4ToDouble4x4(Matrix4 mat) { + final out = Struct.create(); + for (int i = 0; i < 4; i++) { out.col1[i] = mat.storage[i]; out.col2[i] = mat.storage[i + 4]; out.col3[i] = mat.storage[i + 8]; out.col4[i] = mat.storage[i + 12]; } - + return out; -} \ No newline at end of file +} diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/callbacks.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/callbacks.dart index c3bd3157..e36a430b 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/callbacks.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/callbacks.dart @@ -26,16 +26,16 @@ Future withVoidCallback( nativeCallable.close(); } -Future withVoidPointerCallback( - Function(Pointer)>>) +Future withPointerCallback( + Function(Pointer)>>) func) async { - final completer = Completer>(); + final completer = Completer>(); // ignore: prefer_function_declarations_over_variables - void Function(Pointer) callback = (Pointer ptr) { - completer.complete(ptr); + void Function(Pointer) callback = (Pointer ptr) { + completer.complete(ptr.cast()); }; final nativeCallable = - NativeCallable)>.listener(callback); + NativeCallable)>.listener(callback); func.call(nativeCallable.nativeFunction); var ptr = await completer.future; nativeCallable.close(); diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/camera_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/camera_ffi.dart new file mode 100644 index 00000000..d018b8ca --- /dev/null +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/camera_ffi.dart @@ -0,0 +1,22 @@ +import 'dart:ffi'; + +import 'package:thermion_dart/thermion_dart/utils/matrix.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_dart.g.dart'; +import 'package:thermion_dart/thermion_dart/viewer/shared_types/camera.dart'; +import 'package:vector_math/vector_math_64.dart'; + +class ThermionFFICamera extends Camera { + final Pointer pointer; + + ThermionFFICamera(this.pointer); + + @override + Future setProjectionMatrixWithCulling(Matrix4 projectionMatrix, + double near, double far) async { + Camera_setCustomProjectionWithCulling( + pointer, + matrix4ToDouble4x4(projectionMatrix), + near, + far); + } +} diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart index 11d59ae3..e63e4e2b 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_dart.g.dart @@ -17,129 +17,141 @@ external ffi.Pointer make_resource_loader( ); @ffi.Native< - ffi.Pointer Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer Function(ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Pointer)>(isLeaf: true) -external ffi.Pointer create_filament_viewer( +external ffi.Pointer create_filament_viewer( ffi.Pointer context, ffi.Pointer loader, ffi.Pointer platform, ffi.Pointer uberArchivePath, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void destroy_filament_viewer( - ffi.Pointer viewer, + ffi.Pointer viewer, ); -@ffi.Native Function(ffi.Pointer)>(isLeaf: true) +@ffi.Native Function(ffi.Pointer)>(isLeaf: true) external ffi.Pointer get_scene_manager( - ffi.Pointer viewer, + ffi.Pointer viewer, +); + +@ffi.Native Function(ffi.Pointer)>(isLeaf: true) +external ffi.Pointer Viewer_getEngine( + ffi.Pointer viewer, +); + +@ffi.Native Function(ffi.Pointer, EntityId)>( + isLeaf: true) +external ffi.Pointer Engine_getCameraComponent( + ffi.Pointer tEngine, + int entityId, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.IntPtr, ffi.Uint32, - ffi.Uint32)>(isLeaf: true) + ffi.Void Function( + ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32)>(isLeaf: true) external void create_render_target( - ffi.Pointer viewer, + ffi.Pointer viewer, int texture, int width, int height, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void clear_background_image( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Pointer, ffi.Bool)>(isLeaf: true) + ffi.Pointer, ffi.Pointer, ffi.Bool)>(isLeaf: true) external void set_background_image( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer path, bool fillHeight, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) + ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) external void set_background_image_position( - ffi.Pointer viewer, + ffi.Pointer viewer, double x, double y, bool clamp, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void set_background_color( - ffi.Pointer viewer, + ffi.Pointer viewer, double r, double g, double b, double a, ); -@ffi.Native, ffi.Int)>(isLeaf: true) +@ffi.Native, ffi.Int)>(isLeaf: true) external void set_tone_mapping( - ffi.Pointer viewer, + ffi.Pointer viewer, int toneMapping, ); -@ffi.Native, ffi.Float)>(isLeaf: true) +@ffi.Native, ffi.Float)>(isLeaf: true) external void set_bloom( - ffi.Pointer viewer, + ffi.Pointer viewer, double strength, ); -@ffi.Native, ffi.Pointer)>( +@ffi.Native, ffi.Pointer)>( isLeaf: true) external void load_skybox( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer skyboxPath, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Pointer, ffi.Float)>(isLeaf: true) + ffi.Pointer, ffi.Pointer, ffi.Float)>(isLeaf: true) external void load_ibl( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer iblPath, double intensity, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void create_ibl( - ffi.Pointer viewer, + ffi.Pointer viewer, double r, double g, double b, double intensity, ); -@ffi.Native, ffi.Pointer)>( +@ffi.Native, ffi.Pointer)>( isLeaf: true) external void rotate_ibl( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer rotationMatrix, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void remove_skybox( - ffi.Pointer viewer, + ffi.Pointer viewer, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void remove_ibl( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< EntityId Function( - ffi.Pointer, + ffi.Pointer, ffi.Uint8, ffi.Float, ffi.Float, @@ -157,7 +169,7 @@ external void remove_ibl( ffi.Float, ffi.Bool)>(isLeaf: true) external int add_light( - ffi.Pointer viewer, + ffi.Pointer viewer, int type, double colour, double intensity, @@ -176,22 +188,22 @@ external int add_light( bool shadows, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>(isLeaf: true) external void remove_light( - ffi.Pointer viewer, + ffi.Pointer viewer, int entityId, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void clear_lights( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void set_light_position( - ffi.Pointer viewer, + ffi.Pointer viewer, int light, double x, double y, @@ -199,10 +211,10 @@ external void set_light_position( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void set_light_direction( - ffi.Pointer viewer, + ffi.Pointer viewer, int light, double x, double y, @@ -262,34 +274,34 @@ external void get_instances( ffi.Pointer out, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void set_main_camera( - ffi.Pointer viewer, + ffi.Pointer viewer, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external int get_main_camera( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< ffi.Bool Function( - ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) + ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) external bool set_camera( - ffi.Pointer viewer, + ffi.Pointer viewer, int entity, ffi.Pointer nodeName, ); -@ffi.Native, ffi.Bool)>(isLeaf: true) +@ffi.Native, ffi.Bool)>(isLeaf: true) external void set_view_frustum_culling( - ffi.Pointer viewer, + ffi.Pointer viewer, bool enabled, ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, + ffi.Bool Function( + ffi.Pointer, ffi.Uint64, ffi.Pointer, ffi.Pointer< @@ -297,8 +309,8 @@ external void set_view_frustum_culling( ffi.Void Function(ffi.Pointer buf, ffi.Size size, ffi.Pointer data)>>, ffi.Pointer)>(isLeaf: true) -external void render( - ffi.Pointer viewer, +external bool render( + ffi.Pointer viewer, int frameTimeInNanos, ffi.Pointer pixelBuffer, ffi.Pointer< @@ -310,84 +322,84 @@ external void render( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Pointer>)>(isLeaf: true) external void capture( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer pixelBuffer, ffi.Pointer> callback, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Uint32, + ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Uint32, ffi.Uint32)>(isLeaf: true) external void create_swap_chain( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer window, int width, int height, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void destroy_swap_chain( - ffi.Pointer viewer, + ffi.Pointer viewer, ); -@ffi.Native, ffi.Float)>(isLeaf: true) +@ffi.Native, ffi.Float)>(isLeaf: true) external void set_frame_interval( - ffi.Pointer viewer, + ffi.Pointer viewer, double interval, ); -@ffi.Native, ffi.Uint32, ffi.Uint32)>( +@ffi.Native, ffi.Uint32, ffi.Uint32)>( isLeaf: true) external void update_viewport( - ffi.Pointer viewer, + ffi.Pointer viewer, int width, int height, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void scroll_begin( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void scroll_update( - ffi.Pointer viewer, + ffi.Pointer viewer, double x, double y, double z, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void scroll_end( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) + ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) external void grab_begin( - ffi.Pointer viewer, + ffi.Pointer viewer, double x, double y, bool pan, ); -@ffi.Native, ffi.Float, ffi.Float)>( +@ffi.Native, ffi.Float, ffi.Float)>( isLeaf: true) external void grab_update( - ffi.Pointer viewer, + ffi.Pointer viewer, double x, double y, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void grab_end( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< @@ -652,15 +664,15 @@ external int get_morph_target_name_count( int childEntity, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>(isLeaf: true) external void remove_entity( - ffi.Pointer viewer, + ffi.Pointer viewer, int asset, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void clear_entities( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< @@ -780,10 +792,10 @@ external void set_camera_model_matrix( double4x4 matrix, ); -@ffi.Native Function(ffi.Pointer, EntityId)>( +@ffi.Native Function(ffi.Pointer, EntityId)>( isLeaf: true) external ffi.Pointer get_camera( - ffi.Pointer viewer, + ffi.Pointer viewer, int entity, ); @@ -874,10 +886,10 @@ external void set_camera_focus_distance( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, _ManipulatorMode, ffi.Double, + ffi.Void Function(ffi.Pointer, _ManipulatorMode, ffi.Double, ffi.Double, ffi.Double)>(isLeaf: true) external void set_camera_manipulator_options( - ffi.Pointer viewer, + ffi.Pointer viewer, int mode, double orbitSpeedX, double orbitSpeedY, @@ -885,16 +897,22 @@ external void set_camera_manipulator_options( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, double4x4, double4x4, ffi.Double, - ffi.Double)>(isLeaf: true) + ffi.Void Function( + ffi.Pointer, double4x4, ffi.Double, ffi.Double)>(isLeaf: true) external void Camera_setCustomProjectionWithCulling( ffi.Pointer camera, double4x4 projectionMatrix, - double4x4 projectionMatrixForCulling, double near, double far, ); +@ffi.Native Function(ffi.Pointer, EntityId)>( + isLeaf: true) +external ffi.Pointer get_camera_component( + ffi.Pointer engine, + int entity, +); + @ffi.Native< ffi.Int Function( ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) @@ -913,37 +931,37 @@ external int reveal_mesh( ffi.Pointer meshName, ); -@ffi.Native, ffi.Bool)>(isLeaf: true) +@ffi.Native, ffi.Bool)>(isLeaf: true) external void set_post_processing( - ffi.Pointer viewer, + ffi.Pointer viewer, bool enabled, ); -@ffi.Native, ffi.Bool)>(isLeaf: true) +@ffi.Native, ffi.Bool)>(isLeaf: true) external void set_shadows_enabled( - ffi.Pointer viewer, + ffi.Pointer viewer, bool enabled, ); -@ffi.Native, ffi.Int)>(isLeaf: true) +@ffi.Native, ffi.Int)>(isLeaf: true) external void set_shadow_type( - ffi.Pointer viewer, + ffi.Pointer viewer, int shadowType, ); -@ffi.Native, ffi.Float, ffi.Float)>( +@ffi.Native, ffi.Float, ffi.Float)>( isLeaf: true) external void set_soft_shadow_options( - ffi.Pointer viewer, + ffi.Pointer viewer, double penumbraScale, double penumbraRatioScale, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Bool, ffi.Bool, ffi.Bool)>(isLeaf: true) + ffi.Pointer, ffi.Bool, ffi.Bool, ffi.Bool)>(isLeaf: true) external void set_antialiasing( - ffi.Pointer viewer, + ffi.Pointer viewer, bool msaa, bool fxaa, bool taa, @@ -951,7 +969,7 @@ external void set_antialiasing( @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, ffi.Int, ffi.Int, ffi.Pointer< @@ -959,7 +977,7 @@ external void set_antialiasing( ffi.Void Function( EntityId entityId, ffi.Int x, ffi.Int y)>>)>(isLeaf: true) external void filament_pick( - ffi.Pointer viewer, + ffi.Pointer viewer, int x, int y, ffi.Pointer< @@ -1012,16 +1030,16 @@ external ffi.Pointer get_entity_name_at( bool renderableOnly, ); -@ffi.Native, ffi.Bool)>(isLeaf: true) +@ffi.Native, ffi.Bool)>(isLeaf: true) external void set_recording( - ffi.Pointer viewer, + ffi.Pointer viewer, bool recording, ); -@ffi.Native, ffi.Pointer)>( +@ffi.Native, ffi.Pointer)>( isLeaf: true) external void set_recording_output_directory( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer outputDirectory, ); @@ -1267,7 +1285,7 @@ external void set_material_depth_write( @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, EntityId, ffi.Pointer, ffi.Uint32, @@ -1276,7 +1294,7 @@ external void set_material_depth_write( ffi.Uint32, ffi.Uint32)>(isLeaf: true) external void unproject_texture( - ffi.Pointer sceneManager, + ffi.Pointer viewer, int entity, ffi.Pointer input, int inputWidth, @@ -1348,8 +1366,7 @@ external void MaterialInstance_setDepthCulling( ffi.Pointer, ffi.Pointer< ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer viewer)>>)>(isLeaf: true) + ffi.Void Function(ffi.Pointer viewer)>>)>(isLeaf: true) external void create_filament_viewer_render_thread( ffi.Pointer context, ffi.Pointer platform, @@ -1361,19 +1378,19 @@ external void create_filament_viewer_render_thread( renderCallback, ffi.Pointer renderCallbackOwner, ffi.Pointer< - ffi.NativeFunction viewer)>> + ffi.NativeFunction viewer)>> callback, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, ffi.Pointer, ffi.Uint32, ffi.Uint32, ffi.Pointer>)>(isLeaf: true) external void create_swap_chain_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer surface, int width, int height, @@ -1381,39 +1398,39 @@ external void create_swap_chain_render_thread( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, + ffi.Void Function(ffi.Pointer, ffi.Pointer>)>(isLeaf: true) external void destroy_swap_chain_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer> onComplete, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32, + ffi.Void Function(ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32, ffi.Pointer>)>(isLeaf: true) external void create_render_target_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, int nativeTextureId, int width, int height, ffi.Pointer> onComplete, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void destroy_filament_viewer_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void render_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Pointer>)>(isLeaf: true) external void capture_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer out, ffi.Pointer> onComplete, ); @@ -1425,46 +1442,46 @@ external FilamentRenderCallback make_render_callback_fn_pointer( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Bool, + ffi.Void Function(ffi.Pointer, ffi.Bool, ffi.Pointer>)>(isLeaf: true) external void set_rendering_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, bool rendering, ffi.Pointer> onComplete, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void request_frame_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ); -@ffi.Native, ffi.Float)>(isLeaf: true) +@ffi.Native, ffi.Float)>(isLeaf: true) external void set_frame_interval_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, double frameInterval, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void set_background_color_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, double r, double g, double b, double a, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void clear_background_image_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Bool, + ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Bool, ffi.Pointer>)>(isLeaf: true) external void set_background_image_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer path, bool fillHeight, ffi.Pointer> onComplete, @@ -1472,57 +1489,57 @@ external void set_background_image_render_thread( @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) + ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) external void set_background_image_position_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, double x, double y, bool clamp, ); -@ffi.Native, ffi.Int)>(isLeaf: true) +@ffi.Native, ffi.Int)>(isLeaf: true) external void set_tone_mapping_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, int toneMapping, ); -@ffi.Native, ffi.Float)>(isLeaf: true) +@ffi.Native, ffi.Float)>(isLeaf: true) external void set_bloom_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, double strength, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Pointer>)>(isLeaf: true) external void load_skybox_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer skyboxPath, ffi.Pointer> onComplete, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Pointer, ffi.Float)>(isLeaf: true) + ffi.Pointer, ffi.Pointer, ffi.Float)>(isLeaf: true) external void load_ibl_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer iblPath, double intensity, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void remove_skybox_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void remove_ibl_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, ffi.Uint8, ffi.Float, ffi.Float, @@ -1542,7 +1559,7 @@ external void remove_ibl_render_thread( ffi.Pointer>)>( isLeaf: true) external void add_light_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, int type, double colour, double intensity, @@ -1562,15 +1579,15 @@ external void add_light_render_thread( ffi.Pointer> callback, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>(isLeaf: true) external void remove_light_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, int entityId, ); -@ffi.Native)>(isLeaf: true) +@ffi.Native)>(isLeaf: true) external void clear_lights_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ); @ffi.Native< @@ -1638,31 +1655,28 @@ external void create_instance_render_thread( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>)>(isLeaf: true) external void remove_entity_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, int asset, ffi.Pointer> callback, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, + ffi.Void Function(ffi.Pointer, ffi.Pointer>)>(isLeaf: true) external void clear_entities_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, ffi.Pointer> callback, ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - ffi.Pointer, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, ffi.Pointer>)>( isLeaf: true) external void set_camera_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, int asset, ffi.Pointer nodeName, ffi.Pointer> callback, @@ -1794,9 +1808,9 @@ external void set_bone_transform_render_thread( ffi.Pointer> callback, ); -@ffi.Native, ffi.Bool)>(isLeaf: true) +@ffi.Native, ffi.Bool)>(isLeaf: true) external void set_post_processing_render_thread( - ffi.Pointer viewer, + ffi.Pointer viewer, bool enabled, ); @@ -1843,7 +1857,7 @@ external void create_geometry_render_thread( @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, EntityId, ffi.Pointer, ffi.Uint32, @@ -1853,7 +1867,7 @@ external void create_geometry_render_thread( ffi.Uint32, ffi.Pointer>)>(isLeaf: true) external void unproject_texture_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer viewer, int entity, ffi.Pointer input, int inputWidth, @@ -1868,6 +1882,10 @@ final class TCamera extends ffi.Opaque {} final class TMaterialInstance extends ffi.Opaque {} +final class TEngine extends ffi.Opaque {} + +final class TViewer extends ffi.Opaque {} + final class TMaterialKey extends ffi.Struct { @ffi.Bool() external bool doubleSided; diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index 0afbf003..8eb359fc 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:ffi'; import 'dart:math'; import 'dart:typed_data'; import 'package:animation_tools_dart/animation_tools_dart.dart'; @@ -8,6 +7,8 @@ import 'package:thermion_dart/thermion_dart/entities/gizmo.dart'; import 'package:thermion_dart/thermion_dart/utils/matrix.dart'; import 'package:thermion_dart/thermion_dart/viewer/events.dart'; import 'package:thermion_dart/thermion_dart/viewer/ffi/callbacks.dart'; +import 'package:thermion_dart/thermion_dart/viewer/ffi/camera_ffi.dart'; +import 'package:thermion_dart/thermion_dart/viewer/shared_types/camera.dart'; import 'package:vector_math/vector_math_64.dart'; import 'package:vector_math/vector_math_64.dart' as v64; import '../thermion_viewer_base.dart'; @@ -25,7 +26,7 @@ class ThermionViewerFFI extends ThermionViewer { Pointer? _sceneManager; - Pointer? _viewer; + Pointer? _viewer; final String? uberArchivePath; @@ -102,7 +103,7 @@ class ThermionViewerFFI extends ThermionViewer { Future updateViewportAndCameraProjection(double width, double height) async { viewportDimensions = (width * pixelRatio, height * pixelRatio); update_viewport(_viewer!, width.toInt(), height.toInt()); - var mainCamera = get_camera(_viewer!, await getMainCamera()); + var mainCamera = await getMainCamera() as ThermionFFICamera; var near = await getCameraCullingNear(); if (near.abs() < 0.000001) { near = kNear; @@ -113,11 +114,12 @@ class ThermionViewerFFI extends ThermionViewer { } var aspect = viewportDimensions.$1 / viewportDimensions.$2; - var focalLength = get_camera_focal_length(mainCamera); + var focalLength = get_camera_focal_length(mainCamera.pointer); if (focalLength.abs() < 0.1) { focalLength = kFocalLength; } - set_camera_lens_projection(mainCamera, near, far, aspect, focalLength); + set_camera_lens_projection( + mainCamera.pointer, near, far, aspect, focalLength); } Future createSwapChain(double width, double height, @@ -141,8 +143,8 @@ class ThermionViewerFFI extends ThermionViewer { final uberarchivePtr = uberArchivePath?.toNativeUtf8(allocator: allocator).cast() ?? nullptr; - var viewer = await withVoidPointerCallback( - (Pointer)>> callback) { + var viewer = await withPointerCallback( + (Pointer)>> callback) { create_filament_viewer_render_thread( _sharedContext, _driver, @@ -1144,8 +1146,25 @@ class ThermionViewerFFI extends ThermionViewer { set_main_camera(_viewer!); } - Future getMainCamera() { - return Future.value(get_main_camera(_viewer!)); + /// + /// + /// + Future getMainCameraEntity() async { + return get_main_camera(_viewer!); + } + + /// + /// + /// + Future getMainCamera() async { + var camera = await getCameraComponent(await getMainCameraEntity()); + return camera!; + } + + Future getCameraComponent(ThermionEntity cameraEntity) async { + var engine = Viewer_getEngine(_viewer!); + var camera = Engine_getCameraComponent(engine, cameraEntity); + return ThermionFFICamera(camera); } /// @@ -1229,8 +1248,8 @@ class ThermionViewerFFI extends ThermionViewer { /// /// Future getCameraFov(bool horizontal) async { - var mainCamera = get_camera(_viewer!, await getMainCamera()); - return get_camera_fov(mainCamera, horizontal); + var mainCamera = await getMainCamera() as ThermionFFICamera; + return get_camera_fov(mainCamera.pointer, horizontal); } /// @@ -1258,8 +1277,8 @@ class ThermionViewerFFI extends ThermionViewer { } Future getCameraNear() async { - var mainCamera = get_camera(_viewer!, await getMainCamera()); - return get_camera_near(mainCamera); + var mainCamera = await getMainCamera() as ThermionFFICamera; + return get_camera_near(mainCamera.pointer); } /// @@ -1267,8 +1286,8 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future getCameraCullingFar() async { - var mainCamera = get_camera(_viewer!, await getMainCamera()); - return get_camera_culling_far(mainCamera); + var mainCamera = await getMainCamera() as ThermionFFICamera; + return get_camera_culling_far(mainCamera.pointer); } /// @@ -1276,8 +1295,8 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setCameraFocusDistance(double focusDistance) async { - var mainCamera = get_camera(_viewer!, await getMainCamera()); - set_camera_focus_distance(mainCamera, focusDistance); + var mainCamera = await getMainCamera() as ThermionFFICamera; + set_camera_focus_distance(mainCamera.pointer, focusDistance); } /// @@ -1312,8 +1331,8 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setCameraExposure( double aperture, double shutterSpeed, double sensitivity) async { - var mainCamera = get_camera(_viewer!, await getMainCamera()); - set_camera_exposure(mainCamera, aperture, shutterSpeed, sensitivity); + var mainCamera = await getMainCamera() as ThermionFFICamera; + set_camera_exposure(mainCamera.pointer, aperture, shutterSpeed, sensitivity); } /// @@ -1341,10 +1360,9 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setCameraModelMatrix4(Matrix4 modelMatrix) async { - var mainCamera = get_camera(_viewer!, await getMainCamera()); - final out = Struct.create(); - matrix4ToDouble4x4(modelMatrix, out); - set_camera_model_matrix(mainCamera, out); + var mainCamera = await getMainCamera() as ThermionFFICamera; + final out = matrix4ToDouble4x4(modelMatrix); + set_camera_model_matrix(mainCamera.pointer, out); } /// @@ -1576,8 +1594,8 @@ class ThermionViewerFFI extends ThermionViewer { if (_viewer == null) { throw Exception("No viewer available"); } - var mainCamera = get_camera(_viewer!, await getMainCamera()); - var matrixStruct = get_camera_view_matrix(mainCamera); + var mainCamera = await getMainCamera() as ThermionFFICamera; + var matrixStruct = get_camera_view_matrix(mainCamera.pointer); return double4x4ToMatrix4(matrixStruct); } @@ -1589,8 +1607,8 @@ class ThermionViewerFFI extends ThermionViewer { if (_viewer == null) { throw Exception("No viewer available"); } - var mainCamera = get_camera(_viewer!, await getMainCamera()); - var matrixStruct = get_camera_model_matrix(mainCamera); + var mainCamera = await getMainCamera() as ThermionFFICamera; + var matrixStruct = get_camera_model_matrix(mainCamera.pointer); return double4x4ToMatrix4(matrixStruct); } @@ -1602,8 +1620,8 @@ class ThermionViewerFFI extends ThermionViewer { if (_viewer == null) { throw Exception("No viewer available"); } - var mainCamera = get_camera(_viewer!, await getMainCamera()); - var matrixStruct = get_camera_projection_matrix(mainCamera); + var mainCamera = await getMainCamera() as ThermionFFICamera; + var matrixStruct = get_camera_projection_matrix(mainCamera.pointer); return double4x4ToMatrix4(matrixStruct); } @@ -1615,8 +1633,8 @@ class ThermionViewerFFI extends ThermionViewer { if (_viewer == null) { throw Exception("No viewer available"); } - var mainCamera = get_camera(_viewer!, await getMainCamera()); - var matrixStruct = get_camera_culling_projection_matrix(mainCamera); + var mainCamera = await getMainCamera() as ThermionFFICamera; + var matrixStruct = get_camera_culling_projection_matrix(mainCamera.pointer); return double4x4ToMatrix4(matrixStruct); } @@ -1675,8 +1693,8 @@ class ThermionViewerFFI extends ThermionViewer { if (_viewer == null) { throw Exception("No viewer available"); } - var mainCamera = get_camera(_viewer!, await getMainCamera()); - var arrayPtr = get_camera_frustum(mainCamera); + var mainCamera = await getMainCamera() as ThermionFFICamera; + var arrayPtr = get_camera_frustum(mainCamera.pointer); var doubleList = arrayPtr.asTypedList(24); var frustum = Frustum(); diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart index 5854c732..d08c4eff 100644 --- a/thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart @@ -1,6 +1,8 @@ -// abstract class Camera { -// Future setProjectionMatrixWithCulling(Matrix4 projectionMatrix, Matrix4 projectionMatrixForCUlling); -// Future setDepthCullingEnabled(bool enabled); -// } +import 'package:vector_math/vector_math_64.dart'; + +abstract class Camera { + + Future setProjectionMatrixWithCulling(Matrix4 projectionMatrix, double near, double far); + +} -enum AlphaMode { OPAQUE, MASK, BLEND } diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart index 5faecd12..01e6be1e 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart @@ -1,4 +1,5 @@ import 'package:thermion_dart/thermion_dart/viewer/events.dart'; +import 'package:thermion_dart/thermion_dart/viewer/shared_types/camera.dart'; import 'shared_types/shared_types.dart'; export 'shared_types/shared_types.dart'; @@ -444,9 +445,14 @@ abstract class ThermionViewer { Future setMainCamera(); /// - /// Returns the entity associated with the main camera. + /// Returns the entity associated with the main camera. You probably never need this; use getMainCamera instead. /// - Future getMainCamera(); + Future getMainCameraEntity(); + + /// + /// Returns the entity associated with the main camera. You probably never need this; use getMainCamera instead. + /// + Future getMainCamera(); /// /// Sets the horizontal field of view (if [horizontal] is true) or vertical field of view for the currently active camera to [degrees]. @@ -498,7 +504,10 @@ abstract class ThermionViewer { /// /// /// - Future setCameraLensProjection({double near = kNear, double far = kFar, double? aspect, + Future setCameraLensProjection( + {double near = kNear, + double far = kFar, + double? aspect, double focalLength = kFocalLength}); /// diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart index 273809e0..5f9f2615 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_stub.dart @@ -4,6 +4,7 @@ import 'dart:typed_data'; import 'package:thermion_dart/thermion_dart/entities/abstract_gizmo.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_dart/thermion_dart/viewer/events.dart'; +import 'package:thermion_dart/thermion_dart/viewer/shared_types/camera.dart'; import 'package:thermion_dart/thermion_dart/viewer/thermion_viewer_base.dart'; import 'package:vector_math/vector_math_64.dart'; import 'dart:async'; @@ -214,12 +215,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future getMainCamera() { - // TODO: implement getMainCamera - throw UnimplementedError(); - } - @override Future> getMorphTargetNames( ThermionEntity entity, ThermionEntity childEntity) { @@ -958,6 +953,18 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement setCameraLensProjection throw UnimplementedError(); } + + @override + Future getMainCameraEntity() { + // TODO: implement getMainCameraEntity + throw UnimplementedError(); + } + + @override + Future getMainCamera() { + // TODO: implement getMainCamera + throw UnimplementedError(); + } } diff --git a/thermion_dart/native/include/APIBoundaryTypes.h b/thermion_dart/native/include/APIBoundaryTypes.h index e4f7d730..61a83cb7 100644 --- a/thermion_dart/native/include/APIBoundaryTypes.h +++ b/thermion_dart/native/include/APIBoundaryTypes.h @@ -11,6 +11,8 @@ extern "C" typedef int32_t _ManipulatorMode; typedef struct TCamera TCamera; typedef struct TMaterialInstance TMaterialInstance; + typedef struct TEngine TEngine; + typedef struct TViewer TViewer; struct TMaterialKey { bool doubleSided = 1; diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index a98e99f9..d8ee5058 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -112,6 +112,9 @@ namespace thermion_filament void scrollUpdate(float x, float y, float delta); void scrollEnd(); void pick(uint32_t x, uint32_t y, void (*callback)(EntityId entityId, int x, int y)); + Engine* getEngine() { + return _engine; + } EntityId addLight( LightManager::Type t, diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 19e33e33..aa619773 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -54,24 +54,29 @@ extern "C" { #endif - EMSCRIPTEN_KEEPALIVE const void *create_filament_viewer(const void *const context, const void *const loader, void *const platform, const char *uberArchivePath); - EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer(const void *const viewer); - EMSCRIPTEN_KEEPALIVE void *get_scene_manager(const void *const viewer); - EMSCRIPTEN_KEEPALIVE void create_render_target(const void *const viewer, intptr_t texture, uint32_t width, uint32_t height); - EMSCRIPTEN_KEEPALIVE void clear_background_image(const void *const viewer); - EMSCRIPTEN_KEEPALIVE void set_background_image(const void *const viewer, const char *path, bool fillHeight); - EMSCRIPTEN_KEEPALIVE void set_background_image_position(const void *const viewer, float x, float y, bool clamp); - EMSCRIPTEN_KEEPALIVE void set_background_color(const void *const viewer, const float r, const float g, const float b, const float a); - EMSCRIPTEN_KEEPALIVE void set_tone_mapping(const void *const viewer, int toneMapping); - EMSCRIPTEN_KEEPALIVE void set_bloom(const void *const viewer, float strength); - EMSCRIPTEN_KEEPALIVE void load_skybox(const void *const viewer, const char *skyboxPath); - EMSCRIPTEN_KEEPALIVE void load_ibl(const void *const viewer, const char *iblPath, float intensity); - EMSCRIPTEN_KEEPALIVE void create_ibl(const void *const viewer, float r, float g, float b, float intensity); - EMSCRIPTEN_KEEPALIVE void rotate_ibl(const void *const viewer, float *rotationMatrix); - EMSCRIPTEN_KEEPALIVE void remove_skybox(const void *const viewer); - EMSCRIPTEN_KEEPALIVE void remove_ibl(const void *const viewer); + EMSCRIPTEN_KEEPALIVE TViewer *create_filament_viewer(const void *const context, const void *const loader, void *const platform, const char *uberArchivePath); + EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void *get_scene_manager(TViewer *viewer); + + // Engine + EMSCRIPTEN_KEEPALIVE TEngine *Viewer_getEngine(TViewer* viewer); + EMSCRIPTEN_KEEPALIVE TCamera *Engine_getCameraComponent(TEngine* tEngine, EntityId entityId); + + EMSCRIPTEN_KEEPALIVE void create_render_target(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height); + EMSCRIPTEN_KEEPALIVE void clear_background_image(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void set_background_image(TViewer *viewer, const char *path, bool fillHeight); + EMSCRIPTEN_KEEPALIVE void set_background_image_position(TViewer *viewer, float x, float y, bool clamp); + EMSCRIPTEN_KEEPALIVE void set_background_color(TViewer *viewer, const float r, const float g, const float b, const float a); + EMSCRIPTEN_KEEPALIVE void set_tone_mapping(TViewer *viewer, int toneMapping); + EMSCRIPTEN_KEEPALIVE void set_bloom(TViewer *viewer, float strength); + EMSCRIPTEN_KEEPALIVE void load_skybox(TViewer *viewer, const char *skyboxPath); + EMSCRIPTEN_KEEPALIVE void load_ibl(TViewer *viewer, const char *iblPath, float intensity); + EMSCRIPTEN_KEEPALIVE void create_ibl(TViewer *viewer, float r, float g, float b, float intensity); + EMSCRIPTEN_KEEPALIVE void rotate_ibl(TViewer *viewer, float *rotationMatrix); + EMSCRIPTEN_KEEPALIVE void remove_skybox(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void remove_ibl(TViewer *viewer); EMSCRIPTEN_KEEPALIVE EntityId add_light( - const void *const viewer, + TViewer *viewer, uint8_t type, float colour, float intensity, @@ -88,40 +93,40 @@ extern "C" float sunHaloSize, float sunHaloFallof, bool shadows); - EMSCRIPTEN_KEEPALIVE void remove_light(const void *const viewer, EntityId entityId); - EMSCRIPTEN_KEEPALIVE void clear_lights(const void *const viewer); - EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, EntityId light, float x, float y, float z); - EMSCRIPTEN_KEEPALIVE void set_light_direction(const void *const viewer, EntityId light, float x, float y, float z); + EMSCRIPTEN_KEEPALIVE void remove_light(TViewer *viewer, EntityId entityId); + EMSCRIPTEN_KEEPALIVE void clear_lights(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void set_light_position(TViewer *viewer, EntityId light, float x, float y, float z); + EMSCRIPTEN_KEEPALIVE void set_light_direction(TViewer *viewer, EntityId light, float x, float y, float z); EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances, bool keepData); EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length, bool keepData, int priority, int layer); EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath, bool keepData); EMSCRIPTEN_KEEPALIVE EntityId create_instance(void *sceneManager, EntityId id); EMSCRIPTEN_KEEPALIVE int get_instance_count(void *sceneManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE void get_instances(void *sceneManager, EntityId entityId, EntityId *out); - EMSCRIPTEN_KEEPALIVE void set_main_camera(const void *const viewer); - EMSCRIPTEN_KEEPALIVE EntityId get_main_camera(const void *const viewer); - EMSCRIPTEN_KEEPALIVE bool set_camera(const void *const viewer, EntityId entity, const char *nodeName); - EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(const void *const viewer, bool enabled); + EMSCRIPTEN_KEEPALIVE void set_main_camera(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE EntityId get_main_camera(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE bool set_camera(TViewer *viewer, EntityId entity, const char *nodeName); + EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(TViewer *viewer, bool enabled); EMSCRIPTEN_KEEPALIVE bool render( - const void *const viewer, + TViewer *viewer, uint64_t frameTimeInNanos, void *pixelBuffer, void (*callback)(void *buf, size_t size, void *data), void *data); EMSCRIPTEN_KEEPALIVE void capture( - const void *const viewer, + TViewer *viewer, uint8_t *pixelBuffer, void (*callback)(void)); - EMSCRIPTEN_KEEPALIVE void create_swap_chain(const void *const viewer, const void *const window, uint32_t width, uint32_t height); - EMSCRIPTEN_KEEPALIVE void destroy_swap_chain(const void *const viewer); - EMSCRIPTEN_KEEPALIVE void set_frame_interval(const void *const viewer, float interval); - EMSCRIPTEN_KEEPALIVE void update_viewport(const void *const viewer, uint32_t width, uint32_t height); - EMSCRIPTEN_KEEPALIVE void scroll_begin(const void *const viewer); - EMSCRIPTEN_KEEPALIVE void scroll_update(const void *const viewer, float x, float y, float z); - EMSCRIPTEN_KEEPALIVE void scroll_end(const void *const viewer); - EMSCRIPTEN_KEEPALIVE void grab_begin(const void *const viewer, float x, float y, bool pan); - EMSCRIPTEN_KEEPALIVE void grab_update(const void *const viewer, float x, float y); - EMSCRIPTEN_KEEPALIVE void grab_end(const void *const viewer); + EMSCRIPTEN_KEEPALIVE void create_swap_chain(TViewer *viewer, const void *const window, uint32_t width, uint32_t height); + EMSCRIPTEN_KEEPALIVE void destroy_swap_chain(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void set_frame_interval(TViewer *viewer, float interval); + EMSCRIPTEN_KEEPALIVE void update_viewport(TViewer *viewer, uint32_t width, uint32_t height); + EMSCRIPTEN_KEEPALIVE void scroll_begin(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void scroll_update(TViewer *viewer, float x, float y, float z); + EMSCRIPTEN_KEEPALIVE void scroll_end(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void grab_begin(TViewer *viewer, float x, float y, bool pan); + EMSCRIPTEN_KEEPALIVE void grab_update(TViewer *viewer, float x, float y); + EMSCRIPTEN_KEEPALIVE void grab_end(TViewer *viewer); EMSCRIPTEN_KEEPALIVE void apply_weights( void *sceneManager, EntityId entity, @@ -194,8 +199,8 @@ extern "C" EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(void *sceneManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE void get_morph_target_name(void *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index); EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(void *sceneManager, EntityId assetEntity, EntityId childEntity); - EMSCRIPTEN_KEEPALIVE void remove_entity(const void *const viewer, EntityId asset); - EMSCRIPTEN_KEEPALIVE void clear_entities(const void *const viewer); + EMSCRIPTEN_KEEPALIVE void remove_entity(TViewer *viewer, EntityId asset); + EMSCRIPTEN_KEEPALIVE void clear_entities(TViewer *viewer); EMSCRIPTEN_KEEPALIVE bool set_material_color(void *sceneManager, EntityId entity, const char *meshName, int materialIndex, const float r, const float g, const float b, const float a); EMSCRIPTEN_KEEPALIVE void transform_to_unit_cube(void *sceneManager, EntityId asset); EMSCRIPTEN_KEEPALIVE void queue_position_update(void *sceneManager, EntityId entity, float x, float y, float z, bool relative); @@ -207,10 +212,10 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_scale(void *sceneManager, EntityId entity, float scale); // Camera methods - EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(const void *const viewer, bool enabled); + EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(TViewer *viewer, bool enabled); EMSCRIPTEN_KEEPALIVE void set_camera_exposure(TCamera *camera, float aperture, float shutterSpeed, float sensitivity); EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(TCamera *camera, double4x4 matrix); - EMSCRIPTEN_KEEPALIVE TCamera *get_camera(const void *const viewer, EntityId entity); + EMSCRIPTEN_KEEPALIVE TCamera *get_camera(TViewer *viewer, EntityId entity); EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(TCamera *const camera); EMSCRIPTEN_KEEPALIVE double4x4 get_camera_model_matrix(TCamera *const camera); EMSCRIPTEN_KEEPALIVE double4x4 get_camera_view_matrix(TCamera *const camera); @@ -224,25 +229,27 @@ extern "C" EMSCRIPTEN_KEEPALIVE float get_camera_fov(TCamera *camera, bool horizontal); EMSCRIPTEN_KEEPALIVE void set_camera_lens_projection(TCamera *camera, double near, double far, double aspect, double focalLength); EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(TCamera *camera, float focusDistance); - EMSCRIPTEN_KEEPALIVE void set_camera_manipulator_options(const void *const viewer, _ManipulatorMode mode, double orbitSpeedX, double orbitSpeedY, double zoomSpeed); - EMSCRIPTEN_KEEPALIVE void Camera_setCustomProjectionWithCulling(TCamera* camera, double4x4 projectionMatrix, double4x4 projectionMatrixForCulling, double near, double far); + EMSCRIPTEN_KEEPALIVE void set_camera_manipulator_options(TViewer *viewer, _ManipulatorMode mode, double orbitSpeedX, double orbitSpeedY, double zoomSpeed); + EMSCRIPTEN_KEEPALIVE void Camera_setCustomProjectionWithCulling(TCamera* camera, double4x4 projectionMatrix, double near, double far); + EMSCRIPTEN_KEEPALIVE TCamera *get_camera_component(TEngine *engine, EntityId entity); + EMSCRIPTEN_KEEPALIVE int hide_mesh(void *sceneManager, EntityId entity, const char *meshName); EMSCRIPTEN_KEEPALIVE int reveal_mesh(void *sceneManager, EntityId entity, const char *meshName); - EMSCRIPTEN_KEEPALIVE void set_post_processing(void *const viewer, bool enabled); - EMSCRIPTEN_KEEPALIVE void set_shadows_enabled(void *const viewer, bool enabled); - EMSCRIPTEN_KEEPALIVE void set_shadow_type(void *const viewer, int shadowType); - EMSCRIPTEN_KEEPALIVE void set_soft_shadow_options(void *const viewer, float penumbraScale, float penumbraRatioScale); - EMSCRIPTEN_KEEPALIVE void set_antialiasing(void *const viewer, bool msaa, bool fxaa, bool taa); - EMSCRIPTEN_KEEPALIVE void filament_pick(void *const viewer, int x, int y, void (*callback)(EntityId entityId, int x, int y)); + EMSCRIPTEN_KEEPALIVE void set_post_processing(TViewer *viewer, bool enabled); + EMSCRIPTEN_KEEPALIVE void set_shadows_enabled(TViewer *viewer, bool enabled); + EMSCRIPTEN_KEEPALIVE void set_shadow_type(TViewer *viewer, int shadowType); + EMSCRIPTEN_KEEPALIVE void set_soft_shadow_options(TViewer *viewer, float penumbraScale, float penumbraRatioScale); + EMSCRIPTEN_KEEPALIVE void set_antialiasing(TViewer *viewer, bool msaa, bool fxaa, bool taa); + EMSCRIPTEN_KEEPALIVE void filament_pick(TViewer *viewer, int x, int y, void (*callback)(EntityId entityId, int x, int y)); EMSCRIPTEN_KEEPALIVE const char *get_name_for_entity(void *const sceneManager, const EntityId entityId); EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(void *const sceneManager, const EntityId parent, const char *name); EMSCRIPTEN_KEEPALIVE int get_entity_count(void *const sceneManager, const EntityId target, bool renderableOnly); EMSCRIPTEN_KEEPALIVE void get_entities(void *const sceneManager, const EntityId target, bool renderableOnly, EntityId *out); EMSCRIPTEN_KEEPALIVE const char *get_entity_name_at(void *const sceneManager, const EntityId target, int index, bool renderableOnly); - EMSCRIPTEN_KEEPALIVE void set_recording(void *const viewer, bool recording); - EMSCRIPTEN_KEEPALIVE void set_recording_output_directory(void *const viewer, const char *outputDirectory); + EMSCRIPTEN_KEEPALIVE void set_recording(TViewer *viewer, bool recording); + EMSCRIPTEN_KEEPALIVE void set_recording_output_directory(TViewer *viewer, const char *outputDirectory); EMSCRIPTEN_KEEPALIVE void ios_dummy(); EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr); EMSCRIPTEN_KEEPALIVE void add_collision_component(void *const sceneManager, EntityId entityId, void (*callback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform); @@ -281,7 +288,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_material_property_int(void *const sceneManager, EntityId entity, int materialIndex, const char *property, int value); EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, double4 value); EMSCRIPTEN_KEEPALIVE void set_material_depth_write(void *const sceneManager, EntityId entity, int materialIndex, bool enabled); - EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const sceneManager, EntityId entity,uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight); + EMSCRIPTEN_KEEPALIVE void unproject_texture(TViewer* viewer, EntityId entity,uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight); EMSCRIPTEN_KEEPALIVE void *const create_texture(void *const sceneManager, uint8_t *data, size_t length); EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void *const texture); EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(void *const sceneManager, EntityId entity, void *const texture, const char *parameterName, int materialIndex); diff --git a/thermion_dart/native/include/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/ThermionDartRenderThreadApi.h index 33892b52..a11a4b03 100644 --- a/thermion_dart/native/include/ThermionDartRenderThreadApi.h +++ b/thermion_dart/native/include/ThermionDartRenderThreadApi.h @@ -24,29 +24,29 @@ extern "C" const void *const loader, void (*renderCallback)(void *const renderCallbackOwner), void *const renderCallbackOwner, - void (*callback)(void *const viewer)); - EMSCRIPTEN_KEEPALIVE void create_swap_chain_render_thread(void *const viewer, void *const surface, uint32_t width, uint32_t height, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void destroy_swap_chain_render_thread(void *const viewer, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void create_render_target_render_thread(void *const viewer, intptr_t nativeTextureId, uint32_t width, uint32_t height, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer_render_thread(void *const viewer); - EMSCRIPTEN_KEEPALIVE void render_render_thread(void *const viewer); - EMSCRIPTEN_KEEPALIVE void capture_render_thread(void *const viewer, uint8_t* out, void (*onComplete)()); + void (*callback)(TViewer *viewer)); + EMSCRIPTEN_KEEPALIVE void create_swap_chain_render_thread(TViewer *viewer, void *const surface, uint32_t width, uint32_t height, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void destroy_swap_chain_render_thread(TViewer *viewer, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void create_render_target_render_thread(TViewer *viewer, intptr_t nativeTextureId, uint32_t width, uint32_t height, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer_render_thread(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void render_render_thread(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void capture_render_thread(TViewer *viewer, uint8_t* out, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE FilamentRenderCallback make_render_callback_fn_pointer(FilamentRenderCallback); - EMSCRIPTEN_KEEPALIVE void set_rendering_render_thread(void *const viewer, bool rendering, void(*onComplete)()); - EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(void *const viewer); - EMSCRIPTEN_KEEPALIVE void set_frame_interval_render_thread(void *const viewer, float frameInterval); - EMSCRIPTEN_KEEPALIVE void set_background_color_render_thread(void *const viewer, const float r, const float g, const float b, const float a); - EMSCRIPTEN_KEEPALIVE void clear_background_image_render_thread(void *const viewer); - EMSCRIPTEN_KEEPALIVE void set_background_image_render_thread(void *const viewer, const char *path, bool fillHeight, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void set_background_image_position_render_thread(void *const viewer, float x, float y, bool clamp); - EMSCRIPTEN_KEEPALIVE void set_tone_mapping_render_thread(void *const viewer, int toneMapping); - EMSCRIPTEN_KEEPALIVE void set_bloom_render_thread(void *const viewer, float strength); - EMSCRIPTEN_KEEPALIVE void load_skybox_render_thread(void *const viewer, const char *skyboxPath, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void load_ibl_render_thread(void *const viewer, const char *iblPath, float intensity); - EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(void *const viewer); - EMSCRIPTEN_KEEPALIVE void remove_ibl_render_thread(void *const viewer); + EMSCRIPTEN_KEEPALIVE void set_rendering_render_thread(TViewer *viewer, bool rendering, void(*onComplete)()); + EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void set_frame_interval_render_thread(TViewer *viewer, float frameInterval); + EMSCRIPTEN_KEEPALIVE void set_background_color_render_thread(TViewer *viewer, const float r, const float g, const float b, const float a); + EMSCRIPTEN_KEEPALIVE void clear_background_image_render_thread(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void set_background_image_render_thread(TViewer *viewer, const char *path, bool fillHeight, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void set_background_image_position_render_thread(TViewer *viewer, float x, float y, bool clamp); + EMSCRIPTEN_KEEPALIVE void set_tone_mapping_render_thread(TViewer *viewer, int toneMapping); + EMSCRIPTEN_KEEPALIVE void set_bloom_render_thread(TViewer *viewer, float strength); + EMSCRIPTEN_KEEPALIVE void load_skybox_render_thread(TViewer *viewer, const char *skyboxPath, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void load_ibl_render_thread(TViewer *viewer, const char *iblPath, float intensity); + EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void remove_ibl_render_thread(TViewer *viewer); EMSCRIPTEN_KEEPALIVE void add_light_render_thread( - void *const viewer, + TViewer *viewer, uint8_t type, float colour, float intensity, @@ -64,15 +64,15 @@ extern "C" float sunHaloFallof, bool shadows, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void remove_light_render_thread(void *const viewer, EntityId entityId); - EMSCRIPTEN_KEEPALIVE void clear_lights_render_thread(void *const viewer); + EMSCRIPTEN_KEEPALIVE void remove_light_render_thread(TViewer *viewer, EntityId entityId); + EMSCRIPTEN_KEEPALIVE void clear_lights_render_thread(TViewer *viewer); EMSCRIPTEN_KEEPALIVE void load_glb_render_thread(void *const sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_render_thread(void *const sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, int priority, int layer, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void load_gltf_render_thread(void *const sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void create_instance_render_thread(void *const sceneManager, EntityId entityId, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void remove_entity_render_thread(void *const viewer, EntityId asset, void (*callback)()); - EMSCRIPTEN_KEEPALIVE void clear_entities_render_thread(void *const viewer, void (*callback)()); - EMSCRIPTEN_KEEPALIVE void set_camera_render_thread(void *const viewer, EntityId asset, const char *nodeName, void (*callback)(bool)); + EMSCRIPTEN_KEEPALIVE void remove_entity_render_thread(TViewer *viewer, EntityId asset, void (*callback)()); + EMSCRIPTEN_KEEPALIVE void clear_entities_render_thread(TViewer *viewer, void (*callback)()); + EMSCRIPTEN_KEEPALIVE void set_camera_render_thread(TViewer *viewer, EntityId asset, const char *nodeName, void (*callback)(bool)); EMSCRIPTEN_KEEPALIVE void apply_weights_render_thread( void *const sceneManager, EntityId asset, @@ -100,7 +100,7 @@ extern "C" int boneIndex, const float *const transform, void (*callback)(bool)); - EMSCRIPTEN_KEEPALIVE void set_post_processing_render_thread(void *const viewer, bool enabled); + EMSCRIPTEN_KEEPALIVE void set_post_processing_render_thread(TViewer *viewer, bool enabled); EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_render_thread(void *const sceneManager, EntityId entityId, void(*callback)()); EMSCRIPTEN_KEEPALIVE void create_geometry_render_thread( void *const sceneManager, @@ -116,7 +116,7 @@ extern "C" TMaterialInstance *materialInstance, bool keepData, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void unproject_texture_render_thread(void *const sceneManager, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()); + EMSCRIPTEN_KEEPALIVE void unproject_texture_render_thread(TViewer* viewer, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t* out, uint32_t outWidth, uint32_t outHeight, void(*callback)()); #ifdef __cplusplus diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 0654a054..234230b0 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -44,69 +44,74 @@ extern "C" filament::math::float4{float(d_mat.col4[0]), float(d_mat.col4[1]), float(d_mat.col4[2]), float(d_mat.col4[3])}}; } - EMSCRIPTEN_KEEPALIVE const void *create_filament_viewer(const void *context, const void *const loader, void *const platform, const char *uberArchivePath) + EMSCRIPTEN_KEEPALIVE TViewer *create_filament_viewer(const void *context, const void *const loader, void *const platform, const char *uberArchivePath) { const auto *loaderImpl = new ResourceLoaderWrapperImpl((ResourceLoaderWrapper *)loader); - auto viewer = (const void *)new FilamentViewer(context, loaderImpl, platform, uberArchivePath); - return viewer; + auto viewer = new FilamentViewer(context, loaderImpl, platform, uberArchivePath); + return reinterpret_cast(viewer); } - EMSCRIPTEN_KEEPALIVE void create_render_target(const void *const viewer, intptr_t texture, uint32_t width, uint32_t height) + EMSCRIPTEN_KEEPALIVE TEngine *Viewer_getEngine(TViewer* viewer) { + auto* engine = reinterpret_cast(viewer)->getEngine(); + return reinterpret_cast(engine); + } + + EMSCRIPTEN_KEEPALIVE void create_render_target(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height) { ((FilamentViewer *)viewer)->createRenderTarget(texture, width, height); } - EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer(TViewer *viewer) { delete ((FilamentViewer *)viewer); } - EMSCRIPTEN_KEEPALIVE void set_background_color(const void *const viewer, const float r, const float g, const float b, const float a) + EMSCRIPTEN_KEEPALIVE void set_background_color(TViewer *viewer, const float r, const float g, const float b, const float a) { ((FilamentViewer *)viewer)->setBackgroundColor(r, g, b, a); } - EMSCRIPTEN_KEEPALIVE void clear_background_image(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void clear_background_image(TViewer *viewer) { ((FilamentViewer *)viewer)->clearBackgroundImage(); } - EMSCRIPTEN_KEEPALIVE void set_background_image(const void *const viewer, const char *path, bool fillHeight) + EMSCRIPTEN_KEEPALIVE void set_background_image(TViewer *viewer, const char *path, bool fillHeight) { ((FilamentViewer *)viewer)->setBackgroundImage(path, fillHeight); } - EMSCRIPTEN_KEEPALIVE void set_background_image_position(const void *const viewer, float x, float y, bool clamp) + EMSCRIPTEN_KEEPALIVE void set_background_image_position(TViewer *viewer, float x, float y, bool clamp) { ((FilamentViewer *)viewer)->setBackgroundImagePosition(x, y, clamp); } - EMSCRIPTEN_KEEPALIVE void set_tone_mapping(const void *const viewer, int toneMapping) + EMSCRIPTEN_KEEPALIVE void set_tone_mapping(TViewer *viewer, int toneMapping) { ((FilamentViewer *)viewer)->setToneMapping((ToneMapping)toneMapping); } - EMSCRIPTEN_KEEPALIVE void set_bloom(const void *const viewer, float strength) + EMSCRIPTEN_KEEPALIVE void set_bloom(TViewer *viewer, float strength) { ((FilamentViewer *)viewer)->setBloom(strength); } - EMSCRIPTEN_KEEPALIVE void load_skybox(const void *const viewer, const char *skyboxPath) + EMSCRIPTEN_KEEPALIVE void load_skybox(TViewer *viewer, const char *skyboxPath) { ((FilamentViewer *)viewer)->loadSkybox(skyboxPath); } - EMSCRIPTEN_KEEPALIVE void create_ibl(const void *const viewer, float r, float g, float b, float intensity) + EMSCRIPTEN_KEEPALIVE void create_ibl(TViewer *viewer, float r, float g, float b, float intensity) { ((FilamentViewer *)viewer)->createIbl(r, g, b, intensity); } - EMSCRIPTEN_KEEPALIVE void load_ibl(const void *const viewer, const char *iblPath, float intensity) + EMSCRIPTEN_KEEPALIVE void load_ibl(TViewer *viewer, const char *iblPath, float intensity) { ((FilamentViewer *)viewer)->loadIbl(iblPath, intensity); } - EMSCRIPTEN_KEEPALIVE void rotate_ibl(const void *const viewer, float *rotationMatrix) + EMSCRIPTEN_KEEPALIVE void rotate_ibl(TViewer *viewer, float *rotationMatrix) { math::mat3f matrix(rotationMatrix[0], rotationMatrix[1], rotationMatrix[2], @@ -120,18 +125,18 @@ extern "C" ((FilamentViewer *)viewer)->rotateIbl(matrix); } - EMSCRIPTEN_KEEPALIVE void remove_skybox(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void remove_skybox(TViewer *viewer) { ((FilamentViewer *)viewer)->removeSkybox(); } - EMSCRIPTEN_KEEPALIVE void remove_ibl(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void remove_ibl(TViewer *viewer) { ((FilamentViewer *)viewer)->removeIbl(); } EMSCRIPTEN_KEEPALIVE EntityId add_light( - const void *const viewer, + TViewer *viewer, uint8_t type, float colour, float intensity, @@ -152,22 +157,22 @@ extern "C" return ((FilamentViewer *)viewer)->addLight((LightManager::Type)type, colour, intensity, posX, posY, posZ, dirX, dirY, dirZ, falloffRadius, spotLightConeInner, spotLightConeOuter, sunAngularRadius, sunHaloSize, sunHaloFallof, shadows); } - EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, int32_t entityId, float x, float y, float z) + EMSCRIPTEN_KEEPALIVE void set_light_position(TViewer *viewer, int32_t entityId, float x, float y, float z) { ((FilamentViewer *)viewer)->setLightPosition(entityId, x, y, z); } - EMSCRIPTEN_KEEPALIVE void set_light_direction(const void *const viewer, int32_t entityId, float x, float y, float z) + EMSCRIPTEN_KEEPALIVE void set_light_direction(TViewer *viewer, int32_t entityId, float x, float y, float z) { ((FilamentViewer *)viewer)->setLightDirection(entityId, x, y, z); } - EMSCRIPTEN_KEEPALIVE void remove_light(const void *const viewer, int32_t entityId) + EMSCRIPTEN_KEEPALIVE void remove_light(TViewer *viewer, int32_t entityId) { ((FilamentViewer *)viewer)->removeLight(entityId); } - EMSCRIPTEN_KEEPALIVE void clear_lights(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void clear_lights(TViewer *viewer) { ((FilamentViewer *)viewer)->clearLights(); } @@ -202,17 +207,17 @@ extern "C" return ((SceneManager *)sceneManager)->loadGltf(assetPath, relativePath, keepData); } - EMSCRIPTEN_KEEPALIVE void set_main_camera(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void set_main_camera(TViewer *viewer) { return ((FilamentViewer *)viewer)->setMainCamera(); } - EMSCRIPTEN_KEEPALIVE EntityId get_main_camera(const void *const viewer) + EMSCRIPTEN_KEEPALIVE EntityId get_main_camera(TViewer *viewer) { return ((FilamentViewer *)viewer)->getMainCamera(); } - EMSCRIPTEN_KEEPALIVE bool set_camera(const void *const viewer, EntityId asset, const char *nodeName) + EMSCRIPTEN_KEEPALIVE bool set_camera(TViewer *viewer, EntityId asset, const char *nodeName) { return ((FilamentViewer *)viewer)->setCamera(asset, nodeName); } @@ -235,7 +240,7 @@ extern "C" cam->setProjection(fovInDegrees, aspect, near, far, horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL); } - EMSCRIPTEN_KEEPALIVE TCamera *get_camera(const void *const viewer, EntityId entity) + EMSCRIPTEN_KEEPALIVE TCamera *get_camera(TViewer *viewer, EntityId entity) { auto filamentCamera = ((FilamentViewer *)viewer)->getCamera(entity); return reinterpret_cast(filamentCamera); @@ -309,12 +314,12 @@ extern "C" return array; } - EMSCRIPTEN_KEEPALIVE void set_camera_manipulator_options(const void *const viewer, _ManipulatorMode mode, double orbitSpeedX, double orbitSpeedY, double zoomSpeed) + EMSCRIPTEN_KEEPALIVE void set_camera_manipulator_options(TViewer *viewer, _ManipulatorMode mode, double orbitSpeedX, double orbitSpeedY, double zoomSpeed) { ((FilamentViewer *)viewer)->setCameraManipulatorOptions((filament::camutils::Mode)mode, orbitSpeedX, orbitSpeedY, zoomSpeed); } - EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(const void *const viewer, bool enabled) + EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(TViewer *viewer, bool enabled) { ((FilamentViewer *)viewer)->setViewFrustumCulling(enabled); } @@ -339,17 +344,17 @@ extern "C" } EMSCRIPTEN_KEEPALIVE bool render( - const void *const viewer, + TViewer *viewer, uint64_t frameTimeInNanos, void *pixelBuffer, void (*callback)(void *buf, size_t size, void *data), void *data) { - return ((FilamentViewer *)viewer)->render(frameTimeInNanos, pixelBuffer, callback, data); + return ((FilamentViewer *)viewer)->render(frameTimeInNanos, pixelBuffer, callback, data); } EMSCRIPTEN_KEEPALIVE void capture( - const void *const viewer, + TViewer *viewer, uint8_t *pixelBuffer, void (*callback)(void)) { @@ -362,58 +367,58 @@ extern "C" }; EMSCRIPTEN_KEEPALIVE void set_frame_interval( - const void *const viewer, + TViewer *viewer, float frameInterval) { ((FilamentViewer *)viewer)->setFrameInterval(frameInterval); } - EMSCRIPTEN_KEEPALIVE void destroy_swap_chain(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void destroy_swap_chain(TViewer *viewer) { ((FilamentViewer *)viewer)->destroySwapChain(); } - EMSCRIPTEN_KEEPALIVE void create_swap_chain(const void *const viewer, const void *const window, uint32_t width, uint32_t height) + EMSCRIPTEN_KEEPALIVE void create_swap_chain(TViewer *viewer, const void *const window, uint32_t width, uint32_t height) { ((FilamentViewer *)viewer)->createSwapChain(window, width, height); } - EMSCRIPTEN_KEEPALIVE void update_viewport(const void *const viewer, uint32_t width, uint32_t height) + EMSCRIPTEN_KEEPALIVE void update_viewport(TViewer *viewer, uint32_t width, uint32_t height) { return ((FilamentViewer *)viewer)->updateViewport(width, height); } - EMSCRIPTEN_KEEPALIVE void scroll_update(const void *const viewer, float x, float y, float delta) + EMSCRIPTEN_KEEPALIVE void scroll_update(TViewer *viewer, float x, float y, float delta) { ((FilamentViewer *)viewer)->scrollUpdate(x, y, delta); } - EMSCRIPTEN_KEEPALIVE void scroll_begin(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void scroll_begin(TViewer *viewer) { ((FilamentViewer *)viewer)->scrollBegin(); } - EMSCRIPTEN_KEEPALIVE void scroll_end(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void scroll_end(TViewer *viewer) { ((FilamentViewer *)viewer)->scrollEnd(); } - EMSCRIPTEN_KEEPALIVE void grab_begin(const void *const viewer, float x, float y, bool pan) + EMSCRIPTEN_KEEPALIVE void grab_begin(TViewer *viewer, float x, float y, bool pan) { ((FilamentViewer *)viewer)->grabBegin(x, y, pan); } - EMSCRIPTEN_KEEPALIVE void grab_update(const void *const viewer, float x, float y) + EMSCRIPTEN_KEEPALIVE void grab_update(TViewer *viewer, float x, float y) { ((FilamentViewer *)viewer)->grabUpdate(x, y); } - EMSCRIPTEN_KEEPALIVE void grab_end(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void grab_end(TViewer *viewer) { ((FilamentViewer *)viewer)->grabEnd(); } - EMSCRIPTEN_KEEPALIVE void *get_scene_manager(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void *get_scene_manager(TViewer *viewer) { return (void *)((FilamentViewer *)viewer)->getSceneManager(); } @@ -475,27 +480,27 @@ extern "C" ((SceneManager *)sceneManager)->addBoneAnimation(asset, skinIndex, boneIndex, frameData, numFrames, frameLengthInMs, fadeOutInSecs, fadeInInSecs, maxDelta); } - EMSCRIPTEN_KEEPALIVE void set_post_processing(void *const viewer, bool enabled) + EMSCRIPTEN_KEEPALIVE void set_post_processing(TViewer *viewer, bool enabled) { ((FilamentViewer *)viewer)->setPostProcessing(enabled); } - EMSCRIPTEN_KEEPALIVE void set_shadows_enabled(void *const viewer, bool enabled) + EMSCRIPTEN_KEEPALIVE void set_shadows_enabled(TViewer *viewer, bool enabled) { ((FilamentViewer *)viewer)->setShadowsEnabled(enabled); } - EMSCRIPTEN_KEEPALIVE void set_shadow_type(void *const viewer, int shadowType) + EMSCRIPTEN_KEEPALIVE void set_shadow_type(TViewer *viewer, int shadowType) { ((FilamentViewer *)viewer)->setShadowType((ShadowType)shadowType); } - EMSCRIPTEN_KEEPALIVE void set_soft_shadow_options(void *const viewer, float penumbraScale, float penumbraRatioScale) + EMSCRIPTEN_KEEPALIVE void set_soft_shadow_options(TViewer *viewer, float penumbraScale, float penumbraRatioScale) { ((FilamentViewer *)viewer)->setSoftShadowOptions(penumbraScale, penumbraRatioScale); } - EMSCRIPTEN_KEEPALIVE void set_antialiasing(void *const viewer, bool msaa, bool fxaa, bool taa) + EMSCRIPTEN_KEEPALIVE void set_antialiasing(TViewer *viewer, bool msaa, bool fxaa, bool taa) { ((FilamentViewer *)viewer)->setAntiAliasing(msaa, fxaa, taa); } @@ -721,12 +726,12 @@ extern "C" strcpy(outPtr, name.c_str()); } - EMSCRIPTEN_KEEPALIVE void remove_entity(const void *const viewer, EntityId asset) + EMSCRIPTEN_KEEPALIVE void remove_entity(TViewer *viewer, EntityId asset) { ((FilamentViewer *)viewer)->removeEntity(asset); } - EMSCRIPTEN_KEEPALIVE void clear_entities(const void *const viewer) + EMSCRIPTEN_KEEPALIVE void clear_entities(TViewer *viewer) { ((FilamentViewer *)viewer)->clearEntities(); } @@ -791,7 +796,7 @@ extern "C" return ((SceneManager *)sceneManager)->reveal(asset, meshName); } - EMSCRIPTEN_KEEPALIVE void filament_pick(void *const viewer, int x, int y, void (*callback)(EntityId entityId, int x, int y)) + EMSCRIPTEN_KEEPALIVE void filament_pick(TViewer *viewer, int x, int y, void (*callback)(EntityId entityId, int x, int y)) { ((FilamentViewer *)viewer)->pick(static_cast(x), static_cast(y), callback); } @@ -816,12 +821,12 @@ extern "C" return ((SceneManager *)sceneManager)->getEntityNameAt(target, index, renderableOnly); } - EMSCRIPTEN_KEEPALIVE void set_recording(void *const viewer, bool recording) + EMSCRIPTEN_KEEPALIVE void set_recording(TViewer *viewer, bool recording) { ((FilamentViewer *)viewer)->setRecording(recording); } - EMSCRIPTEN_KEEPALIVE void set_recording_output_directory(void *const viewer, const char *outputDirectory) + EMSCRIPTEN_KEEPALIVE void set_recording_output_directory(TViewer *viewer, const char *outputDirectory) { ((FilamentViewer *)viewer)->setRecordingOutputDirectory(outputDirectory); } @@ -987,7 +992,7 @@ extern "C" ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, filamentValue); } - EMSCRIPTEN_KEEPALIVE void unproject_texture(void *const viewer, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight) + EMSCRIPTEN_KEEPALIVE void unproject_texture(TViewer *viewer, EntityId entity, uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight) { ((FilamentViewer *)viewer)->unprojectTexture(entity, input, inputWidth, inputHeight, out, outWidth, outHeight); } @@ -1058,7 +1063,14 @@ EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance* ma reinterpret_cast(materialInstance)->setDepthCulling(enabled); } -EMSCRIPTEN_KEEPALIVE void Camera_setCustomProjectionWithCulling(TCamera* camera, double4x4 projectionMatrix, double4x4 projectionMatrixForCulling, double near, double far) { - reinterpret_cast(camera)->setCustomProjection(convert_double4x4_to_mat4(projectionMatrix), convert_double4x4_to_mat4(projectionMatrixForCulling), near, far); +EMSCRIPTEN_KEEPALIVE void Camera_setCustomProjectionWithCulling(TCamera* tCamera, double4x4 projectionMatrix, double near, double far) { + auto * camera = reinterpret_cast(tCamera); + camera->setCustomProjection(convert_double4x4_to_mat4(projectionMatrix), near, far); +} + +EMSCRIPTEN_KEEPALIVE TCamera *Engine_getCameraComponent(TEngine* tEngine, EntityId entityId) { + auto * engine = reinterpret_cast(tEngine); + auto * camera = engine->getCameraComponent(utils::Entity::import(entityId)); + return reinterpret_cast(camera); } } diff --git a/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp b/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp index ab509990..23a7676a 100644 --- a/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp +++ b/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp @@ -133,7 +133,7 @@ public: const ResourceLoaderWrapper *const loader, void (*renderCallback)(void *), void *const owner, - void (*callback)(void *const)) + void (*callback)(TViewer*)) { _renderCallback = renderCallback; _renderCallbackOwner = owner; @@ -155,7 +155,8 @@ public: _viewer = (FilamentViewer *)create_filament_viewer((void *const)_context, loader, platform, uberArchivePath); MAIN_THREAD_EM_ASM({ moduleArg.dartFilamentResolveCallback($0, $1); }, callback, _viewer); #else - _viewer = (FilamentViewer *)create_filament_viewer(context, loader, platform, uberArchivePath); + auto viewer = (FilamentViewer *)create_filament_viewer(context, loader, platform, uberArchivePath); + _viewer = reinterpret_cast(viewer); callback(_viewer); #endif }); @@ -168,7 +169,7 @@ public: { _render = false; _viewer = nullptr; - destroy_filament_viewer(viewer); }); + destroy_filament_viewer(reinterpret_cast(viewer)); }); auto fut = add_task(lambda); fut.wait(); } @@ -222,7 +223,7 @@ private: void (*_renderCallback)(void *const) = nullptr; void *_renderCallbackOwner = nullptr; std::deque> _tasks; - FilamentViewer *_viewer = nullptr; + TViewer *_viewer = nullptr; std::chrono::high_resolution_clock::time_point _lastFrameTime; int _frameCount = 0; float _accumulatedTime = 0.0f; @@ -246,7 +247,7 @@ extern "C" const void *const loader, void (*renderCallback)(void *const renderCallbackOwner), void *const renderCallbackOwner, - void (*callback)(void *const)) + void (*callback)(TViewer *)) { if (!_rl) @@ -257,14 +258,14 @@ extern "C" renderCallback, renderCallbackOwner, callback); } - EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer_render_thread(void *const viewer) + EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer_render_thread(TViewer *viewer) { _rl->destroyViewer((FilamentViewer *)viewer); delete _rl; _rl = nullptr; } - EMSCRIPTEN_KEEPALIVE void create_swap_chain_render_thread(void *const viewer, + EMSCRIPTEN_KEEPALIVE void create_swap_chain_render_thread(TViewer *viewer, void *const surface, uint32_t width, uint32_t height, @@ -283,7 +284,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void destroy_swap_chain_render_thread(void *const viewer, void (*onComplete)()) + EMSCRIPTEN_KEEPALIVE void destroy_swap_chain_render_thread(TViewer *viewer, void (*onComplete)()) { std::packaged_task lambda( [=]() mutable @@ -298,7 +299,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void create_render_target_render_thread(void *const viewer, + EMSCRIPTEN_KEEPALIVE void create_render_target_render_thread(TViewer *viewer, intptr_t nativeTextureId, uint32_t width, uint32_t height, @@ -316,7 +317,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(void *const viewer) + EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(TViewer *viewer) { if (!_rl) { @@ -329,7 +330,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void - set_frame_interval_render_thread(void *const viewer, float frameIntervalInMilliseconds) + set_frame_interval_render_thread(TViewer *viewer, float frameIntervalInMilliseconds) { _rl->setFrameIntervalInMilliseconds(frameIntervalInMilliseconds); std::packaged_task lambda([=]() mutable @@ -337,14 +338,14 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void render_render_thread(void *const viewer) + EMSCRIPTEN_KEEPALIVE void render_render_thread(TViewer *viewer) { std::packaged_task lambda([=]() mutable { _rl->doRender(); }); auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void capture_render_thread(void *const viewer, uint8_t *pixelBuffer, void (*onComplete)()) + EMSCRIPTEN_KEEPALIVE void capture_render_thread(TViewer *viewer, uint8_t *pixelBuffer, void (*onComplete)()) { std::packaged_task lambda([=]() mutable { capture(viewer, pixelBuffer, onComplete); }); @@ -352,7 +353,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void - set_background_color_render_thread(void *const viewer, const float r, const float g, + set_background_color_render_thread(TViewer *viewer, const float r, const float g, const float b, const float a) { std::packaged_task lambda( @@ -420,14 +421,14 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void clear_background_image_render_thread(void *const viewer) + EMSCRIPTEN_KEEPALIVE void clear_background_image_render_thread(TViewer *viewer) { std::packaged_task lambda([=] { clear_background_image(viewer); }); auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void set_background_image_render_thread(void *const viewer, + EMSCRIPTEN_KEEPALIVE void set_background_image_render_thread(TViewer *viewer, const char *path, bool fillHeight, void (*callback)()) { @@ -443,7 +444,7 @@ extern "C" }); auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void set_background_image_position_render_thread(void *const viewer, + EMSCRIPTEN_KEEPALIVE void set_background_image_position_render_thread(TViewer *viewer, float x, float y, bool clamp) { @@ -452,7 +453,7 @@ extern "C" { set_background_image_position(viewer, x, y, clamp); }); auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void set_tone_mapping_render_thread(void *const viewer, + EMSCRIPTEN_KEEPALIVE void set_tone_mapping_render_thread(TViewer *viewer, int toneMapping) { std::packaged_task lambda( @@ -460,13 +461,13 @@ extern "C" { set_tone_mapping(viewer, toneMapping); }); auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void set_bloom_render_thread(void *const viewer, float strength) + EMSCRIPTEN_KEEPALIVE void set_bloom_render_thread(TViewer *viewer, float strength) { std::packaged_task lambda([=] { set_bloom(viewer, strength); }); auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void load_skybox_render_thread(void *const viewer, + EMSCRIPTEN_KEEPALIVE void load_skybox_render_thread(TViewer *viewer, const char *skyboxPath, void (*onComplete)()) { @@ -482,7 +483,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void load_ibl_render_thread(void *const viewer, const char *iblPath, + EMSCRIPTEN_KEEPALIVE void load_ibl_render_thread(TViewer *viewer, const char *iblPath, float intensity) { std::packaged_task lambda( @@ -490,14 +491,14 @@ extern "C" { load_ibl(viewer, iblPath, intensity); }); auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(void *const viewer) + EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(TViewer *viewer) { std::packaged_task lambda([=] { remove_skybox(viewer); }); auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void remove_ibl_render_thread(void *const viewer) + EMSCRIPTEN_KEEPALIVE void remove_ibl_render_thread(TViewer *viewer) { std::packaged_task lambda([=] { remove_ibl(viewer); }); @@ -505,7 +506,7 @@ extern "C" } void add_light_render_thread( - void *const viewer, + TViewer *viewer, uint8_t type, float colour, float intensity, @@ -556,7 +557,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void remove_light_render_thread(void *const viewer, + EMSCRIPTEN_KEEPALIVE void remove_light_render_thread(TViewer *viewer, EntityId entityId) { std::packaged_task lambda([=] @@ -564,14 +565,14 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void clear_lights_render_thread(void *const viewer) + EMSCRIPTEN_KEEPALIVE void clear_lights_render_thread(TViewer *viewer) { std::packaged_task lambda([=] { clear_lights(viewer); }); auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void remove_entity_render_thread(void *const viewer, + EMSCRIPTEN_KEEPALIVE void remove_entity_render_thread(TViewer *viewer, EntityId asset, void (*callback)()) { std::packaged_task lambda([=] @@ -586,7 +587,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void clear_entities_render_thread(void *const viewer, void (*callback)()) + EMSCRIPTEN_KEEPALIVE void clear_entities_render_thread(TViewer *viewer, void (*callback)()) { std::packaged_task lambda([=] { @@ -600,7 +601,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void set_camera_render_thread(void *const viewer, EntityId asset, + EMSCRIPTEN_KEEPALIVE void set_camera_render_thread(TViewer *viewer, EntityId asset, const char *nodeName, void (*callback)(bool)) { std::packaged_task lambda( @@ -707,7 +708,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void set_post_processing_render_thread(void *const viewer, + EMSCRIPTEN_KEEPALIVE void set_post_processing_render_thread(TViewer *viewer, bool enabled) { std::packaged_task lambda( @@ -834,7 +835,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void unproject_texture_render_thread(void *const viewer, EntityId entity, uint8_t *input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight, void (*callback)()) + EMSCRIPTEN_KEEPALIVE void unproject_texture_render_thread(TViewer* viewer, EntityId entity, uint8_t *input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight, void (*callback)()) { std::packaged_task lambda( [=] diff --git a/thermion_dart/test/helpers.dart b/thermion_dart/test/helpers.dart index 6b1cb195..76a366e8 100644 --- a/thermion_dart/test/helpers.dart +++ b/thermion_dart/test/helpers.dart @@ -10,8 +10,7 @@ import 'package:thermion_dart/thermion_dart/utils/dart_resources.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_dart.g.dart'; import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart'; - -final viewportDimensions = (width: 500, height: 500); +import 'package:vector_math/vector_math_64.dart'; /// Test files are run in a variety of ways, find this package root in all. /// @@ -107,7 +106,8 @@ Future pixelBufferToBmp( return data; } -Future bmpToPng(Uint8List pixelBuffer, int width, int height) async { +Future pixelsToPng(Uint8List pixelBuffer, int width, int height, + {bool linearToSrgb = false}) async { final image = img.Image(width: width, height: height); for (int y = 0; y < height; y++) { @@ -126,13 +126,23 @@ Future bmpToPng(Uint8List pixelBuffer, int width, int height) async { b = _inverseACESToneMapping(b); } - // Convert from linear to sRGB - final int sRgbR = _linearToSRGB(r); - final int sRgbG = _linearToSRGB(g); - final int sRgbB = _linearToSRGB(b); + if (linearToSrgb) { + // Convert from linear to sRGB - image.setPixel( - x, y, img.ColorUint8(4)..setRgba(sRgbR, sRgbG, sRgbB, 1.0)); + image.setPixel( + x, + y, + img.ColorUint8(4) + ..setRgba( + _linearToSRGB(r), _linearToSRGB(g), _linearToSRGB(b), 1.0)); + } else { + image.setPixel( + x, + y, + img.ColorUint8(4) + ..setRgba((r * 255).toInt(), (g * 255).toInt(), (b * 255).toInt(), + 1.0)); + } } } @@ -163,7 +173,10 @@ int _linearToSRGB(double linearValue) { } } -Future createViewer() async { +Future createViewer( + {img.Color? bg, + Vector3? cameraPosition, + viewportDimensions = (width: 500, height: 500)}) async { final packageUri = findPackageRoot('thermion_dart'); final lib = ThermionDartTexture1(DynamicLibrary.open( @@ -192,5 +205,280 @@ Future createViewer() async { await viewer.updateViewportAndCameraProjection( viewportDimensions.width.toDouble(), viewportDimensions.height.toDouble()); + if (bg != null) { + await viewer.setBackgroundColor( + bg.r.toDouble(), bg.g.toDouble(), bg.b.toDouble(), bg.a.toDouble()); + } + + if (cameraPosition != null) { + await viewer.setCameraPosition( + cameraPosition.x, cameraPosition.y, cameraPosition.z); + } return viewer; } + +Uint8List poissonBlend(List textures, int width, int height) { + final int numTextures = textures.length; + final int size = width * height; + + // Initialize the result + List result = List.generate(size, (_) => Vector4(0, 0, 0, 0)); + List validPixel = List.generate(size, (_) => false); + + // Compute gradients and perform simplified Poisson blending + for (int y = 1; y < height - 1; y++) { + for (int x = 1; x < width - 1; x++) { + int index = y * width + x; + Vector4 gradX = Vector4(0, 0, 0, 0); + Vector4 gradY = Vector4(0, 0, 0, 0); + bool hasValidData = false; + + for (int t = 0; t < numTextures; t++) { + int i = index * 4; + if (textures[t][i] == 0 && + textures[t][i + 1] == 0 && + textures[t][i + 2] == 0 && + textures[t][i + 3] == 0) { + continue; // Skip this texture if the pixel is empty + } + + hasValidData = true; + int iLeft = (y * width + x - 1) * 4; + int iRight = (y * width + x + 1) * 4; + int iUp = ((y - 1) * width + x) * 4; + int iDown = ((y + 1) * width + x) * 4; + + Vector4 gx = Vector4( + (textures[t][iRight] - textures[t][iLeft]) / 2, + (textures[t][iRight + 1] - textures[t][iLeft + 1]) / 2, + (textures[t][iRight + 2] - textures[t][iLeft + 2]) / 2, + (textures[t][iRight + 3] - textures[t][iLeft + 3]) / 2); + + Vector4 gy = Vector4( + (textures[t][iDown] - textures[t][iUp]) / 2, + (textures[t][iDown + 1] - textures[t][iUp + 1]) / 2, + (textures[t][iDown + 2] - textures[t][iUp + 2]) / 2, + (textures[t][iDown + 3] - textures[t][iUp + 3]) / 2); + + // Select the gradient with larger magnitude + double magX = gx.r * gx.r + gx.g * gx.g + gx.b * gx.b + gx.a * gx.a; + double magY = gy.r * gy.r + gy.g * gy.g + gy.b * gy.b + gy.a * gy.a; + + if (magX > + gradX.r * gradX.r + + gradX.g * gradX.g + + gradX.b * gradX.b + + gradX.a * gradX.a) { + gradX = gx; + } + if (magY > + gradY.r * gradY.r + + gradY.g * gradY.g + + gradY.b * gradY.b + + gradY.a * gradY.a) { + gradY = gy; + } + } + + if (hasValidData) { + validPixel[index] = true; + // Simplified Poisson equation solver (Jacobi iteration) + result[index].r = (result[index - 1].r + + result[index + 1].r + + result[index - width].r + + result[index + width].r + + gradX.r - + gradY.r) / + 4; + result[index].g = (result[index - 1].g + + result[index + 1].g + + result[index - width].g + + result[index + width].g + + gradX.g - + gradY.g) / + 4; + result[index].b = (result[index - 1].b + + result[index + 1].b + + result[index - width].b + + result[index + width].b + + gradX.b - + gradY.b) / + 4; + result[index].a = (result[index - 1].a + + result[index + 1].a + + result[index - width].a + + result[index + width].a + + gradX.a - + gradY.a) / + 4; + } + } + } + + // Fill in gaps and normalize + Uint8List finalResult = Uint8List(size * 4); + for (int i = 0; i < size; i++) { + if (validPixel[i]) { + finalResult[i * 4] = (result[i].r.clamp(0, 255)).toInt(); + finalResult[i * 4 + 1] = (result[i].g.clamp(0, 255)).toInt(); + finalResult[i * 4 + 2] = (result[i].b.clamp(0, 255)).toInt(); + finalResult[i * 4 + 3] = (result[i].a.clamp(0, 255)).toInt(); + } else { + // For invalid pixels, try to interpolate from neighbors + List validNeighbors = []; + if (i > width && validPixel[i - width]) validNeighbors.add(i - width); + if (i < size - width && validPixel[i + width]) + validNeighbors.add(i + width); + if (i % width > 0 && validPixel[i - 1]) validNeighbors.add(i - 1); + if (i % width < width - 1 && validPixel[i + 1]) validNeighbors.add(i + 1); + + if (validNeighbors.isNotEmpty) { + double r = 0, g = 0, b = 0, a = 0; + for (int neighbor in validNeighbors) { + r += result[neighbor].r; + g += result[neighbor].g; + b += result[neighbor].b; + a += result[neighbor].a; + } + finalResult[i * 4] = (r / validNeighbors.length).clamp(0, 255).toInt(); + finalResult[i * 4 + 1] = + (g / validNeighbors.length).clamp(0, 255).toInt(); + finalResult[i * 4 + 2] = + (b / validNeighbors.length).clamp(0, 255).toInt(); + finalResult[i * 4 + 3] = + (a / validNeighbors.length).clamp(0, 255).toInt(); + } else { + // If no valid neighbors, set to transparent black + finalResult[i * 4] = 0; + finalResult[i * 4 + 1] = 0; + finalResult[i * 4 + 2] = 0; + finalResult[i * 4 + 3] = 0; + } + } + } + + return finalResult; +} + +Uint8List medianImages(List images) { + if (images.isEmpty) { + return Uint8List(0); + } + + int imageSize = images[0].length; + Uint8List result = Uint8List(imageSize); + int numImages = images.length; + + for (int i = 0; i < imageSize; i++) { + List pixelValues = []; + for (int j = 0; j < numImages; j++) { + pixelValues.add(images[j][i]); + } + + pixelValues.sort(); + int medianIndex = numImages ~/ 2; + result[i] = pixelValues[medianIndex]; + } + + return result; +} + +Uint8List maxIntensityProjection( + List textures, int width, int height) { + final int numTextures = textures.length; + final int size = width * height; + + // Initialize the result with the first texture + Uint8List result = Uint8List.fromList(textures[0]); + + // Iterate through all textures and perform max intensity projection + for (int t = 1; t < numTextures; t++) { + for (int i = 0; i < size * 4; i += 4) { + // Calculate intensity (using luminance formula) + double intensityCurrent = + 0.299 * result[i] + 0.587 * result[i + 1] + 0.114 * result[i + 2]; + double intensityNew = 0.299 * textures[t][i] + + 0.587 * textures[t][i + 1] + + 0.114 * textures[t][i + 2]; + + // If the new texture has higher intensity, use its values + if (intensityNew > intensityCurrent) { + result[i] = textures[t][i]; // R + result[i + 1] = textures[t][i + 1]; // G + result[i + 2] = textures[t][i + 2]; // B + result[i + 3] = textures[t][i + 3]; // A + } + } + } + + return result; +} + +// Helper function to blend MIP result with Poisson blending +Uint8List blendMIPWithPoisson( + Uint8List mipResult, Uint8List poissonResult, double alpha) { + final int size = mipResult.length; + Uint8List blendedResult = Uint8List(size); + + for (int i = 0; i < size; i++) { + blendedResult[i] = (mipResult[i] * (1 - alpha) + poissonResult[i] * alpha) + .round() + .clamp(0, 255); + } + + return blendedResult; +} + +Uint8List pngToPixelBuffer(Uint8List pngData) { + // Decode the PNG image + final image = img.decodePng(pngData); + + if (image == null) { + throw Exception('Failed to decode PNG image'); + } + + // Create a buffer for the raw pixel data + final rawPixels = Uint8List(image.width * image.height * 4); + + // Convert the image to RGBA format + for (int y = 0; y < image.height; y++) { + for (int x = 0; x < image.width; x++) { + final pixel = image.getPixel(x, y); + final i = (y * image.width + x) * 4; + rawPixels[i] = pixel.r.toInt(); // Red + rawPixels[i + 1] = pixel.g.toInt(); // Green + rawPixels[i + 2] = pixel.b.toInt(); // Blue + rawPixels[i + 3] = pixel.a.toInt(); // Alpha + } + } + + return rawPixels; +} + +Uint8List medianBlending(List textures, int width, int height) { + final int numTextures = textures.length; + final int size = width * height; + + Uint8List result = Uint8List(size * 4); + + for (int i = 0; i < size; i++) { + List values = []; + for (int t = 0; t < numTextures; t++) { + if (textures[t][i * 4] != 0 || + textures[t][i * 4 + 1] != 0 || + textures[t][i * 4 + 2] != 0 || + textures[t][i * 4 + 3] != 0) { + values.addAll(textures[t].sublist(i * 4, i * 4 + 4)); + } + } + + if (values.isNotEmpty) { + values.sort(); + result[i] = values[values.length ~/ 2]; + } else { + result[i] = 0; // If no valid data, set to transparent + } + } + + return result; +} diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index 83985a5a..f35689ea 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'dart:math'; import 'dart:typed_data'; +import 'package:image/image.dart'; import 'package:thermion_dart/thermion_dart.dart'; import 'package:test/test.dart'; import 'package:animation_tools_dart/animation_tools_dart.dart'; @@ -14,6 +15,9 @@ import 'package:vector_math/vector_math_64.dart'; import 'helpers.dart'; +Color kWhite = ColorFloat32(4)..setRgba(1.0, 1.0, 1.0, 1.0); +Color kRed = ColorFloat32(4)..setRgba(1.0, 0.0, 0.0, 1.0); + void main() async { final packageUri = findPackageRoot('thermion_dart'); testDir = Directory("${packageUri.toFilePath()}/test").path; @@ -98,6 +102,27 @@ void main() async { print(frustum.plane5.normal); print(frustum.plane5.constant); }); + + test('set custom projection/culling matrix', () async { + var viewer = await createViewer(bg:kRed, cameraPosition:Vector3(0,0,4)); + var camera = await viewer.getMainCamera(); + final cube = await viewer.createGeometry(GeometryHelper.cube()); + + + // cube is visible when inside the frustum, cube is visible + var projectionMatrix = + makeOrthographicMatrix(-10.0, 10.0, -10.0, 10.0, 0.05, 10000); + await camera.setProjectionMatrixWithCulling( + projectionMatrix, 0.05, 10000); + await _capture(viewer, "camera_projection_culling_matrix_object_in_frustum"); + + // cube no longer visible when the far plane is moved closer to camera so cube is outside + projectionMatrix = + makeOrthographicMatrix(-10.0, 10.0, -10.0, 10.0, 0.05, 1); + await camera.setProjectionMatrixWithCulling( + projectionMatrix, 0.05, 1); + await _capture(viewer, "camera_projection_culling_matrix_object_outside_frustum"); + }); }); group('background', () { From 65e99b9212588539352630efd8256f5db675d082 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Mon, 23 Sep 2024 13:51:18 +0800 Subject: [PATCH 222/232] set clearOptions to true --- thermion_dart/native/src/FilamentViewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 83b3909e..09ee862e 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -151,7 +151,7 @@ namespace thermion_filament _renderer = _engine->createRenderer(); Renderer::ClearOptions clearOptions; - clearOptions.clear = false; + clearOptions.clear = true; _renderer->setClearOptions(clearOptions); _frameInterval = 1000.0f / 60.0f; From 3ea4062e332e112191881d42ce8c65be90fcae5c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 24 Sep 2024 14:20:14 +0800 Subject: [PATCH 223/232] normalize direction in addLight --- .../lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart index 8eb359fc..25f173c5 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart @@ -384,7 +384,7 @@ class ThermionViewerFFI extends ThermionViewer { color: colour, intensity: intensity, position: Vector3(posX, posY, posZ), - direction: Vector3(dirX, dirY, dirZ), + direction: Vector3(dirX, dirY, dirZ)..normalize(), falloffRadius: falloffRadius, spotLightConeInner: spotLightConeInner, spotLightConeOuter: spotLightConeOuter, From c67d1cbbc45963fb7028f772be5a08b5b7c7e96d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 24 Sep 2024 14:20:33 +0800 Subject: [PATCH 224/232] add background color tests --- thermion_dart/test/integration_test.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index f35689ea..511316f6 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -129,7 +129,14 @@ void main() async { test('set background color to solid green', () async { var viewer = await createViewer(); await viewer.setBackgroundColor(0.0, 1.0, 0.0, 1.0); - await _capture(viewer, "bgcolor"); + await _capture(viewer, "set_background_color_to_solid_green"); + await viewer.dispose(); + }); + + test('set background color to full transparency', () async { + var viewer = await createViewer(); + await viewer.setBackgroundColor(0.0, 1.0, 0.0, 0.0); + await _capture(viewer, "set_background_color_to_transparent_green"); await viewer.dispose(); }); From 8db725d8bd2b3d5ad7d99cc78d79f31e5534398d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 24 Sep 2024 14:20:49 +0800 Subject: [PATCH 225/232] add PICK_ENTITY to GestureAction --- .../widgets/camera/gestures/thermion_gesture_handler.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart index 454e9846..867921f1 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/thermion_gesture_handler.dart @@ -26,6 +26,7 @@ enum GestureAction { ZOOM_CAMERA, TRANSLATE_ENTITY, ROTATE_ENTITY, + PICK_ENTITY, NONE } From c52b0084cef078476a44e62b5b7687c9c1558a24 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 24 Sep 2024 14:21:13 +0800 Subject: [PATCH 226/232] add PickDelegate to DelegateGestureHandler --- .../gestures/v2/delegate_gesture_handler.dart | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart index 8e898e3a..95d75444 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart @@ -3,7 +3,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; import 'package:logging/logging.dart'; -import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_keyboard_camera_flight_delegate.dart'; +import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_pick_delegate.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_velocity_delegate.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart'; @@ -17,9 +17,9 @@ class DelegateGestureHandler implements ThermionGestureHandler { CameraDelegate? cameraDelegate; VelocityDelegate? velocityDelegate; + PickDelegate? pickDelegate; Ticker? _ticker; - static const _updateInterval = Duration(milliseconds: 16); Map _accumulatedDeltas = {}; double _accumulatedScrollDelta = 0.0; @@ -39,10 +39,10 @@ class DelegateGestureHandler implements ThermionGestureHandler { required this.viewer, required this.cameraDelegate, required this.velocityDelegate, + this.pickDelegate, Map? actions, }) { _initializeKeyboardListener(); - _initializeTicker(); if (actions != null) { _actions.addAll(actions); } @@ -52,19 +52,25 @@ class DelegateGestureHandler implements ThermionGestureHandler { factory DelegateGestureHandler.fixedOrbit(ThermionViewer viewer, {double? Function(Vector3)? getDistanceToTarget, double rotationSensitivity = 0.001, - double zoomSensitivity = 0.001}) => + double zoomSensitivity = 0.001, + double baseAnglePerMeterNumerator = 10000, + PickDelegate? pickDelegate}) => DelegateGestureHandler( viewer: viewer, + pickDelegate: pickDelegate, cameraDelegate: FixedOrbitRotateCameraDelegate(viewer, getDistanceToTarget: getDistanceToTarget, rotationSensitivity: rotationSensitivity, + baseAnglePerMeterNumerator: baseAnglePerMeterNumerator, zoomSensitivity: zoomSensitivity), velocityDelegate: DefaultVelocityDelegate(), ); - factory DelegateGestureHandler.flight(ThermionViewer viewer) => + factory DelegateGestureHandler.flight(ThermionViewer viewer, + {PickDelegate? pickDelegate}) => DelegateGestureHandler( viewer: viewer, + pickDelegate: pickDelegate, cameraDelegate: FreeFlightCameraDelegate(viewer), velocityDelegate: DefaultVelocityDelegate(), actions: {GestureType.POINTER_MOVE: GestureAction.ROTATE_CAMERA}, @@ -76,15 +82,6 @@ class DelegateGestureHandler implements ThermionGestureHandler { } } - void _initializeTicker() { - _ticker = Ticker(_onTick); - _ticker!.start(); - } - - void _onTick(Duration elapsed) async { - await _applyAccumulatedUpdates(); - } - Future _applyAccumulatedUpdates() async { for (var gestureType in GestureType.values) { Offset delta = _accumulatedDeltas[gestureType] ?? Offset.zero; @@ -126,6 +123,16 @@ class DelegateGestureHandler implements ThermionGestureHandler { if (buttons & kMiddleMouseButton != 0) { _isMiddleMouseButtonPressed = true; } + if (buttons & kPrimaryButton != 0) { + final action = _actions[GestureType.LMB_DOWN]; + switch (action) { + case GestureAction.PICK_ENTITY: + pickDelegate?.pick(localPosition); + default: + // noop + } + } + await _applyAccumulatedUpdates(); } @override @@ -142,6 +149,7 @@ class DelegateGestureHandler implements ThermionGestureHandler { _accumulatedDeltas[gestureType] = (_accumulatedDeltas[gestureType] ?? Offset.zero) + delta; } + await _applyAccumulatedUpdates(); } @override @@ -156,10 +164,12 @@ class DelegateGestureHandler implements ThermionGestureHandler { } GestureType _getGestureTypeFromButtons(int buttons) { - if (buttons & kPrimaryMouseButton != 0) + if (buttons & kPrimaryMouseButton != 0) { return GestureType.LMB_HOLD_AND_MOVE; - if (buttons & kMiddleMouseButton != 0 || _isMiddleMouseButtonPressed) + } + if (buttons & kMiddleMouseButton != 0 || _isMiddleMouseButtonPressed) { return GestureType.MMB_HOLD_AND_MOVE; + } return GestureType.POINTER_MOVE; } @@ -209,6 +219,7 @@ class DelegateGestureHandler implements ThermionGestureHandler { _actions[gestureType] = gestureAction; } + @override GestureAction? getActionForType(GestureType gestureType) { return _actions[gestureType]; } From 4b1d8ce729208f789e944d3b9aeb5d6a3ed38ed2 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 24 Sep 2024 14:24:29 +0800 Subject: [PATCH 227/232] (flutter) update FreeFlight camera delegate --- .../v2/free_flight_camera_delegate.dart | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart index 2a97290f..3ae4512c 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/free_flight_camera_delegate.dart @@ -9,7 +9,7 @@ import 'package:vector_math/vector_math_64.dart'; class FreeFlightCameraDelegate implements CameraDelegate { final ThermionViewer viewer; - final bool lockRoll; + final Vector3? minBounds; final Vector3? maxBounds; @@ -34,8 +34,6 @@ class FreeFlightCameraDelegate implements CameraDelegate { FreeFlightCameraDelegate( this.viewer, { - - this.lockRoll = false, this.minBounds, this.maxBounds, this.rotationSensitivity = 0.001, @@ -81,7 +79,7 @@ class FreeFlightCameraDelegate implements CameraDelegate { Quaternion pitchRotation = Quaternion.axisAngle(_right, -deltaY); Quaternion rollRotation = Quaternion.axisAngle(_forward, deltaZ); - currentRotation = currentRotation * yawRotation * pitchRotation * rollRotation; + currentRotation = currentRotation * rollRotation * pitchRotation * yawRotation ; currentRotation.normalize(); _accumulatedRotation = Offset.zero; @@ -164,14 +162,18 @@ class FreeFlightCameraDelegate implements CameraDelegate { Future _processKeyboardInput() async { double dx = 0, dy = 0, dz = 0; - if (_pressedKeys[PhysicalKeyboardKey.keyW] == true) + if (_pressedKeys[PhysicalKeyboardKey.keyW] == true) { dz += keyMoveSensitivity; - if (_pressedKeys[PhysicalKeyboardKey.keyS] == true) + } + if (_pressedKeys[PhysicalKeyboardKey.keyS] == true) { dz -= keyMoveSensitivity; - if (_pressedKeys[PhysicalKeyboardKey.keyA] == true) + } + if (_pressedKeys[PhysicalKeyboardKey.keyA] == true) { dx -= keyMoveSensitivity; - if (_pressedKeys[PhysicalKeyboardKey.keyD] == true) + } + if (_pressedKeys[PhysicalKeyboardKey.keyD] == true) { dx += keyMoveSensitivity; + } if (dx != 0 || dy != 0 || dz != 0) { await _moveCamera(dx, dy, dz); From 85d6946645a2f52f583c513264699266008e4db8 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 25 Sep 2024 19:26:19 +0800 Subject: [PATCH 228/232] (flutter) provide nicer implementation of FixedOrbitCameraRotationDelegate --- .../gestures/v2/delegate_gesture_handler.dart | 12 +- .../fixed_orbit_camera_rotation_delegate.dart | 158 +++++++++--------- 2 files changed, 86 insertions(+), 84 deletions(-) diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart index 95d75444..dcd7f15f 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/delegate_gesture_handler.dart @@ -50,20 +50,17 @@ class DelegateGestureHandler implements ThermionGestureHandler { } factory DelegateGestureHandler.fixedOrbit(ThermionViewer viewer, - {double? Function(Vector3)? getDistanceToTarget, - double rotationSensitivity = 0.001, - double zoomSensitivity = 0.001, - double baseAnglePerMeterNumerator = 10000, + {double minimumDistance = 10.0, + double? Function(Vector3)? getDistanceToTarget, PickDelegate? pickDelegate}) => DelegateGestureHandler( viewer: viewer, pickDelegate: pickDelegate, cameraDelegate: FixedOrbitRotateCameraDelegate(viewer, getDistanceToTarget: getDistanceToTarget, - rotationSensitivity: rotationSensitivity, - baseAnglePerMeterNumerator: baseAnglePerMeterNumerator, - zoomSensitivity: zoomSensitivity), + minimumDistance: minimumDistance), velocityDelegate: DefaultVelocityDelegate(), + actions: {GestureType.MMB_HOLD_AND_MOVE:GestureAction.ROTATE_CAMERA} ); factory DelegateGestureHandler.flight(ThermionViewer viewer, @@ -193,6 +190,7 @@ class DelegateGestureHandler implements ThermionGestureHandler { } catch (e) { _logger.warning("Error during scroll accumulation: $e"); } + await _applyAccumulatedUpdates(); } @override diff --git a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart index 57675aec..76bcc717 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/v2/fixed_orbit_camera_rotation_delegate.dart @@ -1,48 +1,36 @@ import 'dart:async'; import 'dart:math'; -import 'dart:ui'; - -import 'package:flutter/src/services/keyboard_key.g.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/services.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; -import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/default_zoom_camera_delegate.dart'; import 'package:thermion_flutter/thermion/widgets/camera/gestures/v2/delegates.dart'; import 'package:vector_math/vector_math_64.dart'; +/// A camera delegate that rotates the camera around the origin. +/// Panning is not permitted; zooming is permitted (up to a minimum distance) +/// +/// The rotation sensitivity will be automatically adjusted so that +/// 100 horizontal pixels equates to a geodetic distance of 1m when the camera +/// is 1m from the surface (denoted by distanceToSurface). This scales to 10m +/// geodetic distance when the camera is 100m from the surface, 100m when the +/// camera is 1000m from the surface, and so on. +/// +/// class FixedOrbitRotateCameraDelegate implements CameraDelegate { final ThermionViewer viewer; - - double rotationSensitivity = 0.01; - - late DefaultZoomCameraDelegate _zoomCameraDelegate; + final double minimumDistance; + double? Function(Vector3)? getDistanceToTarget; Offset _accumulatedRotationDelta = Offset.zero; double _accumulatedZoomDelta = 0.0; static final _up = Vector3(0, 1, 0); - Timer? _updateTimer; - Vector3 _targetPosition = Vector3(0, 0, 0); - - double? Function(Vector3)? getDistanceToTarget; - - FixedOrbitRotateCameraDelegate(this.viewer, - {this.getDistanceToTarget, - double? rotationSensitivity, - double zoomSensitivity = 0.005}) { - _zoomCameraDelegate = DefaultZoomCameraDelegate(this.viewer, - zoomSensitivity: zoomSensitivity, - getDistanceToTarget: getDistanceToTarget); - this.rotationSensitivity = rotationSensitivity ?? 0.01; - _startUpdateTimer(); - } - - void _startUpdateTimer() { - _updateTimer = Timer.periodic(const Duration(milliseconds: 16), (_) { - _applyAccumulatedUpdates(); - }); - } + FixedOrbitRotateCameraDelegate( + this.viewer, { + this.getDistanceToTarget, + this.minimumDistance = 10.0, + }); void dispose() { _updateTimer?.cancel(); @@ -51,6 +39,7 @@ class FixedOrbitRotateCameraDelegate implements CameraDelegate { @override Future rotate(Offset delta, Vector2? velocity) async { _accumulatedRotationDelta += delta; + await _applyAccumulatedUpdates(); } @override @@ -60,11 +49,8 @@ class FixedOrbitRotateCameraDelegate implements CameraDelegate { @override Future zoom(double yScrollDeltaInPixels, Vector2? velocity) async { - if (yScrollDeltaInPixels > 1) { - _accumulatedZoomDelta++; - } else { - _accumulatedZoomDelta--; - } + _accumulatedZoomDelta += yScrollDeltaInPixels > 0 ? 1 : -1; + await _applyAccumulatedUpdates(); } Future _applyAccumulatedUpdates() async { @@ -73,64 +59,82 @@ class FixedOrbitRotateCameraDelegate implements CameraDelegate { return; } + var viewMatrix = await viewer.getCameraViewMatrix(); var modelMatrix = await viewer.getCameraModelMatrix(); - Vector3 cameraPosition = modelMatrix.getTranslation(); + var projectionMatrix = await viewer.getCameraProjectionMatrix(); + var inverseProjectionMatrix = projectionMatrix.clone()..invert(); + Vector3 currentPosition = modelMatrix.getTranslation(); - final heightAboveSurface = getDistanceToTarget?.call(cameraPosition) ?? 1.0; + Vector3 forward = -currentPosition.normalized(); + Vector3 right = _up.cross(forward).normalized(); + Vector3 up = forward.cross(right); - final sphereRadius = cameraPosition.length - heightAboveSurface; - - // Apply rotation - if (_accumulatedRotationDelta.distanceSquared > 0) { - // Calculate the distance factor - final distanceFactor = sqrt((heightAboveSurface / sphereRadius) + 1); - - // Adjust the base angle per meter - final baseAnglePerMeter = 10000 / sphereRadius; - final adjustedAnglePerMeter = baseAnglePerMeter * distanceFactor; - - final metersOnSurface = _accumulatedRotationDelta; - final rotationX = metersOnSurface.dy * adjustedAnglePerMeter; - final rotationY = metersOnSurface.dx * adjustedAnglePerMeter; - - Matrix4 rotation = Matrix4.rotationX(rotationX)..rotateY(rotationY); - Vector3 newPos = rotation.getRotation() * cameraPosition; - cameraPosition = newPos; + // first, we find the point in the sphere that intersects with the camera + // forward vector + double radius = 0.0; + double? distanceToTarget = getDistanceToTarget?.call(currentPosition); + if (distanceToTarget != null) { + radius = currentPosition.length - distanceToTarget; + } else { + radius = 1.0; } + Vector3 intersection = (-forward).scaled(radius); - // Normalize the position to maintain constant distance from center - cameraPosition = - cameraPosition.normalized() * (sphereRadius + heightAboveSurface); + // next, calculate the depth value at that intersection point + final intersectionInViewSpace = viewMatrix * + Vector4(intersection.x, intersection.y, intersection.z, 1.0); + final intersectionInClipSpace = projectionMatrix * intersectionInViewSpace; + final intersectionInNdcSpace = + intersectionInClipSpace / intersectionInClipSpace.w; - // Apply zoom (modified to ensure minimum 10m distance) + // using that depth value, find the world space position of the mouse + // note we flip the signs of the X and Y values + + final ndcX = 2 * + ((-_accumulatedRotationDelta.dx * viewer.pixelRatio) / + viewer.viewportDimensions.$1); + final ndcY = 2 * + ((_accumulatedRotationDelta.dy * viewer.pixelRatio) / + viewer.viewportDimensions.$2); + final ndc = Vector4(ndcX, ndcY, intersectionInNdcSpace.z, 1.0); + + var clipSpace = Vector4( + ndc.x * intersectionInClipSpace.w, + ndcY * intersectionInClipSpace.w, + ndc.z * intersectionInClipSpace.w, + intersectionInClipSpace.w); + Vector4 cameraSpace = inverseProjectionMatrix * clipSpace; + Vector4 worldSpace = modelMatrix * cameraSpace; + + // the new camera world space position will be that position, + // scaled to the camera's current distance + var worldSpace3 = worldSpace.xyz.normalized() * currentPosition.length; + currentPosition = worldSpace3; + + // Apply zoom if (_accumulatedZoomDelta != 0.0) { - var zoomFactor = -0.5 * _accumulatedZoomDelta; - - double newHeight = heightAboveSurface * (1 - zoomFactor); - newHeight = newHeight.clamp( - 10.0, double.infinity); // Prevent getting closer than 10m to surface - cameraPosition = cameraPosition.normalized() * (sphereRadius + newHeight); - + // double zoomFactor = 1.0 + (); + Vector3 toSurface = currentPosition - intersection; + currentPosition = currentPosition + toSurface.scaled(_accumulatedZoomDelta * 0.1); _accumulatedZoomDelta = 0.0; } - // Ensure minimum 10m distance even after rotation - final currentHeight = cameraPosition.length - sphereRadius; - if (currentHeight < 10.0) { - cameraPosition = cameraPosition.normalized() * (sphereRadius + 10.0); + // Ensure minimum distance + if (currentPosition.length < radius + minimumDistance) { + currentPosition = + (currentPosition.normalized() * (radius + minimumDistance)); } - // Calculate view matrix (unchanged) - Vector3 forward = cameraPosition.normalized(); - Vector3 up = Vector3(0, 1, 0); - final right = up.cross(forward)..normalize(); + // Calculate view matrix + forward = -currentPosition.normalized(); + right = _up.cross(forward).normalized(); up = forward.cross(right); - Matrix4 viewMatrix = makeViewMatrix(cameraPosition, Vector3.zero(), up); - viewMatrix.invert(); + Matrix4 newViewMatrix = makeViewMatrix(currentPosition, Vector3.zero(), up); + newViewMatrix.invert(); // Set the camera model matrix - await viewer.setCameraModelMatrix4(viewMatrix); + await viewer.setCameraModelMatrix4(newViewMatrix); _accumulatedRotationDelta = Offset.zero; } From 4dabca91604b0cccf8531fb56a7e56afc64506b1 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 25 Sep 2024 19:26:51 +0800 Subject: [PATCH 229/232] rename Android package/paths --- .../filament => dev/thermion/android}/FilamentInterop.kt | 2 +- .../filament => dev/thermion/android}/HotReloadPathHelper.kt | 0 .../filament => dev/thermion/android}/ThermionFlutterPlugin.kt | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename thermion_flutter/thermion_flutter/android/src/main/kotlin/{app/polyvox/filament => dev/thermion/android}/FilamentInterop.kt (97%) rename thermion_flutter/thermion_flutter/android/src/main/kotlin/{app/polyvox/filament => dev/thermion/android}/HotReloadPathHelper.kt (100%) rename thermion_flutter/thermion_flutter/android/src/main/kotlin/{app/polyvox/filament => dev/thermion/android}/ThermionFlutterPlugin.kt (99%) diff --git a/thermion_flutter/thermion_flutter/android/src/main/kotlin/app/polyvox/filament/FilamentInterop.kt b/thermion_flutter/thermion_flutter/android/src/main/kotlin/dev/thermion/android/FilamentInterop.kt similarity index 97% rename from thermion_flutter/thermion_flutter/android/src/main/kotlin/app/polyvox/filament/FilamentInterop.kt rename to thermion_flutter/thermion_flutter/android/src/main/kotlin/dev/thermion/android/FilamentInterop.kt index 8430b593..044f039d 100644 --- a/thermion_flutter/thermion_flutter/android/src/main/kotlin/app/polyvox/filament/FilamentInterop.kt +++ b/thermion_flutter/thermion_flutter/android/src/main/kotlin/dev/thermion/android/FilamentInterop.kt @@ -1,4 +1,4 @@ -package app.polyvox.filament +package dev.thermion.android import com.sun.jna.ptr.PointerByReference import com.sun.jna.ptr.IntByReference diff --git a/thermion_flutter/thermion_flutter/android/src/main/kotlin/app/polyvox/filament/HotReloadPathHelper.kt b/thermion_flutter/thermion_flutter/android/src/main/kotlin/dev/thermion/android/HotReloadPathHelper.kt similarity index 100% rename from thermion_flutter/thermion_flutter/android/src/main/kotlin/app/polyvox/filament/HotReloadPathHelper.kt rename to thermion_flutter/thermion_flutter/android/src/main/kotlin/dev/thermion/android/HotReloadPathHelper.kt diff --git a/thermion_flutter/thermion_flutter/android/src/main/kotlin/app/polyvox/filament/ThermionFlutterPlugin.kt b/thermion_flutter/thermion_flutter/android/src/main/kotlin/dev/thermion/android/ThermionFlutterPlugin.kt similarity index 99% rename from thermion_flutter/thermion_flutter/android/src/main/kotlin/app/polyvox/filament/ThermionFlutterPlugin.kt rename to thermion_flutter/thermion_flutter/android/src/main/kotlin/dev/thermion/android/ThermionFlutterPlugin.kt index ec922948..e039d05d 100644 --- a/thermion_flutter/thermion_flutter/android/src/main/kotlin/app/polyvox/filament/ThermionFlutterPlugin.kt +++ b/thermion_flutter/thermion_flutter/android/src/main/kotlin/dev/thermion/android/ThermionFlutterPlugin.kt @@ -1,4 +1,4 @@ -package app.polyvox.filament +package dev.thermion.android import HotReloadPathHelper From 61fdf300f49af11ab6e36ab969be6c64613e9139 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 25 Sep 2024 19:27:04 +0800 Subject: [PATCH 230/232] add namespace for AndroidManifest.xml --- .../thermion_flutter/android/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_flutter/thermion_flutter/android/src/main/AndroidManifest.xml b/thermion_flutter/thermion_flutter/android/src/main/AndroidManifest.xml index e3327c11..399379b9 100644 --- a/thermion_flutter/thermion_flutter/android/src/main/AndroidManifest.xml +++ b/thermion_flutter/thermion_flutter/android/src/main/AndroidManifest.xml @@ -1,3 +1,3 @@ + package="dev.thermion.android"> From d442ab5ce62b419ac46bcd38ccade0666ae8ce70 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 25 Sep 2024 19:27:19 +0800 Subject: [PATCH 231/232] add namespace for build.gradle --- thermion_flutter/thermion_flutter/android/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/thermion_flutter/thermion_flutter/android/build.gradle b/thermion_flutter/thermion_flutter/android/build.gradle index c456547c..8563c70f 100644 --- a/thermion_flutter/thermion_flutter/android/build.gradle +++ b/thermion_flutter/thermion_flutter/android/build.gradle @@ -1,4 +1,4 @@ -group 'app.polyvox.filament' +group 'dev.thermion.android' version '1.0-SNAPSHOT' buildscript { @@ -25,6 +25,7 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { + namespace 'dev.thermion.android' compileSdkVersion 33 ndkVersion '25.2.9519653' compileOptions { From b720c1294f4756bab8fe60ced51b7ad5ae963b53 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 25 Sep 2024 19:27:38 +0800 Subject: [PATCH 232/232] rename Android plugin class in pubspec.yaml --- thermion_flutter/thermion_flutter/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thermion_flutter/thermion_flutter/pubspec.yaml b/thermion_flutter/thermion_flutter/pubspec.yaml index 737bbdcb..cedf8501 100644 --- a/thermion_flutter/thermion_flutter/pubspec.yaml +++ b/thermion_flutter/thermion_flutter/pubspec.yaml @@ -33,7 +33,7 @@ flutter: platforms: android: pluginClass: ThermionFlutterPlugin - package: app.polyvox.filament + package: dev.thermion.android ios: pluginClass: SwiftThermionFlutterPlugin macos: